Skip to content

Commit 66561f5

Browse files
dstosbergJunio C Hamano
authored andcommitted
Fix git-pack-objects for 64-bit platforms
The offset of an object in the pack is recorded as a 4-byte integer in the index file. When reading the offset from the mmap'ed index in prepare_pack_revindex(), the address is dereferenced as a long*. This works fine as long as the long type is four bytes wide. On NetBSD/sparc64, however, a long is 8 bytes wide and so dereferencing the offset produces garbage. [jc: taking suggestion by Linus to use uint32_t] Signed-off-by: Dennis Stosberg <dennis@stosberg.net> Signed-off-by: Junio C Hamano <junkio@cox.net>
1 parent d180285 commit 66561f5

File tree

2 files changed

+2
-2
lines changed

2 files changed

+2
-2
lines changed

pack-objects.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ static void prepare_pack_revindex(struct pack_revindex *rix)
156156

157157
rix->revindex = xmalloc(sizeof(unsigned long) * (num_ent + 1));
158158
for (i = 0; i < num_ent; i++) {
159-
long hl = *((long *)(index + 24 * i));
159+
uint32_t hl = *((uint32_t *)(index + 24 * i));
160160
rix->revindex[i] = ntohl(hl);
161161
}
162162
/* This knows the pack format -- the 20-byte trailer

sha1_file.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1126,7 +1126,7 @@ int find_pack_entry_one(const unsigned char *sha1,
11261126
int mi = (lo + hi) / 2;
11271127
int cmp = memcmp(index + 24 * mi + 4, sha1, 20);
11281128
if (!cmp) {
1129-
e->offset = ntohl(*((int*)(index + 24 * mi)));
1129+
e->offset = ntohl(*((uint32_t *)(index + 24 * mi)));
11301130
memcpy(e->sha1, sha1, 20);
11311131
e->p = p;
11321132
return 1;

0 commit comments

Comments
 (0)