mirror of
https://github.com/git/git.git
synced 2025-12-12 20:36:24 +01:00
parse_pack_header_option(): avoid unaligned memory writes
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 <koachan@protonmail.com> Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
798e0f4516
commit
4f02f4d68d
15
packfile.c
15
packfile.c
@@ -2297,17 +2297,20 @@ int is_promisor_object(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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user