[PATCH 02/30] oid-array: Teach oid-array to handle multiple kinds of oids
- From
- Eric W. Biederman <ebiederm@gmail.com>
- Date
- Sep 27, 2023, 19:55 UTC
- Message-ID
- <20230927195537.1682-2-ebiederm@gmail.com>
- In-Reply-To
- <87jzsbjt0a.fsf@gmail.froward.int.ebiederm.org>
From: "Eric W. Biederman" <ebiederm@xmission.com>
While looking at how to handle input of both SHA-1 and SHA-256 oids in get_oid_with_context, I realized that the oid_array in repo_for_each_abbrev might have more than one kind of oid stored in it simulataneously.
Update to oid_array_append to ensure that oids added to an oid array always have an algorithm set.
Update void_hashcmp to first verify two oids use the same hash algorithm before comparing them to each other.
With that oid-array should be safe to use with differnt kinds of oids simultaneously.
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com> --- oid-array.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/oid-array.c b/oid-array.c index 8e4717746c31..1f36651754ed 100644 --- a/oid-array.c +++ b/oid-array.c @@ -6,12 +6,20 @@ void oid_array_append(struct oid_array *array, const struct object_id *oid) { ALLOC_GROW(array->oid, array->nr + 1, array->alloc); oidcpy(&array->oid[array->nr++], oid); + if (!oid->algo) + oid_set_algo(&array->oid[array->nr - 1], the_hash_algo); array->sorted = 0; } -static int void_hashcmp(const void *a, const void *b) +static int void_hashcmp(const void *va, const void *vb) { - return oidcmp(a, b); + const struct object_id *a = va, *b = vb; + int ret; + if (a->algo == b->algo) + ret = oidcmp(a, b); + else + ret = a->algo > b->algo ? 1 : -1; + return ret; } void oid_array_sort(struct oid_array *array)
-- 2.41.0