Attached is a patch (against 7.3.4) to check the return values of some
calls (malloc, realloc, etc.) for failed memory allocations in libpq.
--
Dave Allen
[EMAIL PROTECTED]
--- postgresql-7.3.4-orig/src/interfaces/libpq/fe-exec.c Wed Sep 4 13:31:47
2002
+++ postgresql-7.3.4/src/interfaces/libpq/fe-exec.c Wed Jul 30 16:04:20 2003
@@ -365,6 +365,8 @@
PGresult *result;
result = (PGresult *) malloc(sizeof(PGresult));
+ if (result == NULL)
+ return NULL;
result->xconn = conn; /* might be NULL */
result->ntups = 0;
@@ -966,8 +968,12 @@
if (pqGets(&conn->workBuffer, conn))
return;
if (conn->result == NULL)
+ {
conn->result =
PQmakeEmptyPGresult(conn,
PGRES_COMMAND_OK);
+ if (conn->result == NULL)
+ return;
+ }
strncpy(conn->result->cmdStatus,
conn->workBuffer.data,
CMDSTATUS_LEN);
conn->asyncStatus = PGASYNC_READY;
@@ -994,8 +1000,12 @@
DONOTICE(conn, noticeWorkspace);
}
if (conn->result == NULL)
+ {
conn->result =
PQmakeEmptyPGresult(conn,
PGRES_EMPTY_QUERY);
+ if (conn->result == NULL)
+ return;
+ }
conn->asyncStatus = PGASYNC_READY;
break;
case 'K': /* secret key data from the
backend */
@@ -1113,6 +1123,8 @@
int i;
result = PQmakeEmptyPGresult(conn, PGRES_TUPLES_OK);
+ if (result == NULL)
+ return EOF;
/* parseInput already read the 'T' label. */
/* the next two bytes are the number of fields */
@@ -1128,6 +1140,11 @@
{
result->attDescs = (PGresAttDesc *)
pqResultAlloc(result, nfields * sizeof(PGresAttDesc), TRUE);
+ if (result->attDescs == NULL)
+ {
+ PQclear(result);
+ return EOF;
+ }
MemSet((char *) result->attDescs, 0, nfields * sizeof(PGresAttDesc));
}
@@ -1209,7 +1226,11 @@
nbytes = (nfields + BYTELEN - 1) / BYTELEN;
/* malloc() only for unusually large field counts... */
if (nbytes > sizeof(std_bitmap))
+ {
bitmap = (char *) malloc(nbytes);
+ if (bitmap == NULL)
+ goto outOfMemory;
+ }
if (pqGetnchar(bitmap, nbytes, conn))
goto EOFexit;
@@ -1525,6 +1546,9 @@
*/
newNotify = (PGnotify *) malloc(sizeof(PGnotify) +
strlen(conn->workBuffer.data) +1);
+ if (newNotify == NULL)
+ return EOF;
+
newNotify->relname = (char *) newNotify + sizeof(PGnotify);
strcpy(newNotify->relname, conn->workBuffer.data);
newNotify->be_pid = be_pid;
---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to [EMAIL PROTECTED] so that your
message can get through to the mailing list cleanly