37
37
#include "libpq-int.h"
38
38
39
39
40
- static void do_field (const PQprintOpt * po , const PGresult * res ,
40
+ static bool do_field (const PQprintOpt * po , const PGresult * res ,
41
41
const int i , const int j , const int fs_len ,
42
42
char * * fields ,
43
43
const int nFields , const char * * fieldNames ,
@@ -80,12 +80,12 @@ PQprint(FILE *fout, const PGresult *res, const PQprintOpt *po)
80
80
unsigned char * fieldNotNum = NULL ;
81
81
char * border = NULL ;
82
82
char * * fields = NULL ;
83
- const char * * fieldNames ;
83
+ const char * * fieldNames = NULL ;
84
84
int fieldMaxLen = 0 ;
85
85
int numFieldName ;
86
86
int fs_len = strlen (po -> fieldSep );
87
87
int total_line_length = 0 ;
88
- int usePipe = 0 ;
88
+ bool usePipe = false ;
89
89
char * pagerenv ;
90
90
91
91
#if defined(ENABLE_THREAD_SAFETY ) && !defined(WIN32 )
@@ -108,20 +108,13 @@ PQprint(FILE *fout, const PGresult *res, const PQprintOpt *po)
108
108
#endif
109
109
110
110
nTups = PQntuples (res );
111
- if (!(fieldNames = (const char * * ) calloc (nFields , sizeof (char * ))))
111
+ fieldNames = (const char * * ) calloc (nFields , sizeof (char * ));
112
+ fieldNotNum = (unsigned char * ) calloc (nFields , 1 );
113
+ fieldMax = (int * ) calloc (nFields , sizeof (int ));
114
+ if (!fieldNames || !fieldNotNum || !fieldMax )
112
115
{
113
116
fprintf (stderr , libpq_gettext ("out of memory\n" ));
114
- abort ();
115
- }
116
- if (!(fieldNotNum = (unsigned char * ) calloc (nFields , 1 )))
117
- {
118
- fprintf (stderr , libpq_gettext ("out of memory\n" ));
119
- abort ();
120
- }
121
- if (!(fieldMax = (int * ) calloc (nFields , sizeof (int ))))
122
- {
123
- fprintf (stderr , libpq_gettext ("out of memory\n" ));
124
- abort ();
117
+ goto exit ;
125
118
}
126
119
for (numFieldName = 0 ;
127
120
po -> fieldName && po -> fieldName [numFieldName ];
@@ -190,7 +183,7 @@ PQprint(FILE *fout, const PGresult *res, const PQprintOpt *po)
190
183
fout = popen (pagerenv , "w" );
191
184
if (fout )
192
185
{
193
- usePipe = 1 ;
186
+ usePipe = true ;
194
187
#ifndef WIN32
195
188
#ifdef ENABLE_THREAD_SAFETY
196
189
if (pq_block_sigpipe (& osigset , & sigpipe_pending ) == 0 )
@@ -207,10 +200,12 @@ PQprint(FILE *fout, const PGresult *res, const PQprintOpt *po)
207
200
208
201
if (!po -> expanded && (po -> align || po -> html3 ))
209
202
{
210
- if (!(fields = (char * * ) calloc (nFields * (nTups + 1 ), sizeof (char * ))))
203
+ fields = (char * * ) calloc ((size_t ) nTups + 1 ,
204
+ nFields * sizeof (char * ));
205
+ if (!fields )
211
206
{
212
207
fprintf (stderr , libpq_gettext ("out of memory\n" ));
213
- abort () ;
208
+ goto exit ;
214
209
}
215
210
}
216
211
else if (po -> header && !po -> html3 )
@@ -264,9 +259,12 @@ PQprint(FILE *fout, const PGresult *res, const PQprintOpt *po)
264
259
fprintf (fout , libpq_gettext ("-- RECORD %d --\n" ), i );
265
260
}
266
261
for (j = 0 ; j < nFields ; j ++ )
267
- do_field (po , res , i , j , fs_len , fields , nFields ,
268
- fieldNames , fieldNotNum ,
269
- fieldMax , fieldMaxLen , fout );
262
+ {
263
+ if (!do_field (po , res , i , j , fs_len , fields , nFields ,
264
+ fieldNames , fieldNotNum ,
265
+ fieldMax , fieldMaxLen , fout ))
266
+ goto exit ;
267
+ }
270
268
if (po -> html3 && po -> expanded )
271
269
fputs ("</table>\n" , fout );
272
270
}
@@ -297,18 +295,34 @@ PQprint(FILE *fout, const PGresult *res, const PQprintOpt *po)
297
295
for (i = 0 ; i < nTups ; i ++ )
298
296
output_row (fout , po , nFields , fields ,
299
297
fieldNotNum , fieldMax , border , i );
300
- free (fields );
301
- if (border )
302
- free (border );
303
298
}
304
299
if (po -> header && !po -> html3 )
305
300
fprintf (fout , "(%d row%s)\n\n" , PQntuples (res ),
306
301
(PQntuples (res ) == 1 ) ? "" : "s" );
307
302
if (po -> html3 && !po -> expanded )
308
303
fputs ("</table>\n" , fout );
309
- free (fieldMax );
310
- free (fieldNotNum );
311
- free ((void * ) fieldNames );
304
+
305
+ exit :
306
+ if (fieldMax )
307
+ free (fieldMax );
308
+ if (fieldNotNum )
309
+ free (fieldNotNum );
310
+ if (border )
311
+ free (border );
312
+ if (fields )
313
+ {
314
+ /* if calloc succeeded, this shouldn't overflow size_t */
315
+ size_t numfields = ((size_t ) nTups + 1 ) * (size_t ) nFields ;
316
+
317
+ while (numfields -- > 0 )
318
+ {
319
+ if (fields [numfields ])
320
+ free (fields [numfields ]);
321
+ }
322
+ free (fields );
323
+ }
324
+ if (fieldNames )
325
+ free ((void * ) fieldNames );
312
326
if (usePipe )
313
327
{
314
328
#ifdef WIN32
@@ -329,7 +343,7 @@ PQprint(FILE *fout, const PGresult *res, const PQprintOpt *po)
329
343
}
330
344
331
345
332
- static void
346
+ static bool
333
347
do_field (const PQprintOpt * po , const PGresult * res ,
334
348
const int i , const int j , const int fs_len ,
335
349
char * * fields ,
@@ -397,7 +411,7 @@ do_field(const PQprintOpt *po, const PGresult *res,
397
411
if (!(fields [i * nFields + j ] = (char * ) malloc (plen + 1 )))
398
412
{
399
413
fprintf (stderr , libpq_gettext ("out of memory\n" ));
400
- abort () ;
414
+ return false ;
401
415
}
402
416
strcpy (fields [i * nFields + j ], pval );
403
417
}
@@ -440,6 +454,7 @@ do_field(const PQprintOpt *po, const PGresult *res,
440
454
}
441
455
}
442
456
}
457
+ return true;
443
458
}
444
459
445
460
@@ -467,7 +482,7 @@ do_header(FILE *fout, const PQprintOpt *po, const int nFields, int *fieldMax,
467
482
if (!border )
468
483
{
469
484
fprintf (stderr , libpq_gettext ("out of memory\n" ));
470
- abort () ;
485
+ return NULL ;
471
486
}
472
487
p = border ;
473
488
if (po -> standard )
@@ -558,8 +573,6 @@ output_row(FILE *fout, const PQprintOpt *po, const int nFields, char **fields,
558
573
if (po -> standard || field_index + 1 < nFields )
559
574
fputs (po -> fieldSep , fout );
560
575
}
561
- if (p )
562
- free (p );
563
576
}
564
577
if (po -> html3 )
565
578
fputs ("</tr>" , fout );
@@ -609,7 +622,7 @@ PQdisplayTuples(const PGresult *res,
609
622
if (!fLength )
610
623
{
611
624
fprintf (stderr , libpq_gettext ("out of memory\n" ));
612
- abort () ;
625
+ return ;
613
626
}
614
627
615
628
for (j = 0 ; j < nFields ; j ++ )
@@ -707,7 +720,7 @@ PQprintTuples(const PGresult *res,
707
720
if (!tborder )
708
721
{
709
722
fprintf (stderr , libpq_gettext ("out of memory\n" ));
710
- abort () ;
723
+ return ;
711
724
}
712
725
for (i = 0 ; i < width ; i ++ )
713
726
tborder [i ] = '-' ;
0 commit comments