{"thread":{"id":"7132","subject":"[PATCH 5/9] Use uint32_t for all packed object counts.","startedAt":"2007-03-07T01:44:19Z","lastAt":"2007-03-07T01:44:19Z","messageCount":1,"participants":["Shawn O. Pearce"],"isPatch":true,"patchVersion":1,"patchTotal":9},"messages":[{"id":"36522","messageId":"20070307014419.GF26482@spearce.org","threadId":"7132","inReplyTo":null,"subject":"[PATCH 5/9] Use uint32_t for all packed object counts.","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2007-03-07T01:44:19Z","receivedAt":"2007-03-07T01:44:19Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"As we permit up to 2^32-1 objects in a single packfile we cannot\nuse a signed int to represent the object offset within a packfile,\nafter 2^31-1 objects we will start seeing negative indexes and\nerror out or compute bad addresses within the mmap'd index.\n\nThis is a minor cleanup that does not introduce any significant\nlogic changes.  It is roach free.\n\nSigned-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n builtin-fsck.c |    2 +-\n cache.h        |    4 ++--\n pack-check.c   |    8 ++++----\n sha1_file.c    |   10 +++++-----\n sha1_name.c    |    6 +++---\n 5 files changed, 15 insertions(+), 15 deletions(-)\n\ndiff --git a/builtin-fsck.c b/builtin-fsck.c\nindex 6abf498..39cfc32 100644\n--- a/builtin-fsck.c\n+++ b/builtin-fsck.c\n@@ -632,7 +632,7 @@ int cmd_fsck(int argc, char **argv, const char *prefix)\n \t\t\tverify_pack(p, 0);\n \n \t\tfor (p = packed_git; p; p = p->next) {\n-\t\t\tint num = num_packed_objects(p);\n+\t\t\tuint32_t i, num = num_packed_objects(p);\n \t\t\tfor (i = 0; i < num; i++) {\n \t\t\t\tunsigned char sha1[20];\n \t\t\t\tnth_packed_object_sha1(p, i, sha1);\ndiff --git a/cache.h b/cache.h\nindex f3d7538..63a093b 100644\n--- a/cache.h\n+++ b/cache.h\n@@ -425,8 +425,8 @@ extern void pack_report(void);\n extern unsigned char* use_pack(struct packed_git *, struct pack_window **, unsigned long, unsigned int *);\n extern void unuse_pack(struct pack_window **);\n extern struct packed_git *add_packed_git(char *, int, int);\n-extern int num_packed_objects(const struct packed_git *p);\n-extern int nth_packed_object_sha1(const struct packed_git *, int, unsigned char*);\n+extern uint32_t num_packed_objects(const struct packed_git *p);\n+extern int nth_packed_object_sha1(const struct packed_git *, uint32_t, unsigned char*);\n extern unsigned long find_pack_entry_one(const unsigned char *, struct packed_git *);\n extern void *unpack_entry(struct packed_git *, unsigned long, enum object_type *, unsigned long *);\n extern unsigned long unpack_object_header_gently(const unsigned char *buf, unsigned long len, enum object_type *type, unsigned long *sizep);\ndiff --git a/pack-check.c b/pack-check.c\nindex f248ac8..7c82f67 100644\n--- a/pack-check.c\n+++ b/pack-check.c\n@@ -9,7 +9,8 @@ static int verify_packfile(struct packed_git *p,\n \tSHA_CTX ctx;\n \tunsigned char sha1[20];\n \tunsigned long offset = 0, pack_sig = p->pack_size - 20;\n-\tint nr_objects, err, i;\n+\tuint32_t nr_objects, i;\n+\tint err;\n \n \t/* Note that the pack header checks are actually performed by\n \t * use_pack when it first opens the pack file.  If anything\n@@ -40,7 +41,7 @@ static int verify_packfile(struct packed_git *p,\n \t * we do not do scan-streaming check on the pack file.\n \t */\n \tnr_objects = num_packed_objects(p);\n-\tfor (i = err = 0; i < nr_objects; i++) {\n+\tfor (i = 0, err = 0; i < nr_objects; i++) {\n \t\tunsigned char sha1[20];\n \t\tvoid *data;\n \t\tenum object_type type;\n@@ -74,8 +75,7 @@ static int verify_packfile(struct packed_git *p,\n \n static void show_pack_info(struct packed_git *p)\n {\n-\tint nr_objects, i;\n-\tunsigned int chain_histogram[MAX_CHAIN];\n+\tuint32_t nr_objects, i, chain_histogram[MAX_CHAIN];\n \n \tnr_objects = num_packed_objects(p);\n \tmemset(chain_histogram, 0, sizeof(chain_histogram));\ndiff --git a/sha1_file.c b/sha1_file.c\nindex b17a828..54ffa7c 100644\n--- a/sha1_file.c\n+++ b/sha1_file.c\n@@ -437,7 +437,7 @@ static int check_packed_git_idx(const char *path,\n \tvoid *idx_map;\n \tuint32_t *index;\n \tunsigned long idx_size;\n-\tint nr, i;\n+\tuint32_t nr, i;\n \tint fd = open(path, O_RDONLY);\n \tstruct stat st;\n \tif (fd < 0)\n@@ -472,7 +472,7 @@ static int check_packed_git_idx(const char *path,\n \n \tnr = 0;\n \tfor (i = 0; i < 256; i++) {\n-\t\tunsigned int n = ntohl(index[i]);\n+\t\tuint32_t n = ntohl(index[i]);\n \t\tif (n < nr) {\n \t\t\tmunmap(idx_map, idx_size);\n \t\t\treturn error(\"non-monotonic index %s\", path);\n@@ -1339,17 +1339,17 @@ void *unpack_entry(struct packed_git *p, unsigned long obj_offset,\n \treturn data;\n }\n \n-int num_packed_objects(const struct packed_git *p)\n+uint32_t num_packed_objects(const struct packed_git *p)\n {\n \t/* See check_packed_git_idx() */\n \treturn (p->index_size - 20 - 20 - 4*256) / 24;\n }\n \n-int nth_packed_object_sha1(const struct packed_git *p, int n,\n+int nth_packed_object_sha1(const struct packed_git *p, uint32_t n,\n \t\t\t   unsigned char* sha1)\n {\n \tvoid *index = p->index_base + 256;\n-\tif (n < 0 || num_packed_objects(p) <= n)\n+\tif (num_packed_objects(p) <= n)\n \t\treturn -1;\n \thashcpy(sha1, (unsigned char *) index + (24 * n) + 4);\n \treturn 0;\ndiff --git a/sha1_name.c b/sha1_name.c\nindex 0781477..31812d3 100644\n--- a/sha1_name.c\n+++ b/sha1_name.c\n@@ -76,10 +76,10 @@ static int find_short_packed_object(int len, const unsigned char *match, unsigne\n \n \tprepare_packed_git();\n \tfor (p = packed_git; p && found < 2; p = p->next) {\n-\t\tunsigned num = num_packed_objects(p);\n-\t\tunsigned first = 0, last = num;\n+\t\tuint32_t num = num_packed_objects(p);\n+\t\tuint32_t first = 0, last = num;\n \t\twhile (first < last) {\n-\t\t\tunsigned mid = (first + last) / 2;\n+\t\t\tuint32_t mid = (first + last) / 2;\n \t\t\tunsigned char now[20];\n \t\t\tint cmp;\n \n-- \n1.5.0.3.863.gf0989\n"}]}