From 6c8491ba7ceb656b0d5b329490a4b90c91fb3538 Mon Sep 17 00:00:00 2001 From: Linus Nordberg Date: Fri, 28 Jul 2017 10:04:29 +0200 Subject: Add mutex guarding realm refcount. --- radsecproxy.c | 14 +++++++++++--- radsecproxy.h | 1 + 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/radsecproxy.c b/radsecproxy.c index 815e927..7029d8a 100644 --- a/radsecproxy.c +++ b/radsecproxy.c @@ -744,8 +744,11 @@ int msmppdecrypt(uint8_t *text, uint8_t len, uint8_t *shared, uint8_t sharedlen, } struct realm *newrealmref(struct realm *r) { - if (r) + if (r) { + pthread_mutex_lock(&r->refmutex); r->refcount++; + pthread_mutex_unlock(&r->refmutex); + } return r; } @@ -2120,12 +2123,16 @@ void freerealm(struct realm *realm) { if (!realm) return; debug(DBG_DBG, "freerealm: called with refcount %d", realm->refcount); - if (--realm->refcount) + pthread_mutex_lock(&realm->refmutex); + --realm->refcount; + pthread_mutex_unlock(&realm->refmutex); + if (realm->refcount) return; free(realm->name); free(realm->message); regfree(&realm->regex); + pthread_mutex_destroy(&realm->refmutex); pthread_mutex_destroy(&realm->mutex); /* if refcount == 0, all subrealms gone */ list_destroy(realm->subrealms); @@ -2181,7 +2188,8 @@ struct realm *addrealm(struct list *realmlist, char *value, char **servers, char } memset(realm, 0, sizeof(struct realm)); - if (pthread_mutex_init(&realm->mutex, NULL)) { + if (pthread_mutex_init(&realm->mutex, NULL) || + pthread_mutex_init(&realm->refmutex, NULL)) { debugerrno(errno, DBG_ERR, "mutex init failed"); free(realm); realm = NULL; diff --git a/radsecproxy.h b/radsecproxy.h index bbb9b58..4019231 100644 --- a/radsecproxy.h +++ b/radsecproxy.h @@ -184,6 +184,7 @@ struct realm { uint8_t accresp; regex_t regex; uint32_t refcount; + pthread_mutex_t refmutex; pthread_mutex_t mutex; struct realm *parent; struct list *subrealms; -- cgit v1.1