Skip to content

Commit f5a1311

Browse files
committed
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
1 parent 7adec2d commit f5a1311

File tree

4 files changed

+4
-4
lines changed

4 files changed

+4
-4
lines changed

src/bin/pg_basebackup/pg_basebackup.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2056,7 +2056,7 @@ BaseBackup(char *compression_algorithm, char *compression_detail,
20562056
tablespacecount = PQntuples(res);
20572057
for (i = 0; i < PQntuples(res); i++)
20582058
{
2059-
totalsize_kb += atol(PQgetvalue(res, i, 2));
2059+
totalsize_kb += atoll(PQgetvalue(res, i, 2));
20602060

20612061
/*
20622062
* Verify tablespace directories are empty. Don't bother with the

src/bin/pg_basebackup/streamutil.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -631,7 +631,7 @@ GetSlotInformation(PGconn *conn, const char *slot_name,
631631

632632
/* current TLI */
633633
if (!PQgetisnull(res, 0, 2))
634-
tli_loc = (TimeLineID) atol(PQgetvalue(res, 0, 2));
634+
tli_loc = (TimeLineID) atoll(PQgetvalue(res, 0, 2));
635635

636636
PQclear(res);
637637

src/bin/pg_rewind/libpq_source.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ libpq_traverse_files(rewind_source *source, process_file_callback_t callback)
294294
}
295295

296296
path = PQgetvalue(res, i, 0);
297-
filesize = atol(PQgetvalue(res, i, 1));
297+
filesize = atoll(PQgetvalue(res, i, 1));
298298
isdir = (strcmp(PQgetvalue(res, i, 2), "t") == 0);
299299
link_target = PQgetvalue(res, i, 3);
300300

src/interfaces/ecpg/ecpglib/execute.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ ecpg_is_type_an_array(int type, const struct statement *stmt, const struct varia
278278
isarray = ECPG_ARRAY_NONE;
279279
else
280280
{
281-
isarray = (atol((char *) PQgetvalue(query, 0, 0)) == -1) ? ECPG_ARRAY_ARRAY : ECPG_ARRAY_VECTOR;
281+
isarray = (atoi((char *) PQgetvalue(query, 0, 0)) == -1) ? ECPG_ARRAY_ARRAY : ECPG_ARRAY_VECTOR;
282282
if (ecpg_dynamic_type(type) == SQL3_CHARACTER ||
283283
ecpg_dynamic_type(type) == SQL3_CHARACTER_VARYING)
284284
{

0 commit comments

Comments
 (0)