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
unsignedchar * 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 = (unsignedchar * )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 = (unsignedchar * )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
+ gotoexit ;
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
+ gotoexit ;
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 ]= '-' ;