OSDN Git Service

Fix pg_dump crashes caused by bogus use of va_start/va_end (only seen
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 23 Feb 2001 22:52:32 +0000 (22:52 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 23 Feb 2001 22:52:32 +0000 (22:52 +0000)
on some platforms, which is not too surprising considering how platform
specific these macros must be).

src/bin/pg_dump/pg_backup_archiver.c
src/bin/pg_dump/pg_backup_tar.c

index d50f82d..1b08b2c 100644 (file)
@@ -872,21 +872,21 @@ int archprintf(Archive* AH, const char *fmt, ...)
     int                bSize = strlen(fmt) + 256;
     int                cnt = -1;
 
-    va_start(ap, fmt);
-
     /* This is paranoid: deal with the possibility that vsnprintf is willing to ignore trailing null */
     /* or returns > 0 even if string does not fit. It may be the case that it returns cnt = bufsize */ 
-    while (cnt < 0 || cnt >= (bSize-1) ) {
-       if (p != NULL) free(p);
-       bSize *= 2;
-       if ((p = malloc(bSize)) == NULL)
+    while (cnt < 0 || cnt >= (bSize-1) )
        {
-           va_end(ap);
-           exit_horribly(AH, "%s: could not allocate buffer for archprintf\n", progname);
-       }
-       cnt = vsnprintf(p, bSize, fmt, ap);
+               if (p != NULL) free(p);
+               bSize *= 2;
+               p = (char*)malloc(bSize);
+               if (p == NULL)
+               {
+                       exit_horribly(AH, "%s: could not allocate buffer for archprintf\n", progname);
+               }
+               va_start(ap, fmt);
+               cnt = vsnprintf(p, bSize, fmt, ap);
+               va_end(ap);
     }
-    va_end(ap);
     WriteData(AH, p, cnt);
     free(p);
     return cnt;
@@ -977,21 +977,21 @@ int ahprintf(ArchiveHandle* AH, const char *fmt, ...)
     int                bSize = strlen(fmt) + 256; /* Should be enough */
     int                cnt = -1;
 
-    va_start(ap, fmt);
     /* This is paranoid: deal with the possibility that vsnprintf is willing to ignore trailing null */
     /* or returns > 0 even if string does not fit. It may be the case that it returns cnt = bufsize */ 
-    while (cnt < 0 || cnt >= (bSize - 1) ) {
+    while (cnt < 0 || cnt >= (bSize - 1) )
+       {
                if (p != NULL) free(p);
                bSize *= 2;
                p = (char*)malloc(bSize);
                if (p == NULL)
                {
-                       va_end(ap);
                        die_horribly(AH, "%s: could not allocate buffer for ahprintf\n", progname);
                }
+               va_start(ap, fmt);
                cnt = vsnprintf(p, bSize, fmt, ap);
+               va_end(ap);
     }
-    va_end(ap);
     ahwrite(p, 1, cnt, AH);
     free(p);
     return cnt;
index 87dada2..a24701a 100644 (file)
@@ -899,24 +899,22 @@ static int tarPrintf(ArchiveHandle *AH, TAR_MEMBER *th, const char *fmt, ...)
        int                     bSize = strlen(fmt) + 256; /* Should be enough */
        int                     cnt = -1;
 
-       va_start(ap, fmt);
        /* This is paranoid: deal with the possibility that vsnprintf is willing to ignore trailing null */
        /* or returns > 0 even if string does not fit. It may be the case that it returns cnt = bufsize */
-       while (cnt < 0 || cnt >= (bSize - 1) ) {
+       while (cnt < 0 || cnt >= (bSize - 1) )
+       {
                if (p != NULL) free(p);
                bSize *= 2;
                p = (char*)malloc(bSize);
                if (p == NULL)
                {
-                       va_end(ap);
-                       die_horribly(AH, "%s: could not allocate buffer for ahprintf\n", progname);
+                       die_horribly(AH, "%s: could not allocate buffer for tarPrintf\n", progname);
                }
+               va_start(ap, fmt);
                cnt = vsnprintf(p, bSize, fmt, ap);
+               va_end(ap);
        }
-       va_end(ap);
-
        cnt = tarWrite(p, cnt, th);
-
        free(p);
        return cnt;
 }