Fix base backup with database OIDs larger than INT32_MAX
authorPeter Eisentraut <peter@eisentraut.org>
Mon, 13 Jan 2020 12:27:39 +0000 (13:27 +0100)
committerPeter Eisentraut <peter@eisentraut.org>
Mon, 13 Jan 2020 12:41:12 +0000 (13:41 +0100)
The use of pg_atoi() for parsing a string into an Oid fails for values
larger than INT32_MAX, since OIDs are unsigned.  Instead, use
atooid().  While this has less error checking, the contents of the
data directory are expected to be trustworthy, so we don't need to go
out of our way to do full error checking.

Discussion: https://www.postgresql.org/message-id/flat/dea47fc8-6c89-a2b1-07e3-754ff1ab094b%402ndquadrant.com

src/backend/replication/basebackup.c

index 1423e6cd1f85c6e4d44c70b951c6445f830dca14..dea8aab45e0ba109f614ee24ceab63326bd1a741 100644 (file)
@@ -1291,7 +1291,7 @@ sendDir(const char *path, int basepathlen, bool sizeonly, List *tablespaces,
 
            if (!sizeonly)
                sent = sendFile(pathbuf, pathbuf + basepathlen + 1, &statbuf,
-                               true, isDbDir ? pg_atoi(lastDir + 1, sizeof(Oid), 0) : InvalidOid);
+                               true, isDbDir ? atooid(lastDir + 1) : InvalidOid);
 
            if (sent || sizeonly)
            {