postgres.git / summary / log / commit / refs

commit    ef1f15819a389dcb62daa3c60b7af56fbd5695e2
Author:   Daniel Gustafsson <dgustafsson@postgresql.org>
Date:     Tue Oct 19 10:59:54 2021 +0000
First released in: 15.0, 9.6.24, 10.19, 11.14, 12.9, 13.5, 14.1

    Fix bug in TOC file error message printing
    
    If the blob TOC file cannot be parsed, the error message was failing
    to print the filename as the variable holding it was shadowed by the
    destination buffer for parsing.  When the filename fails to parse,
    the error will print an empty string:
    
     ./pg_restore -d foo -F d dump
     pg_restore: error: invalid line in large object TOC file "": ..
    
    ..instead of the intended error message:
    
     ./pg_restore -d foo -F d dump
     pg_restore: error: invalid line in large object TOC file "dump/blobs.toc": ..
    
    Fix by renaming both variables as the shared name was too generic to
    store either and still convey what the variable held.
    
    Backpatch all the way down to 9.6.
    
    Reviewed-by: Tom Lane
    Discussion: https://postgr.es/m/A2B151F5-B32B-4F2C-BA4A-6870856D9BDE@yesql.se
    Backpatch-through: 9.6


src/bin/pg_dump/pg_backup_directory.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/bin/pg_dump/pg_backup_directory.c b/src/bin/pg_dump/pg_backup_directory.c index b4fd825a9c9..628cbbcc421 100644 --- a/src/bin/pg_dump/pg_backup_directory.c +++ b/src/bin/pg_dump/pg_backup_directory.c @@ -447,42 +447,42 @@ _LoadBlobs(ArchiveHandle *AH) { Oid oid; lclContext *ctx = (lclContext *) AH->formatData; - char fname[MAXPGPATH]; + char tocfname[MAXPGPATH]; char line[MAXPGPATH]; StartRestoreBlobs(AH); - setFilePath(AH, fname, "blobs.toc"); + setFilePath(AH, tocfname, "blobs.toc"); - ctx->blobsTocFH = cfopen_read(fname, PG_BINARY_R); + ctx->blobsTocFH = cfopen_read(tocfname, PG_BINARY_R); if (ctx->blobsTocFH == NULL) exit_horribly(modulename, "could not open large object TOC file \"%s\" for input: %s\n", - fname, strerror(errno)); + tocfname, strerror(errno)); /* Read the blobs TOC file line-by-line, and process each blob */ while ((cfgets(ctx->blobsTocFH, line, MAXPGPATH)) != NULL) { - char fname[MAXPGPATH + 1]; + char blobfname[MAXPGPATH + 1]; char path[MAXPGPATH]; - /* Can't overflow because line and fname are the same length. */ - if (sscanf(line, "%u %" CppAsString2(MAXPGPATH) "s\n", &oid, fname) != 2) + /* Can't overflow because line and blobfname are the same length. */ + if (sscanf(line, "%u %" CppAsString2(MAXPGPATH) "s\n", &oid, blobfname) != 2) exit_horribly(modulename, "invalid line in large object TOC file \"%s\": \"%s\"\n", - fname, line); + tocfname, line); StartRestoreBlob(AH, oid, AH->public.ropt->dropSchema); - snprintf(path, MAXPGPATH, "%s/%s", ctx->directory, fname); + snprintf(path, MAXPGPATH, "%s/%s", ctx->directory, blobfname); _PrintFileData(AH, path); EndRestoreBlob(AH, oid); } if (!cfeof(ctx->blobsTocFH)) exit_horribly(modulename, "error reading large object TOC file \"%s\"\n", - fname); + tocfname); if (cfclose(ctx->blobsTocFH) != 0) exit_horribly(modulename, "could not close large object TOC file \"%s\": %s\n", - fname, strerror(errno)); + tocfname, strerror(errno)); ctx->blobsTocFH = NULL; [parent: 6b96aafc67ac]