]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix bug in TOC file error message printing
authorDaniel Gustafsson <dgustafsson@postgresql.org>
Tue, 19 Oct 2021 10:59:54 +0000 (12:59 +0200)
committerDaniel Gustafsson <dgustafsson@postgresql.org>
Tue, 19 Oct 2021 10:59:54 +0000 (12:59 +0200)
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

index b4fd825a9c96737c4935045a7655e38a6626cef0..628cbbcc421b774bb0a701041e71af57259e11e4 100644 (file)
@@ -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;