]> granicus.if.org Git - postgresql/commitdiff
Clean up pg_dump coredumps caused by change of output formatting for
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 16 Jan 2000 03:54:58 +0000 (03:54 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 16 Jan 2000 03:54:58 +0000 (03:54 +0000)
oidvector/int2vector.  pg_dump code was assuming that it would see
exactly FUNC_MAX_ARGS integers in the string returned by the backend.
That's no longer true.  (Perhaps that change wasn't such a good idea
after all --- will it break any other applications??)

src/bin/pg_dump/common.c
src/bin/pg_dump/pg_dump.c
src/bin/pg_dump/pg_dump.h

index 299943f4856d090936add4b6e94d5d2458513395..9089062c58e99f4ee1c12205b1f0f2c1591f4512 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/bin/pg_dump/common.c,v 1.36 1999/12/27 15:42:43 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/bin/pg_dump/common.c,v 1.37 2000/01/16 03:54:58 tgl Exp $
  *
  * Modifications - 6/12/96 - dave@bensoft.com - version 1.13.dhb.2
  *
@@ -156,13 +156,12 @@ findParentsByOid(TableInfo *tblinfo, int numTables,
 }
 
 /*
- * parseArgTypes
- *       parse a string of eight numbers delimited by spaces
- * into a character array
+ * parseNumericArray
+ *       parse a string of numbers delimited by spaces into a character array
  */
 
 void
-parseArgTypes(char **argtypes, const char *str)
+parseNumericArray(const char *str, char **array, int arraysize)
 {
        int                     j,
                                argNum;
@@ -171,28 +170,37 @@ parseArgTypes(char **argtypes, const char *str)
 
        argNum = 0;
        j = 0;
-       while ((s = *str) != '\0')
+       for (;;)
        {
-               if (s == ' ')
+               s = *str++;
+               if (s == ' ' || s == '\0')
                {
-                       temp[j] = '\0';
-                       argtypes[argNum] = strdup(temp);
-                       argNum++;
-                       j = 0;
+                       if (j > 0)
+                       {
+                               if (argNum >= arraysize)
+                               {
+                                       fprintf(stderr, "parseNumericArray: too many numbers\n");
+                                       exit(2);
+                               }
+                               temp[j] = '\0';
+                               array[argNum++] = strdup(temp);
+                               j = 0;
+                       }
+                       if (s == '\0')
+                               break;
                }
                else
                {
-                       temp[j] = s;
-                       j++;
+                       if (!isdigit(s) || j >= sizeof(temp)-1)
+                       {
+                               fprintf(stderr, "parseNumericArray: bogus number\n");
+                               exit(2);
+                       }
+                       temp[j++] = s;
                }
-               str++;
        }
-       if (j != 0)
-       {
-               temp[j] = '\0';
-               argtypes[argNum] = strdup(temp);
-       }
-
+       while (argNum < arraysize)
+               array[argNum++] = strdup("0");
 }
 
 
index 60ed1e8704050ed60fc51b0fd9bb3e9233ff81b0..c7bf1e3e945aa00ed620ff5065e6ee3f3058a1bb 100644 (file)
@@ -21,7 +21,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.131 2000/01/10 17:14:40 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.132 2000/01/16 03:54:58 tgl Exp $
  *
  * Modifications - 6/10/96 - dave@bensoft.com - version 1.13.dhb
  *
@@ -1387,6 +1387,8 @@ getFuncs(int *numFuncs)
 
        finfo = (FuncInfo *) malloc(ntups * sizeof(FuncInfo));
 
+       memset((char *) finfo, 0, ntups * sizeof(FuncInfo));
+
        i_oid = PQfnumber(res, "oid");
        i_proname = PQfnumber(res, "proname");
        i_prolang = PQfnumber(res, "prolang");
@@ -1410,11 +1412,16 @@ getFuncs(int *numFuncs)
                finfo[i].retset = (strcmp(PQgetvalue(res, i, i_proretset), "t") == 0);
                finfo[i].nargs = atoi(PQgetvalue(res, i, i_pronargs));
                finfo[i].lang = atoi(PQgetvalue(res, i, i_prolang));
