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 /src/ipcpd | |
| 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>
Diffstat (limited to 'src/ipcpd')
| -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;                          } | 
