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

Reply via email to