diff options
| author | Dimitri Staessens <dimitri@ouroboros.rocks> | 2021-12-27 12:57:51 +0100 | 
|---|---|---|
| committer | Sander Vrijders <sander@ouroboros.rocks> | 2021-12-29 09:12:27 +0100 | 
| commit | 98cd70a4b2358d8dd1c3b6e4a061d7eaadcb3bd1 (patch) | |
| tree | 5915f73c23cf51ad2bebc5ee43bec934e24f2280 /src/ipcpd/unicast/pff | |
| parent | ebf1b0c7415f394712c8dd71ae8c8e6821fd5fa3 (diff) | |
| download | ouroboros-98cd70a4b2358d8dd1c3b6e4a061d7eaadcb3bd1.tar.gz ouroboros-98cd70a4b2358d8dd1c3b6e4a061d7eaadcb3bd1.zip | |
ipcpd: Use wrlock for rotating multipath pff entry
The multipath pff entry was modified (rotated) under a read lock,
which is now changed to a write lock.
Signed-off-by: Dimitri Staessens <dimitri@ouroboros.rocks>
Signed-off-by: Sander Vrijders <sander@ouroboros.rocks>
Diffstat (limited to 'src/ipcpd/unicast/pff')
| -rw-r--r-- | src/ipcpd/unicast/pff/multipath.c | 26 | 
1 files changed, 14 insertions, 12 deletions
| diff --git a/src/ipcpd/unicast/pff/multipath.c b/src/ipcpd/unicast/pff/multipath.c index 43135d27..b03ce32f 100644 --- a/src/ipcpd/unicast/pff/multipath.c +++ b/src/ipcpd/unicast/pff/multipath.c @@ -58,21 +58,23 @@ struct pff_i * multipath_pff_create(void)          tmp = malloc(sizeof(*tmp));          if (tmp == NULL) -                return NULL; +                goto fail_malloc; -        if (pthread_rwlock_init(&tmp->lock, NULL)) { -                free(tmp); -                return NULL; -        } +        if (pthread_rwlock_init(&tmp->lock, NULL)) +                goto fail_rwlock;          tmp->pft = pft_create(PFT_SIZE, false); -        if (tmp->pft == NULL) { -                pthread_rwlock_destroy(&tmp->lock); -                free(tmp); -                return NULL; -        } +        if (tmp->pft == NULL) +                goto fail_pft;          return tmp; + + fail_pft: +        pthread_rwlock_destroy(&tmp->lock); + fail_rwlock: +        free(tmp); + fail_malloc: +        return NULL;  }  void multipath_pff_destroy(struct pff_i * pff_i) @@ -80,8 +82,8 @@ void multipath_pff_destroy(struct pff_i * pff_i)          assert(pff_i);          pft_destroy(pff_i->pft); -          pthread_rwlock_destroy(&pff_i->lock); +          free(pff_i);  } @@ -177,7 +179,7 @@ int multipath_pff_nhop(struct pff_i * pff_i,          assert(pff_i); -        pthread_rwlock_rdlock(&pff_i->lock); +        pthread_rwlock_wrlock(&pff_i->lock);          if (pft_lookup(pff_i->pft, addr, &fds, &len)) {                  pthread_rwlock_unlock(&pff_i->lock); | 
