Fix inappropriate uses of atol()
authorPeter Eisentraut <[email protected]>
Sat, 10 Aug 2024 06:12:44 +0000 (08:12 +0200)
committerPeter Eisentraut <[email protected]>
Sat, 10 Aug 2024 06:22:31 +0000 (08:22 +0200)
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 <[email protected]>
Discussion: https://www.postgresql.org/message-id/flat/a52738ad-06bc-4d45-b59f-b38a8a89de49%40eisentraut.org

src/bin/pg_basebackup/pg_basebackup.c
src/bin/pg_basebackup/streamutil.c
src/bin/pg_rewind/libpq_source.c
src/interfaces/ecpg/ecpglib/execute.c

index 72ba32433529e27d37889676d9e4263f4a7d086b..e41a6cfbda639b13d5c3c184b025ca5d7066606e 100644 (file)
@@ -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
index feee451d5951ed772717116b06faeb67c4ac9bfb..30b3d9a377e73ae057dff4072248e09f588e9453 100644 (file)
@@ -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);
 
index 9378266d28e2f013bd286d0d8f88b1166081be52..0239fb476449d4783dd393534b7b24b51d7659a9 100644 (file)
@@ -294,7 +294,7 @@ libpq_traverse_files(rewind_source *source, process_file_callback_t callback)
        }
 
        path = PQgetvalue(res, i, 0);
-       filesize = atol(PQgetvalue(res, i, 1));
+       filesize = atoll(PQgetvalue(res, i, 1));
        isdir = (strcmp(PQgetvalue(res, i, 2), "t") == 0);
        link_target = PQgetvalue(res, i, 3);
 
index 04d0b40c5376b5c6b86cc03db1ac3e3e238da4ad..c578c21cf66458b7849cabb5decd8ad751ecc032 100644 (file)
@@ -278,7 +278,7 @@ ecpg_is_type_an_array(int type, const struct statement *stmt, const struct varia
            isarray = ECPG_ARRAY_NONE;
        else
        {
-           isarray = (atol((char *) PQgetvalue(query, 0, 0)) == -1) ? ECPG_ARRAY_ARRAY : ECPG_ARRAY_VECTOR;
+           isarray = (atoi((char *) PQgetvalue(query, 0, 0)) == -1) ? ECPG_ARRAY_ARRAY : ECPG_ARRAY_VECTOR;
            if (ecpg_dynamic_type(type) == SQL3_CHARACTER ||
                ecpg_dynamic_type(type) == SQL3_CHARACTER_VARYING)
            {