diff --git a/man/depmod.8.scd b/man/depmod.8.scd index a64ee97e..1cb6cfc2 100644 --- a/man/depmod.8.scd +++ b/man/depmod.8.scd @@ -6,7 +6,7 @@ depmod - Generate modules.dep and map files. # SYNOPSIS -*depmod* [*-b* _basedir_] [*-m* _moduledir_] [*-o* _outdir_][*-o* _outdir_] [*-e*] [*-E* _Module.symvers_] +*depmod* [*-b* _basedir_] [*-m* _moduledir_] [*-o* _outdir_] [*-e*] [*-E* _Module.symvers_] \ \ \ \ \ \ \ \[*-F* _System.map_] [*-n*] [*-v*] [*-A*] [*-P* _prefix_] [*-w*] [_version_] *depmod* [*-e*] [*-E* _Module.symvers_] [*-F* _System.map_] [*-n*] [*-v*] [*-P* _prefix_] diff --git a/shared/hash.c b/shared/hash.c index 38b7bb30..d0e7f86d 100644 --- a/shared/hash.c +++ b/shared/hash.c @@ -41,7 +41,7 @@ struct hash *hash_new(unsigned int n_buckets, void (*free_value)(void *value)) hash->n_buckets = n_buckets; hash->free_value = free_value; hash->step = n_buckets / 32; - if (hash->step == 0) + if (hash->step < 4) hash->step = 4; else if (hash->step > 64) hash->step = 64; @@ -249,6 +249,9 @@ int hash_del(struct hash *hash, const char *key) .value = NULL, }; + if (bucket->entries == NULL) + return -ENOENT; + entry = bsearch(&se, bucket->entries, bucket->used, sizeof(struct hash_entry), hash_entry_cmp); if (entry == NULL) @@ -258,7 +261,7 @@ int hash_del(struct hash *hash, const char *key) hash->free_value((void *)entry->value); entry_end = bucket->entries + bucket->used; - memmove(entry, entry + 1, (entry_end - entry) * sizeof(struct hash_entry)); + memmove(entry, entry + 1, (entry_end - entry - 1) * sizeof(struct hash_entry)); bucket->used--; hash->count--; diff --git a/shared/strbuf.c b/shared/strbuf.c index dad5da52..0dd7a5b0 100644 --- a/shared/strbuf.c +++ b/shared/strbuf.c @@ -100,6 +100,9 @@ size_t strbuf_pushmem(struct strbuf *buf, const char *src, size_t sz) assert(src != NULL); assert(buf != NULL); + if (sz == 0) + return 0; + if (!strbuf_reserve_extra(buf, sz)) return 0; diff --git a/testsuite/test-hash.c b/testsuite/test-hash.c index cfe5a8e4..35cf06ed 100644 --- a/testsuite/test-hash.c +++ b/testsuite/test-hash.c @@ -171,6 +171,37 @@ static int test_hash_iter_after_del(const struct test *t) DEFINE_TEST(test_hash_iter_after_del, .description = "test hash_iter, after deleting element"); +static int test_hash_del(const struct test *t) +{ + struct hash *h = hash_new(32, NULL); + const char *k1 = "k1"; + const char *v1 = "v1"; + + hash_add(h, k1, v1); + hash_del(h, k1); + + hash_free(h); + + return 0; +} +DEFINE_TEST(test_hash_del, .description = "test add / delete a single element"); + +static int test_hash_del_nonexistent(const struct test *t) +{ + struct hash *h = hash_new(32, NULL); + const char *k1 = "k1"; + int rc; + + rc = hash_del(h, k1); + assert_return(rc == -ENOENT, EXIT_FAILURE); + + hash_free(h); + + return 0; +} +DEFINE_TEST(test_hash_del_nonexistent, + .description = "test deleting an element that doesn't exist"); + static int test_hash_free(const struct test *t) { struct hash *h = hash_new(8, countfreecalls); diff --git a/testsuite/test-strbuf.c b/testsuite/test-strbuf.c index e77fbdb9..50c75d92 100644 --- a/testsuite/test-strbuf.c +++ b/testsuite/test-strbuf.c @@ -191,6 +191,7 @@ static int test_strbuf_pushmem(const struct test *t) size_t size; strbuf_init(&buf); + strbuf_pushmem(&buf, "", 0); strbuf_reserve_extra(&buf, strlen(TEXT) + 1); size = buf.size; strbuf_pushmem(&buf, TEXT, strlen(TEXT) + 1);