Commit 00258cc0 by Jiri Pospisil

git_oid_fromstrn: Simplify the implementation and fix memory access issues

parent c81e4adf
...@@ -24,30 +24,24 @@ int git_oid_fromstrn(git_oid *out, const char *str, size_t length) ...@@ -24,30 +24,24 @@ int git_oid_fromstrn(git_oid *out, const char *str, size_t length)
size_t p; size_t p;
int v; int v;
if (length > GIT_OID_HEXSZ) assert(out && str);
return oid_error_invalid("too long");
for (p = 0; p < length - 1; p += 2) { if (!length)
v = (git__fromhex(str[p + 0]) << 4) return oid_error_invalid("too short");
| git__fromhex(str[p + 1]);
if (v < 0) if (length > GIT_OID_HEXSZ)
return oid_error_invalid("contains invalid characters"); return oid_error_invalid("too long");
out->id[p / 2] = (unsigned char)v; memset(out->id, 0, GIT_OID_RAWSZ);
}
if (length % 2) { for (p = 0; p < length; p++) {
v = (git__fromhex(str[p + 0]) << 4); v = git__fromhex(str[p]);
if (v < 0) if (v < 0)
return oid_error_invalid("contains invalid characters"); 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));
p += 2;
} }
memset(out->id + p / 2, 0, (GIT_OID_HEXSZ - p) / 2);
return 0; return 0;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment