diff options
| author | dimitri staessens <dimitri.staessens@ugent.be> | 2017-09-23 10:33:54 +0200 | 
|---|---|---|
| committer | dimitri staessens <dimitri.staessens@ugent.be> | 2017-09-23 10:33:54 +0200 | 
| commit | 17ab2b6d6bc95337d5fd54e058c0822260dbacf1 (patch) | |
| tree | ba23c49b6b7c19394bdfcd65f9e088c878f3d374 /src/ipcpd/normal | |
| parent | 30b6998337635a37db93680760637dae759c951d (diff) | |
| download | ouroboros-17ab2b6d6bc95337d5fd54e058c0822260dbacf1.tar.gz ouroboros-17ab2b6d6bc95337d5fd54e058c0822260dbacf1.zip | |
ipcpd: Lock dht before reading parameters
Diffstat (limited to 'src/ipcpd/normal')
| -rw-r--r-- | src/ipcpd/normal/dht.c | 21 | 
1 files changed, 14 insertions, 7 deletions
| diff --git a/src/ipcpd/normal/dht.c b/src/ipcpd/normal/dht.c index af1686a9..2e6f60ab 100644 --- a/src/ipcpd/normal/dht.c +++ b/src/ipcpd/normal/dht.c @@ -1961,7 +1961,7 @@ static int kad_handle_join_resp(struct dht *     dht,                  return -1;          } -        pthread_rwlock_wrlock(&dht->lock); +        pthread_rwlock_rdlock(&dht->lock);          dht->buckets = bucket_create();          if (dht->buckets == NULL) { @@ -1992,8 +1992,6 @@ static int kad_handle_join_resp(struct dht *     dht,          kad_req_respond(req); -        dht_update_bucket(dht, msg->s_id.data, msg->s_addr); -          pthread_rwlock_unlock(&dht->lock);          log_dbg("Enrollment of DHT completed."); @@ -2223,6 +2221,8 @@ static void * dht_handle_sdu(void * o)          uint64_t             addr;          buffer_t             buf;          size_t               i; +        size_t               b; +        size_t               t_expire;          assert(o); @@ -2247,13 +2247,20 @@ static void * dht_handle_sdu(void * o)                  return (void *) -1;          } -        if (msg->has_key && msg->key.len != dht->b) { +        pthread_rwlock_rdlock(&dht->lock); + +        b        = dht->b; +        t_expire = dht->t_expire; + +        pthread_rwlock_unlock(&dht->lock); + +        if (msg->has_key && msg->key.len != b) {                  kad_msg__free_unpacked(msg, NULL);                  log_warn("Bad key in message.");                  return (void *) -1;          } -        if (msg->has_s_id && !msg->has_b && msg->s_id.len != dht->b) { +        if (msg->has_s_id && !msg->has_b && msg->s_id.len != b) {                  kad_msg__free_unpacked(msg, NULL);                  log_warn("Bad source ID in message of type %d.", msg->code);                  return (void *) -1; @@ -2299,9 +2306,9 @@ static void * dht_handle_sdu(void * o)                  resp_msg.has_t_refresh   = true;                  resp_msg.has_t_replicate = true;                  resp_msg.alpha           = KAD_ALPHA; -                resp_msg.b               = dht->b; +                resp_msg.b               = b;                  resp_msg.k               = KAD_K; -                resp_msg.t_expire        = dht->t_expire; +                resp_msg.t_expire        = t_expire;                  resp_msg.t_refresh       = KAD_T_REFR;                  resp_msg.t_replicate     = KAD_T_REPL;                  break; | 
