summaryrefslogtreecommitdiff
path: root/hash.c
diff options
context:
space:
mode:
authorLinus Nordberg <linus@nordberg.se>2015-01-16 16:31:02 +0100
committerLinus Nordberg <linus@nordberg.se>2015-01-16 16:31:02 +0100
commit0a1fa90d723d085bc869bc423619e1a8ee421fd0 (patch)
treeb3594021fb03693cd8e04c45d4826323ed1fcf22 /hash.c
parentc2c7de6bf42a8598e9a482a452c1f3edb34d2c94 (diff)
Fix use-after-free in hash_extract().
Patch by Stephen Röttger.
Diffstat (limited to 'hash.c')
-rw-r--r--hash.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/hash.c b/hash.c
index ab17433..19d6c18 100644
--- a/hash.c
+++ b/hash.c
@@ -87,6 +87,7 @@ void *hash_read(struct hash *h, void *key, uint32_t keylen) {
void *hash_extract(struct hash *h, void *key, uint32_t keylen) {
struct list_node *ln;
struct hash_entry *e;
+ void *data;
if (!h)
return 0;
@@ -96,9 +97,10 @@ void *hash_extract(struct hash *h, void *key, uint32_t keylen) {
if (e->keylen == keylen && !memcmp(e->key, key, keylen)) {
free(e->key);
list_removedata(h->hashlist, e);
+ data = e->data;
free(e);
pthread_mutex_unlock(&h->mutex);
- return e->data;
+ return data;
}
}
pthread_mutex_unlock(&h->mutex);