diff options
author | Dimitri Staessens <dimitri.staessens@ugent.be> | 2018-05-01 13:19:23 +0200 |
---|---|---|
committer | Sander Vrijders <sander.vrijders@ugent.be> | 2018-05-03 10:27:43 +0200 |
commit | b047b21e376411a4bda7ed24720feaa9f2a4ecee (patch) | |
tree | 1bf023ad7219114a8b52037e03edc44ea41c3799 | |
parent | b15d12f7154e80674093597697ffc6af5a4230bf (diff) | |
download | ouroboros-b047b21e376411a4bda7ed24720feaa9f2a4ecee.tar.gz ouroboros-b047b21e376411a4bda7ed24720feaa9f2a4ecee.zip |
ipcpd: Remove cookie from DHT lookup at update
The lookup struct uses the cookies to track pending request messages,
but they were not removed when a response is processed. Upon reuse of
a cookie for the next message, it could update the wrong lookup. This
removes the cookie for a lookup when it is looked for.
Signed-off-by: Dimitri Staessens <dimitri.staessens@ugent.be>
Signed-off-by: Sander Vrijders <sander.vrijders@ugent.be>
-rw-r--r-- | src/ipcpd/normal/dht.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/src/ipcpd/normal/dht.c b/src/ipcpd/normal/dht.c index f90f95e4..6d291a35 100644 --- a/src/ipcpd/normal/dht.c +++ b/src/ipcpd/normal/dht.c @@ -1021,6 +1021,7 @@ static struct lookup * dht_find_lookup(struct dht * dht, { struct list_head * p; struct list_head * p2; + struct list_head * h2; assert(dht); assert(cookie > 0); @@ -1028,10 +1029,12 @@ static struct lookup * dht_find_lookup(struct dht * dht, list_for_each(p, &dht->lookups) { struct lookup * l = list_entry(p, struct lookup, next); pthread_mutex_lock(&l->lock); - list_for_each(p2, &l->cookies) { + list_for_each_safe(p2, h2, &l->cookies) { struct cookie_el * e; e = list_entry(p2, struct cookie_el, next); if (e->cookie == cookie) { + list_del(&e->next); + free(e); pthread_mutex_unlock(&l->lock); return l; } |