From: Tom Lane Date: Fri, 23 Feb 2001 22:52:32 +0000 (+0000) Subject: Fix pg_dump crashes caused by bogus use of va_start/va_end (only seen X-Git-Tag: REL7_1~298 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2b0f8ae0095575beead053d93266f30f6ffb7f14;p=postgresql Fix pg_dump crashes caused by bogus use of va_start/va_end (only seen on some platforms, which is not too surprising considering how platform specific these macros must be). --- diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c index d50f82df9e..1b08b2ce8b 100644 --- a/src/bin/pg_dump/pg_backup_archiver.c +++ b/src/bin/pg_dump/pg_backup_archiver.c @@ -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; diff --git a/src/bin/pg_dump/pg_backup_tar.c b/src/bin/pg_dump/pg_backup_tar.c index 87dada274d..a24701a37c 100644 --- a/src/bin/pg_dump/pg_backup_tar.c +++ b/src/bin/pg_dump/pg_backup_tar.c @@ -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; }