diff options
author | Alex Colomar <a.colomar@f5.com> | 2022-09-09 13:40:17 +0100 |
---|---|---|
committer | Alejandro Colomar <alx.manpages@gmail.com> | 2022-09-10 02:57:42 +0200 |
commit | 558a5d3e892dab4690c9f980b3e175ac26e4e077 (patch) | |
tree | 44a5f061197eae2da7c6f4c8826cc6e4ca9c9fff /src | |
parent | 4924bd185db2c2717bf0ef6d0403c6594c1f7789 (diff) | |
download | unit-558a5d3e892dab4690c9f980b3e175ac26e4e077.tar.gz unit-558a5d3e892dab4690c9f980b3e175ac26e4e077.tar.bz2 |
Fixed a mutex leak in the C API.
In nxt_unit_create() we could leak a mutex created in
nxt_unit_ctx_init().
This could happen if nxt_unit_ctx_init() succeeded but later on we
bailed out of nxt_unit_create(), we would destroy the mutex created in
nxt_unit_create() but not the one created in nxt_unit_ctx_init().
Reorder things so that we do the call to nxt_unit_create() after all the
other checks so if it fails we don't leak the mutex it created.
Co-developed-by: Andrew Clayton <a.clayton@f5.com>
Signed-off-by: Andrew Clayton <a.clayton@f5.com>
Signed-off-by: Alex Colomar <a.colomar@f5.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/nxt_unit.c | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/src/nxt_unit.c b/src/nxt_unit.c index fd086b2c..e5cb0b58 100644 --- a/src/nxt_unit.c +++ b/src/nxt_unit.c @@ -585,9 +585,14 @@ fail: static nxt_unit_impl_t * nxt_unit_create(nxt_unit_init_t *init) { - int rc; - nxt_unit_impl_t *lib; - nxt_unit_callbacks_t *cb; + int rc; + nxt_unit_impl_t *lib; + + if (nxt_slow_path(init->callbacks.request_handler == NULL)) { + nxt_unit_alert(NULL, "request_handler is NULL"); + + return NULL; + } lib = nxt_unit_malloc(NULL, sizeof(nxt_unit_impl_t) + init->request_data_size); @@ -630,15 +635,6 @@ nxt_unit_create(nxt_unit_init_t *init) goto fail; } - cb = &lib->callbacks; - - if (cb->request_handler == NULL) { - nxt_unit_alert(NULL, "request_handler is NULL"); - - pthread_mutex_destroy(&lib->mutex); - goto fail; - } - nxt_unit_mmaps_init(&lib->incoming); nxt_unit_mmaps_init(&lib->outgoing); |