aboutsummaryrefslogtreecommitdiff
path: root/src/supplemental/tls/tls_common.c
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2019-05-19 14:33:36 -0700
committerGarrett D'Amore <garrett@damore.org>2019-05-19 14:33:36 -0700
commit6fe3ff90cd86d539371403381f6c580fc097e689 (patch)
treea214819298baf6d6e53d6abd7cff9a0271488d7f /src/supplemental/tls/tls_common.c
parentc40cc5d16dbb22c46e47a1028265b8ee9fb5df27 (diff)
downloadnng-6fe3ff90cd86d539371403381f6c580fc097e689.tar.gz
nng-6fe3ff90cd86d539371403381f6c580fc097e689.tar.bz2
nng-6fe3ff90cd86d539371403381f6c580fc097e689.zip
fix #946 Use after free in TLS
This also introduces a more efficient reference counting usage based on atomics, rather than locks.
Diffstat (limited to 'src/supplemental/tls/tls_common.c')
-rw-r--r--src/supplemental/tls/tls_common.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/src/supplemental/tls/tls_common.c b/src/supplemental/tls/tls_common.c
index 990d3add..97bcce26 100644
--- a/src/supplemental/tls/tls_common.c
+++ b/src/supplemental/tls/tls_common.c
@@ -160,14 +160,14 @@ tls_dialer_set_config(void *arg, const void *buf, size_t sz, nni_type t)
if (cfg == NULL) {
return (NNG_EINVAL);
}
- nni_mtx_lock(&d->lk);
- old = d->cfg;
nng_tls_config_hold(cfg);
+
+ nni_mtx_lock(&d->lk);
+ old = d->cfg;
d->cfg = cfg;
nni_mtx_unlock(&d->lk);
- if (old != NULL) {
- nng_tls_config_free(old);
- }
+
+ nng_tls_config_free(old);
return (0);
}
@@ -432,14 +432,15 @@ tls_listener_set_config(void *arg, const void *buf, size_t sz, nni_type t)
return (NNG_EINVAL);
}
- nni_mtx_lock(&l->lk);
- old = l->cfg;
nng_tls_config_hold(cfg);
+
+ nni_mtx_lock(&l->lk);
+ old = l->cfg;
l->cfg = cfg;
nni_mtx_unlock(&l->lk);
- if (old != NULL) {
- nng_tls_config_free(old);
- }
+
+ nng_tls_config_free(old);
+
return (0);
}