mirror of
https://github.com/postgres/postgres.git
synced 2025-10-15 05:46:52 +03:00
Convert newlines to spaces in names written in v11+ pg_dump comments.
Maliciously-crafted object names could achieve SQL injection during restore. CVE-2012-0868 fixed this class of problem at the time, but later work reintroduced three cases. Commitbc8cd50fef
(back-patched to v11+ in 2023-05 releases) introduced the pg_dump case. Commit6cbdbd9e8d
(v12+) introduced the two pg_dumpall cases. Move sanitize_line(), unchanged, to dumputils.c so pg_dumpall has access to it in all supported versions. Back-patch to v13 (all supported versions). Reviewed-by: Robert Haas <robertmhaas@gmail.com> Reviewed-by: Nathan Bossart <nathandbossart@gmail.com> Backpatch-through: 13 Security: CVE-2025-8715
This commit is contained in:
@@ -59,7 +59,6 @@ static ArchiveHandle *_allocAH(const char *FileSpec, const ArchiveFormat fmt,
|
||||
DataDirSyncMethod sync_method);
|
||||
static void _getObjectDescription(PQExpBuffer buf, const TocEntry *te);
|
||||
static void _printTocEntry(ArchiveHandle *AH, TocEntry *te, const char *pfx);
|
||||
static char *sanitize_line(const char *str, bool want_hyphen);
|
||||
static void _doSetFixedOutputState(ArchiveHandle *AH);
|
||||
static void _doSetSessionAuth(ArchiveHandle *AH, const char *user);
|
||||
static void _reconnectToDB(ArchiveHandle *AH, const char *dbname);
|
||||
@@ -4050,42 +4049,6 @@ _printTocEntry(ArchiveHandle *AH, TocEntry *te, const char *pfx)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Sanitize a string to be included in an SQL comment or TOC listing, by
|
||||
* replacing any newlines with spaces. This ensures each logical output line
|
||||
* is in fact one physical output line, to prevent corruption of the dump
|
||||
* (which could, in the worst case, present an SQL injection vulnerability
|
||||
* if someone were to incautiously load a dump containing objects with
|
||||
* maliciously crafted names).
|
||||
*
|
||||
* The result is a freshly malloc'd string. If the input string is NULL,
|
||||
* return a malloc'ed empty string, unless want_hyphen, in which case return a
|
||||
* malloc'ed hyphen.
|
||||
*
|
||||
* Note that we currently don't bother to quote names, meaning that the name
|
||||
* fields aren't automatically parseable. "pg_restore -L" doesn't care because
|
||||
* it only examines the dumpId field, but someday we might want to try harder.
|
||||
*/
|
||||
static char *
|
||||
sanitize_line(const char *str, bool want_hyphen)
|
||||
{
|
||||
char *result;
|
||||
char *s;
|
||||
|
||||
if (!str)
|
||||
return pg_strdup(want_hyphen ? "-" : "");
|
||||
|
||||
result = pg_strdup(str);
|
||||
|
||||
for (s = result; *s != '\0'; s++)
|
||||
{
|
||||
if (*s == '\n' || *s == '\r')
|
||||
*s = ' ';
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* Write the file header for a custom-format archive
|
||||
*/
|
||||
|
Reference in New Issue
Block a user