The code in virHashUpdateEntry and virHashAddEntry is really similar. However, the latter rebalances the hash table when one of its buckets contains too many elements while the former does not. Fix this discrepancy. --- src/util/hash.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) diff --git a/src/util/hash.c b/src/util/hash.c index ba156b1..595f447 100644 --- a/src/util/hash.c +++ b/src/util/hash.c @@ -331,7 +331,7 @@ int virHashUpdateEntry(virHashTablePtr table, const char *name, void *userdata, virHashDeallocator f) { - unsigned long key; + unsigned long key, len = 0; virHashEntryPtr entry; virHashEntryPtr insert; char *new_name; @@ -354,6 +354,7 @@ virHashUpdateEntry(virHashTablePtr table, const char *name, insert->payload = userdata; return (0); } + len++; } if (STREQ(insert->name, name)) { if (f) @@ -386,6 +387,10 @@ virHashUpdateEntry(virHashTablePtr table, const char *name, if (insert != NULL) { insert->next = entry; } + + if (len > MAX_HASH_LEN) + virHashGrow(table, MAX_HASH_LEN * table->size); + return (0); } -- 1.7.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list