#include "libpq-int.h"
-static void do_field(const PQprintOpt *po, const PGresult *res,
+static bool do_field(const PQprintOpt *po, const PGresult *res,
const int i, const int j, const int fs_len,
char **fields,
const int nFields, const char **fieldNames,
unsigned char *fieldNotNum = NULL;
char *border = NULL;
char **fields = NULL;
- const char **fieldNames;
+ const char **fieldNames = NULL;
int fieldMaxLen = 0;
int numFieldName;
int fs_len = strlen(po->fieldSep);
int total_line_length = 0;
- int usePipe = 0;
+ bool usePipe = false;
char *pagerenv;
#if defined(ENABLE_THREAD_SAFETY) && !defined(WIN32)
#endif
nTups = PQntuples(res);
- if (!(fieldNames = (const char **) calloc(nFields, sizeof(char *))))
+ fieldNames = (const char **) calloc(nFields, sizeof(char *));
+ fieldNotNum = (unsigned char *) calloc(nFields, 1);
+ fieldMax = (int *) calloc(nFields, sizeof(int));
+ if (!fieldNames || !fieldNotNum || !fieldMax)
{
fprintf(stderr, libpq_gettext("out of memory\n"));
- abort();
- }
- if (!(fieldNotNum = (unsigned char *) calloc(nFields, 1)))
- {
- fprintf(stderr, libpq_gettext("out of memory\n"));
- abort();
- }
- if (!(fieldMax = (int *) calloc(nFields, sizeof(int))))
- {
- fprintf(stderr, libpq_gettext("out of memory\n"));
- abort();
+ goto exit;
}
for (numFieldName = 0;
po->fieldName && po->fieldName[numFieldName];
fout = popen(pagerenv, "w");
if (fout)
{
- usePipe = 1;
+ usePipe = true;
#ifndef WIN32
#ifdef ENABLE_THREAD_SAFETY
if (pq_block_sigpipe(&osigset, &sigpipe_pending) == 0)
if (!po->expanded && (po->align || po->html3))
{
- if (!(fields = (char **) calloc(nFields * (nTups + 1), sizeof(char *))))
+ fields = (char **) calloc((size_t) nTups + 1,
+ nFields * sizeof(char *));
+ if (!fields)
{
fprintf(stderr, libpq_gettext("out of memory\n"));
- abort();
+ goto exit;
}
}
else if (po->header && !po->html3)
fprintf(fout, libpq_gettext("-- RECORD %d --\n"), i);
}
for (j = 0; j < nFields; j++)
- do_field(po, res, i, j, fs_len, fields, nFields,
- fieldNames, fieldNotNum,
- fieldMax, fieldMaxLen, fout);
+ {
+ if (!do_field(po, res, i, j, fs_len, fields, nFields,
+ fieldNames, fieldNotNum,
+ fieldMax, fieldMaxLen, fout))
+ goto exit;
+ }
if (po->html3 && po->expanded)
fputs("</table>\n", fout);
}
for (i = 0; i < nTups; i++)
output_row(fout, po, nFields, fields,
fieldNotNum, fieldMax, border, i);
- free(fields);
- if (border)
- free(border);
}
if (po->header && !po->html3)
fprintf(fout, "(%d row%s)\n\n", PQntuples(res),
(PQntuples(res) == 1) ? "" : "s");
if (po->html3 && !po->expanded)
fputs("</table>\n", fout);
- free(fieldMax);
- free(fieldNotNum);
- free((void *) fieldNames);
+
+exit:
+ if (fieldMax)
+ free(fieldMax);
+ if (fieldNotNum)
+ free(fieldNotNum);
+ if (border)
+ free(border);
+ if (fields)
+ {
+ /* if calloc succeeded, this shouldn't overflow size_t */
+ size_t numfields = ((size_t) nTups + 1) * (size_t) nFields;
+
+ while (numfields-- > 0)
+ {
+ if (fields[numfields])
+ free(fields[numfields]);
+ }
+ free(fields);
+ }
+ if (fieldNames)
+ free((void *) fieldNames);
if (usePipe)
{
#ifdef WIN32
}
-static void
+static bool
do_field(const PQprintOpt *po, const PGresult *res,
const int i, const int j, const int fs_len,
char **fields,
if (!(fields[i * nFields + j] = (char *) malloc(plen + 1)))
{
fprintf(stderr, libpq_gettext("out of memory\n"));
- abort();
+ return false;
}
strcpy(fields[i * nFields + j], pval);
}
}
}
}
+ return true;
}
if (!border)
{
fprintf(stderr, libpq_gettext("out of memory\n"));
- abort();
+ return NULL;
}
p = border;
if (po->standard)
if (po->standard || field_index + 1 < nFields)
fputs(po->fieldSep, fout);
}
- if (p)
- free(p);
}
if (po->html3)
fputs("</tr>", fout);
if (!fLength)
{
fprintf(stderr, libpq_gettext("out of memory\n"));
- abort();
+ return;
}
for (j = 0; j < nFields; j++)
if (!tborder)
{
fprintf(stderr, libpq_gettext("out of memory\n"));
- abort();
+ return;
}
for (i = 0; i < width; i++)
tborder[i] = '-';