v4-0002-Fix-bug-in-TOC-file-error-message-printing.patch
application/octet-stream
Filename: v4-0002-Fix-bug-in-TOC-file-error-message-printing.patch
Type: application/octet-stream
Part: 0
Message:
Re: Unbounded %s in sscanf
Patch
Format: format-patch
Series: patch v4-0002
Subject: Fix bug in TOC file error message printing
| File | + | − |
|---|---|---|
| src/bin/pg_dump/pg_backup_directory.c | 7 | 7 |
From 2245092c32de86c77bac718d6a3a2f71b8a3f6c5 Mon Sep 17 00:00:00 2001
From: Daniel Gustafsson <daniel@yesql.se>
Date: Tue, 29 Jun 2021 09:46:09 +0200
Subject: [PATCH v4 2/2] 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:
./pg_restore -d foo -F d dump
pg_restore: error: invalid line in large object TOC file "dump/blobs.toc": ..
Fix by renaming the outer scope var which further highlights which
filename is stored in that variable.
Discussion: https://postgr.es/m/A2B151F5-B32B-4F2C-BA4A-6870856D9BDE@yesql.se
---
src/bin/pg_dump/pg_backup_directory.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/src/bin/pg_dump/pg_backup_directory.c b/src/bin/pg_dump/pg_backup_directory.c
index 57243c5971..7c8b86827a 100644
--- a/src/bin/pg_dump/pg_backup_directory.c
+++ b/src/bin/pg_dump/pg_backup_directory.c
@@ -433,18 +433,18 @@ _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)
fatal("could not open large object TOC file \"%s\" for input: %m",
- fname);
+ tocfname);
/* Read the blobs TOC file line-by-line, and process each blob */
while ((cfgets(ctx->blobsTocFH, line, MAXPGPATH)) != NULL)
@@ -455,7 +455,7 @@ _LoadBlobs(ArchiveHandle *AH)
/* Can't overflow because line and fname are the same length. */
if (sscanf(line, "%u %" CppAsString2(MAXPGPATH) "s\n", &oid, fname) != 2)
fatal("invalid line in large object TOC file \"%s\": \"%s\"",
- fname, line);
+ tocfname, line);
StartRestoreBlob(AH, oid, AH->public.ropt->dropSchema);
snprintf(path, MAXPGPATH, "%s/%s", ctx->directory, fname);
@@ -464,11 +464,11 @@ _LoadBlobs(ArchiveHandle *AH)
}
if (!cfeof(ctx->blobsTocFH))
fatal("error reading large object TOC file \"%s\"",
- fname);
+ tocfname);
if (cfclose(ctx->blobsTocFH) != 0)
fatal("could not close large object TOC file \"%s\": %m",
- fname);
+ tocfname);
ctx->blobsTocFH = NULL;
--
2.30.1 (Apple Git-130)