diff options
author | Peter Eisentraut <peter@eisentraut.org> | 2024-08-10 08:12:44 +0200 |
---|---|---|
committer | Peter Eisentraut <peter@eisentraut.org> | 2024-08-10 08:22:31 +0200 |
commit | f5a1311fccd2ed24a9fb42aa47a17d1df7126039 (patch) | |
tree | 9bc268b94cdcbd9ffb882057117a8abb136f68ea /src/bin/pg_basebackup | |
parent | 7adec2d5fc29036a6ce78c4f4e95f85466cb5d9a (diff) | |
download | postgresql-f5a1311fccd2ed24a9fb42aa47a17d1df7126039.tar.gz postgresql-f5a1311fccd2ed24a9fb42aa47a17d1df7126039.zip |
Fix inappropriate uses of atol()
Some code using atol() would not work correctly if sizeof(long)==4:
- src/bin/pg_basebackup/pg_basebackup.c: Would miscount size of a
tablespace over 2 TB.
- src/bin/pg_basebackup/streamutil.c: Would truncate a timeline ID
beyond INT32_MAX.
- src/bin/pg_rewind/libpq_source.c: Would miscount size of files
larger than 2 GB (but this currently cannot happen).
Replace these with atoll().
In one case, the use of atol() did not result in incorrect behavior
but seems inconsistent with related code:
- src/interfaces/ecpg/ecpglib/execute.c: Gratuitous, since it
processes a value from pg_type.typlen, which is int16.
Replace this with atoi().
Reviewed-by: Heikki Linnakangas <hlinnaka@iki.fi>
Discussion: https://www.postgresql.org/message-id/flat/a52738ad-06bc-4d45-b59f-b38a8a89de49%40eisentraut.org
Diffstat (limited to 'src/bin/pg_basebackup')
-rw-r--r-- | src/bin/pg_basebackup/pg_basebackup.c | 2 | ||||
-rw-r--r-- | src/bin/pg_basebackup/streamutil.c | 2 |
2 files changed, 2 insertions, 2 deletions
diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c index 72ba3243352..e41a6cfbda6 100644 --- a/src/bin/pg_basebackup/pg_basebackup.c +++ b/src/bin/pg_basebackup/pg_basebackup.c @@ -2056,7 +2056,7 @@ BaseBackup(char *compression_algorithm, char *compression_detail, tablespacecount = PQntuples(res); for (i = 0; i < PQntuples(res); i++) { - totalsize_kb += atol(PQgetvalue(res, i, 2)); + totalsize_kb += atoll(PQgetvalue(res, i, 2)); /* * Verify tablespace directories are empty. Don't bother with the diff --git a/src/bin/pg_basebackup/streamutil.c b/src/bin/pg_basebackup/streamutil.c index feee451d595..30b3d9a377e 100644 --- a/src/bin/pg_basebackup/streamutil.c +++ b/src/bin/pg_basebackup/streamutil.c @@ -631,7 +631,7 @@ GetSlotInformation(PGconn *conn, const char *slot_name, /* current TLI */ if (!PQgetisnull(res, 0, 2)) - tli_loc = (TimeLineID) atol(PQgetvalue(res, 0, 2)); + tli_loc = (TimeLineID) atoll(PQgetvalue(res, 0, 2)); PQclear(res); |