File size in a backup manifest should use uint64, not size_t.
authorRobert Haas <rhaas@postgresql.org>
Wed, 2 Oct 2024 13:59:04 +0000 (09:59 -0400)
committerRobert Haas <rhaas@postgresql.org>
Wed, 2 Oct 2024 13:59:04 +0000 (09:59 -0400)
size_t is the size of an object in memory, not the size of a file on disk.

Thanks to Tom Lane for noting the error.

Discussion: http://postgr.es/m/1865585.1727803933@sss.pgh.pa.us

src/bin/pg_combinebackup/load_manifest.c
src/bin/pg_combinebackup/load_manifest.h
src/bin/pg_combinebackup/write_manifest.c
src/bin/pg_combinebackup/write_manifest.h
src/bin/pg_verifybackup/astreamer_verify.c
src/bin/pg_verifybackup/pg_verifybackup.c
src/bin/pg_verifybackup/pg_verifybackup.h
src/common/parse_manifest.c
src/include/common/parse_manifest.h

index be8e6273fcb3b63a7e2f4ec06ea5cc8a4b899a9e..3a3ad6c2474c0f07ba84409e0eb64ca4f22abcf1 100644 (file)
@@ -60,7 +60,7 @@ static void combinebackup_version_cb(JsonManifestParseContext *context,
 static void combinebackup_system_identifier_cb(JsonManifestParseContext *context,
                                                                                           uint64 manifest_system_identifier);
 static void combinebackup_per_file_cb(JsonManifestParseContext *context,
-                                                                         const char *pathname, size_t size,
+                                                                         const char *pathname, uint64 size,
                                                                          pg_checksum_type checksum_type,
                                                                          int checksum_length,
                                                                          uint8 *checksum_payload);
@@ -267,7 +267,7 @@ combinebackup_system_identifier_cb(JsonManifestParseContext *context,
  */
 static void
 combinebackup_per_file_cb(JsonManifestParseContext *context,
-                                                 const char *pathname, size_t size,
+                                                 const char *pathname, uint64 size,
                                                  pg_checksum_type checksum_type,
                                                  int checksum_length, uint8 *checksum_payload)
 {
index a96ae12eb8ed41171b132b7e71213d6c3b180e4c..8e657179af020197400a1c3f80e0a622bbf3fac2 100644 (file)
@@ -23,7 +23,7 @@ typedef struct manifest_file
 {
        uint32          status;                 /* hash status */
        const char *pathname;
-       size_t          size;
+       uint64          size;
        pg_checksum_type checksum_type;
        int                     checksum_length;
        uint8      *checksum_payload;
index 369d6d2071c75fa9bea774912c802813811790c0..6fea07e7c640fe2ba33ae2ec8a13503723759645 100644 (file)
@@ -74,7 +74,7 @@ create_manifest_writer(char *directory, uint64 system_identifier)
  */
 void
 add_file_to_manifest(manifest_writer *mwriter, const char *manifest_path,
-                                        size_t size, time_t mtime,
+                                        uint64 size, time_t mtime,
                                         pg_checksum_type checksum_type,
                                         int checksum_length,
                                         uint8 *checksum_payload)
@@ -104,7 +104,8 @@ add_file_to_manifest(manifest_writer *mwriter, const char *manifest_path,
                appendStringInfoString(&mwriter->buf, "\", ");
        }
 
-       appendStringInfo(&mwriter->buf, "\"Size\": %zu, ", size);
+       appendStringInfo(&mwriter->buf, "\"Size\": %llu, ",
+                                        (unsigned long long) size);
 
        appendStringInfoString(&mwriter->buf, "\"Last-Modified\": \"");
        enlargeStringInfo(&mwriter->buf, 128);
index ebc4f9441ada52cfc8c2959e8bc9a55a7be94ae6..d2becaba1f9024395c6bc5693258eaa0cd8a2d13 100644 (file)
@@ -23,7 +23,7 @@ extern manifest_writer *create_manifest_writer(char *directory,
                                                                                           uint64 system_identifier);
 extern void add_file_to_manifest(manifest_writer *mwriter,
                                                                 const char *manifest_path,
-                                                                size_t size, time_t mtime,
+                                                                uint64 size, time_t mtime,
                                                                 pg_checksum_type checksum_type,
                                                                 int checksum_length,
                                                                 uint8 *checksum_payload);
index f7ecdc1f65527cf2a23792f7c5d582fdc2e1d842..a442b2849fcf53423d467c318e84824602927e53 100644 (file)
@@ -207,9 +207,11 @@ member_verify_header(astreamer *streamer, astreamer_member *member)
        if (m->size != member->size)
        {
                report_backup_error(mystreamer->context,
-                                                       "\"%s\" has size %lld in \"%s\" but size %zu in the manifest",
-                                                       member->pathname, (long long int) member->size,
-                                                       mystreamer->archive_name, m->size);
+                                                       "\"%s\" has size %llu in \"%s\" but size %llu in the manifest",
+                                                       member->pathname,
+                                                       (unsigned long long) member->size,
+                                                       mystreamer->archive_name,
+                                                       (unsigned long long) m->size);
                m->bad = true;
                return;
        }
@@ -294,9 +296,10 @@ member_verify_checksum(astreamer *streamer)
        if (mystreamer->checksum_bytes != m->size)
        {
                report_backup_error(mystreamer->context,
-                                                       "file \"%s\" in \"%s\" should contain %zu bytes, but read %zu bytes",
+                                                       "file \"%s\" in \"%s\" should contain %llu bytes, but read %llu bytes",
                                                        m->pathname, mystreamer->archive_name,
-                                                       m->size, mystreamer->checksum_bytes);
+                                                       (unsigned long long) m->size,
+                                                       (unsigned long long) mystreamer->checksum_bytes);
                return;
        }
 
index 32467a1ba094c9dc19759708578f801d1bb016df..0719cb897835035c41aa800012b4173726423233 100644 (file)
@@ -61,7 +61,7 @@ static void verifybackup_version_cb(JsonManifestParseContext *context,
 static void verifybackup_system_identifier(JsonManifestParseContext *context,
                                                                                   uint64 manifest_system_identifier);
 static void verifybackup_per_file_cb(JsonManifestParseContext *context,
-                                                                        const char *pathname, size_t size,
+                                                                        const char *pathname, uint64 size,
                                                                         pg_checksum_type checksum_type,
                                                                         int checksum_length,
                                                                         uint8 *checksum_payload);
@@ -547,7 +547,7 @@ verifybackup_system_identifier(JsonManifestParseContext *context,
  */
 static void
 verifybackup_per_file_cb(JsonManifestParseContext *context,
-                                                const char *pathname, size_t size,
+                                                const char *pathname, uint64 size,
                                                 pg_checksum_type checksum_type,
                                                 int checksum_length, uint8 *checksum_payload)
 {
@@ -719,8 +719,9 @@ verify_plain_backup_file(verifier_context *context, char *relpath,
        if (m->size != sb.st_size)
        {
                report_backup_error(context,
-                                                       "\"%s\" has size %lld on disk but size %zu in the manifest",
-                                                       relpath, (long long int) sb.st_size, m->size);
+                                                       "\"%s\" has size %llu on disk but size %llu in the manifest",
+                                                       relpath, (unsigned long long) sb.st_size,
+                                                       (unsigned long long) m->size);
                m->bad = true;
        }
 
@@ -1101,7 +1102,7 @@ verify_file_checksum(verifier_context *context, manifest_file *m,
        const char *relpath = m->pathname;
        int                     fd;
        int                     rc;
-       size_t          bytes_read = 0;
+       uint64          bytes_read = 0;
        uint8           checksumbuf[PG_CHECKSUM_MAX_LENGTH];
        int                     checksumlen;
 
@@ -1164,8 +1165,9 @@ verify_file_checksum(verifier_context *context, manifest_file *m,
        if (bytes_read != m->size)
        {
                report_backup_error(context,
-                                                       "file \"%s\" should contain %zu bytes, but read %zu bytes",
-                                                       relpath, m->size, bytes_read);
+                                                       "file \"%s\" should contain %llu bytes, but read %llu bytes",
+                                                       relpath, (unsigned long long) m->size,
+                                                       (unsigned long long) bytes_read);
                return;
        }
 
index 183b1d5111b860b68390efa75edd2ab9f338e2fc..2f864fb0f3f88c3204aa2cfe230b4644c4d51617 100644 (file)
@@ -29,7 +29,7 @@ typedef struct manifest_file
 {
        uint32          status;                 /* hash status */
        const char *pathname;
-       size_t          size;
+       uint64          size;
        pg_checksum_type checksum_type;
        int                     checksum_length;
        uint8      *checksum_payload;
index 5a7b491e9a9630211dbb20a71933a007c4ff85ab..ad2d0fd808f26bb08552789df2122f8c280c3ce6 100644 (file)
@@ -650,7 +650,7 @@ static void
 json_manifest_finalize_file(JsonManifestParseState *parse)
 {
        JsonManifestParseContext *context = parse->context;
-       size_t          size;
+       uint64          size;
        char       *ep;
        int                     checksum_string_length;
        pg_checksum_type checksum_type;
@@ -688,7 +688,7 @@ json_manifest_finalize_file(JsonManifestParseState *parse)
        }
 
        /* Parse size. */
-       size = strtoul(parse->size, &ep, 10);
+       size = strtou64(parse->size, &ep, 10);
        if (*ep)
                json_manifest_parse_failure(parse->context,
                                                                        "file size is not an integer");
index ee571a568a19b2ca6155e8723f360bf70f883eb8..1b8bc447e445f541d8817f5e5b71f0212c566b62 100644 (file)
@@ -28,7 +28,7 @@ typedef void (*json_manifest_system_identifier_callback) (JsonManifestParseConte
                                                                                                                  uint64 manifest_system_identifier);
 typedef void (*json_manifest_per_file_callback) (JsonManifestParseContext *,
                                                                                                 const char *pathname,
-                                                                                                size_t size, pg_checksum_type checksum_type,
+                                                                                                uint64 size, pg_checksum_type checksum_type,
                                                                                                 int checksum_length, uint8 *checksum_payload);
 typedef void (*json_manifest_per_wal_range_callback) (JsonManifestParseContext *,
                                                                                                          TimeLineID tli,