-
                finfo[i].usename = strdup(PQgetvalue(res, i, i_usename));
-
-               parseArgTypes(finfo[i].argtypes, PQgetvalue(res, i, i_proargtypes));
-
+               if (finfo[i].nargs < 0 || finfo[i].nargs > FUNC_MAX_ARGS)
+               {
+                       fprintf(stderr, "failed sanity check: %s has %d args\n",
+                                       finfo[i].proname, finfo[i].nargs);
+                       exit(2);
+               }
+               parseNumericArray(PQgetvalue(res, i, i_proargtypes),
+                                                 finfo[i].argtypes,
+                                                 finfo[i].nargs);
                finfo[i].dumped = 0;
        }
 
@@ -2045,6 +2052,8 @@ getIndices(int *numIndices)
 
        indinfo = (IndInfo *) malloc(ntups * sizeof(IndInfo));
 
+       memset((char *) indinfo, 0, ntups * sizeof(IndInfo));
+
        i_indexrelname = PQfnumber(res, "indexrelname");
        i_indrelname = PQfnumber(res, "indrelname");
        i_indamname = PQfnumber(res, "indamname");
@@ -2059,10 +2068,12 @@ getIndices(int *numIndices)
                indinfo[i].indrelname = strdup(PQgetvalue(res, i, i_indrelname));
                indinfo[i].indamname = strdup(PQgetvalue(res, i, i_indamname));
                indinfo[i].indproc = strdup(PQgetvalue(res, i, i_indproc));
-               parseArgTypes((char **) indinfo[i].indkey,
-                                         (const char *) PQgetvalue(res, i, i_indkey));
-               parseArgTypes((char **) indinfo[i].indclass,
-                                         (const char *) PQgetvalue(res, i, i_indclass));
+               parseNumericArray(PQgetvalue(res, i, i_indkey),
+                                                 indinfo[i].indkey,
+                                                 INDEX_MAX_KEYS);
+               parseNumericArray(PQgetvalue(res, i, i_indclass),
+                                                 indinfo[i].indclass,
+                                                 INDEX_MAX_KEYS);
                indinfo[i].indisunique = strdup(PQgetvalue(res, i, i_indisunique));
        }
        PQclear(res);
index cd06288500aaaeb242a03facd6a664863cc6ae11..80c6e4928cca8782f933e00fbe9d9f7fb8ac7fdd 100644 (file)
@@ -5,7 +5,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_dump.h,v 1.44 2000/01/10 17:14:40 momjian Exp $
+ * $Id: pg_dump.h,v 1.45 2000/01/16 03:54:58 tgl Exp $
  *
  * Modifications - 6/12/96 - dave@bensoft.com - version 1.13.dhb.2
  *
 #include "pqexpbuffer.h"
 #include "catalog/pg_index.h"
 
-/*
- * Very temporary hack --- remove this when all pg_dump's uses of it are gone!
- */
-#define MAX_QUERY_SIZE (BLCKSZ*2)
-
-
-/* The *Info data structures run-time C structures used to store
-   system catalog information */
+/* The data structures used to store system catalog information */
 
 typedef struct _typeInfo
 {
@@ -61,11 +54,9 @@ typedef struct _funcInfo
        char       *proowner;
        int                     lang;
        int                     nargs;
-       char       *argtypes[FUNC_MAX_ARGS];    /* should be derived from obj/fmgr.h
-                                                                * instead of hardwired */
+       char       *argtypes[FUNC_MAX_ARGS];
        char       *prorettype;
-       int                     retset;                 /* 1 if the function returns a set, 0
-                                                                * otherwise */
+       int                     retset;                 /* 1 if the function returns a set, else 0 */
        char       *prosrc;
        char       *probin;
        char       *usename;
@@ -198,7 +189,7 @@ extern int  findFuncByName(FuncInfo *finfo, int numFuncs, const char *name);
 extern int     findTableByName(TableInfo *tbinfo, int numTables, const char *relname);
 
 extern void check_conn_and_db(void);
-extern void parseArgTypes(char **argtypes, const char *str);
+extern void parseNumericArray(const char *str, char **array, int arraysize);
 
 /*
  * version specific routines