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