Commit 8564a022 by Russell Belfer

Fix fragile git_oid_ncmp

git_oid_ncmp was making some assumptions about the length of
the data - this shifts the check to the top of the loop so it
will work more robustly, limits the max, and adds some tests
to verify the functionality.
parent 0c72248b
......@@ -176,13 +176,16 @@ int git_oid_ncmp(const git_oid *oid_a, const git_oid *oid_b, size_t len)
const unsigned char *a = oid_a->id;
const unsigned char *b = oid_b->id;
do {
if (len > GIT_OID_HEXSZ)
len = GIT_OID_HEXSZ;
while (len > 1) {
if (*a != *b)
return 1;
a++;
b++;
len -= 2;
} while (len > 1);
};
if (len)
if ((*a ^ *b) & 0xf0)
......
......@@ -27,4 +27,22 @@ void test_core_oid__streq(void)
cl_assert(git_oid_streq(&idp, "deadbeef") == -1);
cl_assert(git_oid_streq(&idp, "I'm not an oid.... :)") == -1);
void test_core_oid__ncmp(void)
{
cl_assert(!git_oid_ncmp(&id, &idp, 0));
cl_assert(!git_oid_ncmp(&id, &idp, 1));
cl_assert(!git_oid_ncmp(&id, &idp, 2));
cl_assert(!git_oid_ncmp(&id, &idp, 17));
cl_assert(!git_oid_ncmp(&id, &idp, 18));
cl_assert(git_oid_ncmp(&id, &idp, 19));
cl_assert(git_oid_ncmp(&id, &idp, 40));
cl_assert(git_oid_ncmp(&id, &idp, 41));
cl_assert(git_oid_ncmp(&id, &idp, 42));
cl_assert(!git_oid_ncmp(&id, &id, 0));
cl_assert(!git_oid_ncmp(&id, &id, 1));
cl_assert(!git_oid_ncmp(&id, &id, 39));
cl_assert(!git_oid_ncmp(&id, &id, 40));
cl_assert(!git_oid_ncmp(&id, &id, 41));
}
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