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 ];
@@ -184,7 +177,7 @@ PQprint(FILE *fout, const PGresult *res, const PQprintOpt *po)
184
177
fout = popen (pagerenv , "w" );
185
178
if (fout )
186
179
{
187
- usePipe = 1 ;
180
+ usePipe = true ;
188
181
#ifndef WIN32
189
182
#ifdef ENABLE_THREAD_SAFETY
190
183
if (pq_block_sigpipe (& osigset , & sigpipe_pending ) == 0 )
@@ -201,10 +194,12 @@ PQprint(FILE *fout, const PGresult *res, const PQprintOpt *po)
201
194
202
195
if (!po -> expanded && (po -> align || po -> html3 ))
203
196
{
204
- if (!(fields = (char * * ) calloc (nFields * (nTups + 1 ), sizeof (char * ))))
197
+ fields = (char * * ) calloc ((size_t ) nTups + 1 ,
198
+ nFields * sizeof (char * ));
199
+ if (!fields )
205
200
{
206
201
fprintf (stderr , libpq_gettext ("out of memory\n" ));
207
- abort () ;
202
+ goto exit ;
208
203
}
209
204
}
210
205
else if (po -> header && !po -> html3 )
@@ -258,9 +253,12 @@ PQprint(FILE *fout, const PGresult *res, const PQprintOpt *po)
258
253
fprintf (fout , libpq_gettext ("-- RECORD %d --\n" ), i );
259
254
}
260
255
for (j = 0 ; j < nFields ; j ++ )
261
- do_field (po , res , i , j , fs_len , fields , nFields ,
262
- fieldNames , fieldNotNum ,
263
- fieldMax , fieldMaxLen , fout );
256
+ {
257
+ if (!do_field (po , res , i , j , fs_len , fields , nFields ,
258
+ fieldNames , fieldNotNum ,
259
+ fieldMax , fieldMaxLen , fout ))
260
+ goto exit ;
261
+ }
264
262
if (po -> html3 && po -> expanded )
265
263
fputs ("</table>\n" , fout );
266
264
}
@@ -291,16 +289,34 @@ PQprint(FILE *fout, const PGresult *res, const PQprintOpt *po)
291
289
for (i = 0 ; i < nTups ; i ++ )
292
290
output_row (fout , po , nFields , fields ,
293
291
fieldNotNum , fieldMax , border , i );
294
- free (fields );
295
- if (border )
296
- free (border );
297
292
}
298
293
if (po -> header && !po -> html3 )
299
294
fprintf (fout , "(%d row%s)\n\n" , PQntuples (res ),
300
295
(PQntuples (res ) == 1 ) ? "" : "s" );
301
- free (fieldMax );
302
- free (fieldNotNum );
303
- free ((void * ) fieldNames );
296
+ if (po -> html3 && !po -> expanded )
297
+ fputs ("</table>\n" , fout );
298
+
299
+ exit :
300
+ if (fieldMax )
301
+ free (fieldMax );
302
+ if (fieldNotNum )
303
+ free (fieldNotNum );
304
+ if (border )
305
+ free (border );
306
+ if (fields )
307
+ {
308
+ /* if calloc succeeded, this shouldn't overflow size_t */
309
+ size_t numfields = ((size_t ) nTups + 1 ) * (size_t ) nFields ;
310
+
311
+ while (numfields -- > 0 )
312
+ {
313
+ if (fields [numfields ])
314
+ free (fields [numfields ]);
315
+ }
316
+ free (fields );
317
+ }
318
+ if (fieldNames )
319
+ free ((void * ) fieldNames );
304
320
if (usePipe )
305
321
{
306
322
#ifdef WIN32
@@ -317,13 +333,11 @@ PQprint(FILE *fout, const PGresult *res, const PQprintOpt *po)
317
333
#endif /* ENABLE_THREAD_SAFETY */
318
334
#endif /* WIN32 */
319
335
}
320
- if (po -> html3 && !po -> expanded )
321
- fputs ("</table>\n" , fout );
322
336
}
323
337
}
324
338
325
339
326
- static void
340
+ static bool
327
341
do_field (const PQprintOpt * po , const PGresult * res ,
328
342
const int i , const int j , const int fs_len ,
329
343
char * * fields ,
@@ -391,7 +405,7 @@ do_field(const PQprintOpt *po, const PGresult *res,
391
405
if (!(fields [i * nFields + j ] = (char * ) malloc (plen + 1 )))
392
406
{
393
407
fprintf (stderr , libpq_gettext ("out of memory\n" ));
394
- abort () ;
408
+ return false ;
395
409
}
396
410
strcpy (fields [i * nFields + j ], pval );
397
411
}
@@ -434,6 +448,7 @@ do_field(const PQprintOpt *po, const PGresult *res,
434
448
}
435
449
}
436
450
}
451
+ return true;
437
452
}
438
453
439
454
@@ -461,7 +476,7 @@ do_header(FILE *fout, const PQprintOpt *po, const int nFields, int *fieldMax,
461
476
if (!border )
462
477
{
463
478
fprintf (stderr , libpq_gettext ("out of memory\n" ));
464
- abort () ;
479
+ return NULL ;
465
480
}
466
481
p = border ;
467
482
if (po -> standard )
@@ -552,8 +567,6 @@ output_row(FILE *fout, const PQprintOpt *po, const int nFields, char **fields,
552
567
if (po -> standard || field_index + 1 < nFields )
553
568
fputs (po -> fieldSep , fout );
554
569
}
555
- if (p )
556
- free (p );
557
570
}
558
571
if (po -> html3 )
559
572
fputs ("</tr>" , fout );
@@ -603,7 +616,7 @@ PQdisplayTuples(const PGresult *res,
603
616
if (!fLength )
604
617
{
605
618
fprintf (stderr , libpq_gettext ("out of memory\n" ));
606
- abort () ;
619
+ return ;
607
620
}
608
621
609
622
for (j = 0 ; j < nFields ; j ++ )
@@ -701,7 +714,7 @@ PQprintTuples(const PGresult *res,
701
714
if (!tborder )
702
715
{
703
716
fprintf (stderr , libpq_gettext ("out of memory\n" ));
704
- abort () ;
717
+ return ;
705
718
}
706
719
for (i = 0 ; i < width ; i ++ )
707
720
tborder [i ] = '-' ;
0 commit comments