Skip to content

Commit

Permalink
parse_pack_header_option(): avoid unaligned memory writes
Browse files Browse the repository at this point in the history
In order to recreate a pack header in our in-memory buffer, we cast the
buffer to a "struct pack_header" and assign the individual fields. This
is reported to cause SIGBUS on sparc64 due to alignment issues.

We can work around this by using put_be32() which will write individual
bytes into the buffer.

Reported-by: Koakuma <[email protected]>
Signed-off-by: Jeff King <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
  • Loading branch information
peff authored and dscho committed Feb 6, 2025
1 parent 0e3ae59 commit 9992be6
Showing 1 changed file with 9 additions and 6 deletions.
15 changes: 9 additions & 6 deletions packfile.c
Original file line number Diff line number Diff line change
Expand Up @@ -2318,17 +2318,20 @@ int is_promisor_object(struct repository *r, const struct object_id *oid)

int parse_pack_header_option(const char *in, unsigned char *out, unsigned int *len)
{
struct pack_header *hdr;
unsigned char *hdr;
char *c;

hdr = (struct pack_header *)out;
hdr->hdr_signature = htonl(PACK_SIGNATURE);
hdr->hdr_version = htonl(strtoul(in, &c, 10));
hdr = out;
put_be32(hdr, PACK_SIGNATURE);
hdr += 4;
put_be32(hdr, strtoul(in, &c, 10));
hdr += 4;
if (*c != ',')
return -1;
hdr->hdr_entries = htonl(strtoul(c + 1, &c, 10));
put_be32(hdr, strtoul(c + 1, &c, 10));
hdr += 4;
if (*c)
return -1;
*len = sizeof(*hdr);
*len = hdr - out;
return 0;
}

0 comments on commit 9992be6

Please sign in to comment.