get_oid_hex_segment(): don't pad the rest of oid

Remove the feature of `get_oid_hex_segment()` that it pads the rest of
the `oid` argument with zeros. Instead, do this at the caller who
needs it.

This makes the functionality of this function more coherent and
removes the need for its `oid_len` argument.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Michael Haggerty 2017-08-26 10:28:10 +02:00 committed by Junio C Hamano
parent 4ebef533d7
commit d49852d6f8

24
notes.c
View File

@ -339,15 +339,14 @@ static void note_tree_free(struct int_node *tree)
* - hex - Partial SHA1 segment in ASCII hex format * - hex - Partial SHA1 segment in ASCII hex format
* - hex_len - Length of above segment. Must be multiple of 2 between 0 and 40 * - hex_len - Length of above segment. Must be multiple of 2 between 0 and 40
* - oid - Partial SHA1 value is written here * - oid - Partial SHA1 value is written here
* - oid_len - Max #bytes to store in sha1, Must be >= hex_len / 2, and < 20
* Return 0 on success or -1 on error (invalid arguments or input not * Return 0 on success or -1 on error (invalid arguments or input not
* in hex format). Pad oid with NULs up to oid_len. * in hex format).
*/ */
static int get_oid_hex_segment(const char *hex, unsigned int hex_len, static int get_oid_hex_segment(const char *hex, unsigned int hex_len,
unsigned char *oid, unsigned int oid_len) unsigned char *oid)
{ {
unsigned int i, len = hex_len >> 1; unsigned int i, len = hex_len >> 1;
if (hex_len % 2 != 0 || len > oid_len) if (hex_len % 2 != 0)
return -1; return -1;
for (i = 0; i < len; i++) { for (i = 0; i < len; i++) {
unsigned int val = (hexval(hex[0]) << 4) | hexval(hex[1]); unsigned int val = (hexval(hex[0]) << 4) | hexval(hex[1]);
@ -356,8 +355,6 @@ static int get_oid_hex_segment(const char *hex, unsigned int hex_len,
*oid++ = val; *oid++ = val;
hex += 2; hex += 2;
} }
for (; i < oid_len; i++)
*oid++ = 0;
return 0; return 0;
} }
@ -442,24 +439,29 @@ static void load_subtree(struct notes_tree *t, struct leaf_node *subtree,
goto handle_non_note; goto handle_non_note;
if (get_oid_hex_segment(entry.path, path_len, if (get_oid_hex_segment(entry.path, path_len,
object_oid.hash + prefix_len, object_oid.hash + prefix_len))
GIT_SHA1_RAWSZ - prefix_len))
goto handle_non_note; /* entry.path is not a SHA1 */ goto handle_non_note; /* entry.path is not a SHA1 */
type = PTR_TYPE_NOTE; type = PTR_TYPE_NOTE;
} else if (path_len == 2) { } else if (path_len == 2) {
/* This is potentially an internal node */ /* This is potentially an internal node */
size_t len = prefix_len;
if (!S_ISDIR(entry.mode)) if (!S_ISDIR(entry.mode))
/* internal nodes must be trees */ /* internal nodes must be trees */
goto handle_non_note; goto handle_non_note;
if (get_oid_hex_segment(entry.path, 2, if (get_oid_hex_segment(entry.path, 2,
object_oid.hash + prefix_len, object_oid.hash + len++))
GIT_SHA1_RAWSZ - prefix_len))
goto handle_non_note; /* entry.path is not a SHA1 */ goto handle_non_note; /* entry.path is not a SHA1 */
object_oid.hash[KEY_INDEX] = (unsigned char) (prefix_len + 1); /*
* Pad the rest of the SHA-1 with zeros,
* except for the last byte, where we write
* the length:
*/
memset(object_oid.hash + len, 0, GIT_SHA1_RAWSZ - len - 1);
object_oid.hash[KEY_INDEX] = (unsigned char)len;
type = PTR_TYPE_SUBTREE; type = PTR_TYPE_SUBTREE;
} else { } else {