Jeff King <peff@xxxxxxxx> writes: > 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. Makes sense. > 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). OK. > struct disambiguate_state { > int len; /* length of prefix in hex chars */ > - char hex_pfx[GIT_SHA1_HEXSZ]; > + char hex_pfx[GIT_SHA1_HEXSZ + 1]; > unsigned char bin_pfx[GIT_SHA1_RAWSZ]; > > disambiguate_hint_fn fn; > @@ -291,7 +291,6 @@ static int init_object_disambiguation(const char *name, int len, > return -1; > > memset(ds, 0, sizeof(*ds)); > - memset(ds->hex_pfx, 'x', GIT_SHA1_HEXSZ); As the whole thing is cleared here... > > for (i = 0; i < len ;i++) { > unsigned char c = name[i]; > @@ -313,6 +312,7 @@ static int init_object_disambiguation(const char *name, int len, > } > > ds->len = len; > + ds->hex_pfx[len] = '\0'; ... do we even need this one? It would not hurt, though. > @@ -351,7 +351,7 @@ static int get_short_sha1(const char *name, int len, unsigned char *sha1, > status = finish_object_disambiguation(&ds, sha1); > > if (!quietly && (status == SHORT_NAME_AMBIGUOUS)) > - return error("short SHA1 %.*s is ambiguous.", ds.len, ds.hex_pfx); > + return error("short SHA1 %s is ambiguous.", ds.hex_pfx); Makes sense. Thanks.