get_short_sha1: NUL-terminate hex prefix
We store the hex prefix in a 40-byte buffer with the prefix itself followed by 40-minus-len "x" characters. These x's serve no purpose, and the lack of NUL termination makes the prefix string annoying to use. Let's just terminate it. Note that this is in contrast to the binary prefix, which _must_ be zero-padded, because we look at the whole thing during a binary search to find the first potential match in each pack index. The loose-object hex search cannot use the same trick because it has to do a linear walk through the unsorted results of readdir() (and even if it could, you'd want zeroes instead of x's). Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff King committed
Sep 26, 2016 at 08:00 UTC
59e4e34f6977f83c3a3842178da6358a5d130eb6
1 file changed
+3
-3
sha1_name.c
+3
-3
@@ -14,7 +14,7 @@ typedef int (*disambiguate_hint_fn)(const unsigned char *, void *);
14
15
struct disambiguate_state {
16
int len; /* length of prefix in hex chars */
17
- char hex_pfx[GIT_SHA1_HEXSZ];
17
+ char hex_pfx[GIT_SHA1_HEXSZ + 1];
18
unsigned char bin_pfx[GIT_SHA1_RAWSZ];
19
20
disambiguate_hint_fn fn;
@@ -291,7 +291,6 @@ static int init_object_disambiguation(const char *name, int len,
291
return -1;
292
293
memset(ds, 0, sizeof(*ds));
294
- memset(ds->hex_pfx, 'x', GIT_SHA1_HEXSZ);
294
295
for (i = 0; i < len ;i++) {
296
unsigned char c = name[i];
@@ -313,6 +312,7 @@ static int init_object_disambiguation(const char *name, int len,
312
}
313
314
ds->len = len;
315
+ ds->hex_pfx[len] = '\0';
316
prepare_alt_odb();
317
return 0;
318
}
@@ -346,7 +346,7 @@ static int get_short_sha1(const char *name, int len, unsigned char *sha1,
346
status = finish_object_disambiguation(&ds, sha1);
347
348
if (!quietly && (status == SHORT_NAME_AMBIGUOUS))
349
- return error("short SHA1 %.*s is ambiguous.", ds.len, ds.hex_pfx);
349
+ return error("short SHA1 %s is ambiguous.", ds.hex_pfx);
350
return status;
351
}
352