aboutsummaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2020-05-23 19:02:31 -0700
committerGarrett D'Amore <garrett@damore.org>2020-05-23 19:02:31 -0700
commit6f084d8c33e44cc69c7e5f29b6e169d7f34d0e0b (patch)
treeda29c567f7c308c50ea6a6dbd30bfb410df53915 /src/core
parent20fd6f2b50b804deb9edf7a5ee82a32d8835138d (diff)
downloadnng-6f084d8c33e44cc69c7e5f29b6e169d7f34d0e0b.tar.gz
nng-6f084d8c33e44cc69c7e5f29b6e169d7f34d0e0b.tar.bz2
nng-6f084d8c33e44cc69c7e5f29b6e169d7f34d0e0b.zip
fixes #1239 Use after free in tls
Also, addressed a number of Clang-tidy complaints. Potential hangs in close addressed as well.
Diffstat (limited to 'src/core')
-rw-r--r--src/core/defs.h68
-rw-r--r--src/core/dialer.c4
-rw-r--r--src/core/listener.c7
3 files changed, 43 insertions, 36 deletions
diff --git a/src/core/defs.h b/src/core/defs.h
index eaba7428..1dffdad0 100644
--- a/src/core/defs.h
+++ b/src/core/defs.h
@@ -85,50 +85,50 @@ typedef struct {
#define NNI_ALLOC_STRUCTS(s, n) nni_zalloc(sizeof(*s) * n)
#define NNI_FREE_STRUCTS(s, n) nni_free(s, sizeof(*s) * n)
-#define NNI_PUT16(ptr, u) \
- do { \
- (ptr)[0] = (uint8_t)(((uint16_t)(u)) >> 8); \
- (ptr)[1] = (uint8_t)((uint16_t)(u)); \
+#define NNI_PUT16(ptr, u) \
+ do { \
+ (ptr)[0] = (uint8_t)(((uint16_t)(u)) >> 8u); \
+ (ptr)[1] = (uint8_t)((uint16_t)(u)); \
} while (0)
-#define NNI_PUT32(ptr, u) \
- do { \
- (ptr)[0] = (uint8_t)(((uint32_t)(u)) >> 24); \
- (ptr)[1] = (uint8_t)(((uint32_t)(u)) >> 16); \
- (ptr)[2] = (uint8_t)(((uint32_t)(u)) >> 8); \
- (ptr)[3] = (uint8_t)((uint32_t)(u)); \
+#define NNI_PUT32(ptr, u) \
+ do { \
+ (ptr)[0] = (uint8_t)(((uint32_t)(u)) >> 24u); \
+ (ptr)[1] = (uint8_t)(((uint32_t)(u)) >> 16u); \
+ (ptr)[2] = (uint8_t)(((uint32_t)(u)) >> 8u); \
+ (ptr)[3] = (uint8_t)((uint32_t)(u)); \
} while (0)
-#define NNI_PUT64(ptr, u) \
- do { \
- (ptr)[0] = (uint8_t)(((uint64_t)(u)) >> 56); \
- (ptr)[1] = (uint8_t)(((uint64_t)(u)) >> 48); \
- (ptr)[2] = (uint8_t)(((uint64_t)(u)) >> 40); \
- (ptr)[3] = (uint8_t)(((uint64_t)(u)) >> 32); \
- (ptr)[4] = (uint8_t)(((uint64_t)(u)) >> 24); \
- (ptr)[5] = (uint8_t)(((uint64_t)(u)) >> 16); \
- (ptr)[6] = (uint8_t)(((uint64_t)(u)) >> 8); \
- (ptr)[7] = (uint8_t)((uint64_t)(u)); \
+#define NNI_PUT64(ptr, u) \
+ do { \
+ (ptr)[0] = (uint8_t)(((uint64_t)(u)) >> 56u); \
+ (ptr)[1] = (uint8_t)(((uint64_t)(u)) >> 48u); \
+ (ptr)[2] = (uint8_t)(((uint64_t)(u)) >> 40u); \
+ (ptr)[3] = (uint8_t)(((uint64_t)(u)) >> 32u); \
+ (ptr)[4] = (uint8_t)(((uint64_t)(u)) >> 24u); \
+ (ptr)[5] = (uint8_t)(((uint64_t)(u)) >> 16u); \
+ (ptr)[6] = (uint8_t)(((uint64_t)(u)) >> 8u); \
+ (ptr)[7] = (uint8_t)((uint64_t)(u)); \
} while (0)
-#define NNI_GET16(ptr, v) \
- v = (((uint16_t)((uint8_t)(ptr)[0])) << 8) + \
+#define NNI_GET16(ptr, v) \
+ v = (((uint16_t)((uint8_t)(ptr)[0])) << 8u) + \
(((uint16_t)(uint8_t)(ptr)[1]))
-#define NNI_GET32(ptr, v) \
- v = (((uint32_t)((uint8_t)(ptr)[0])) << 24) + \
- (((uint32_t)((uint8_t)(ptr)[1])) << 16) + \
- (((uint32_t)((uint8_t)(ptr)[2])) << 8) + \
+#define NNI_GET32(ptr, v) \
+ v = (((uint32_t)((uint8_t)(ptr)[0])) << 24u) + \
+ (((uint32_t)((uint8_t)(ptr)[1])) << 16u) + \
+ (((uint32_t)((uint8_t)(ptr)[2])) << 8u) + \
(((uint32_t)(uint8_t)(ptr)[3]))
-#define NNI_GET64(ptr, v) \
- v = (((uint64_t)((uint8_t)(ptr)[0])) << 56) + \
- (((uint64_t)((uint8_t)(ptr)[1])) << 48) + \
- (((uint64_t)((uint8_t)(ptr)[2])) << 40) + \
- (((uint64_t)((uint8_t)(ptr)[3])) << 32) + \
- (((uint64_t)((uint8_t)(ptr)[4])) << 24) + \
- (((uint64_t)((uint8_t)(ptr)[5])) << 16) + \
- (((uint64_t)((uint8_t)(ptr)[6])) << 8) + \
+#define NNI_GET64(ptr, v) \
+ v = (((uint64_t)((uint8_t)(ptr)[0])) << 56u) + \
+ (((uint64_t)((uint8_t)(ptr)[1])) << 48u) + \
+ (((uint64_t)((uint8_t)(ptr)[2])) << 40u) + \
+ (((uint64_t)((uint8_t)(ptr)[3])) << 32u) + \
+ (((uint64_t)((uint8_t)(ptr)[4])) << 24u) + \
+ (((uint64_t)((uint8_t)(ptr)[5])) << 16u) + \
+ (((uint64_t)((uint8_t)(ptr)[6])) << 8u) + \
(((uint64_t)(uint8_t)(ptr)[7]))
// This increments a pointer a fixed number of byte cells.
diff --git a/src/core/dialer.c b/src/core/dialer.c
index 8a463452..fe9cb92f 100644
--- a/src/core/dialer.c
+++ b/src/core/dialer.c
@@ -1,5 +1,5 @@
//
-// Copyright 2019 Staysail Systems, Inc. <info@staysail.tech>
+// Copyright 2020 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
// Copyright 2018 Devolutions <info@devolutions.net>
//
@@ -345,10 +345,12 @@ dialer_connect_cb(void *arg)
break;
case NNG_ECLOSED: // No further action.
case NNG_ECANCELED: // No further action.
+ nni_dialer_bump_error(d, rv);
break;
case NNG_ECONNREFUSED:
case NNG_ETIMEDOUT:
default:
+ nni_dialer_bump_error(d, rv);
if (user_aio == NULL) {
nni_dialer_timer_start(d);
} else {
diff --git a/src/core/listener.c b/src/core/listener.c
index 87d2c532..1fde6e36 100644
--- a/src/core/listener.c
+++ b/src/core/listener.c
@@ -324,8 +324,9 @@ listener_accept_cb(void *arg)
{
nni_listener *l = arg;
nni_aio * aio = l->l_acc_aio;
+ int rv;
- switch (nni_aio_result(aio)) {
+ switch ((rv = nni_aio_result(aio))) {
case 0:
BUMP_STAT(&l->l_stats.s_accept);
nni_listener_add_pipe(l, nni_aio_get_output(aio, 0));
@@ -335,10 +336,12 @@ listener_accept_cb(void *arg)
case NNG_ECONNRESET: // remote condition, no cool down
case NNG_ETIMEDOUT: // No need to sleep, we timed out already.
case NNG_EPEERAUTH: // peer validation failure
+ nni_listener_bump_error(l, rv);
listener_accept_start(l);
break;
case NNG_ECLOSED: // no further action
case NNG_ECANCELED: // no further action
+ nni_listener_bump_error(l, rv);
break;
default:
// We don't really know why we failed, but we back off
@@ -346,6 +349,7 @@ listener_accept_cb(void *arg)
// to system failures (resource exhaustion) and we hope
// by not thrashing we give the system a chance to
// recover. 100 ms is enough to cool down.
+ nni_listener_bump_error(l, rv);
nni_sleep_aio(100, l->l_tmo_aio);
break;
}
@@ -371,6 +375,7 @@ nni_listener_start(nni_listener *l, int flags)
}
if ((rv = l->l_ops.l_bind(l->l_data)) != 0) {
+ nni_listener_bump_error(l, rv);
nni_atomic_flag_reset(&l->l_started);
return (rv);
}