diff --git a/src/oid.c b/src/oid.c index f74c43fe2..b640cadd1 100644 --- a/src/oid.c +++ b/src/oid.c @@ -24,30 +24,24 @@ int git_oid_fromstrn(git_oid *out, const char *str, size_t length) size_t p; int v; + assert(out && str); + + if (!length) + return oid_error_invalid("too short"); + if (length > GIT_OID_HEXSZ) return oid_error_invalid("too long"); - for (p = 0; p < length - 1; p += 2) { - v = (git__fromhex(str[p + 0]) << 4) - | git__fromhex(str[p + 1]); + memset(out->id, 0, GIT_OID_RAWSZ); + for (p = 0; p < length; p++) { + v = git__fromhex(str[p]); if (v < 0) return oid_error_invalid("contains invalid characters"); - out->id[p / 2] = (unsigned char)v; + out->id[p / 2] |= (unsigned char)(v << (p % 2 ? 0 : 4)); } - if (length % 2) { - v = (git__fromhex(str[p + 0]) << 4); - if (v < 0) - return oid_error_invalid("contains invalid characters"); - - out->id[p / 2] = (unsigned char)v; - p += 2; - } - - memset(out->id + p / 2, 0, (GIT_OID_HEXSZ - p) / 2); - return 0; }