summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAlex Colomar <a.colomar@f5.com>2022-09-09 13:40:17 +0100
committerAlejandro Colomar <alx.manpages@gmail.com>2022-09-10 02:57:42 +0200
commit558a5d3e892dab4690c9f980b3e175ac26e4e077 (patch)
tree44a5f061197eae2da7c6f4c8826cc6e4ca9c9fff
parent4924bd185db2c2717bf0ef6d0403c6594c1f7789 (diff)
downloadunit-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>
-rw-r--r--docs/changes.xml6
-rw-r--r--src/nxt_unit.c20
2 files changed, 14 insertions, 12 deletions
diff --git a/docs/changes.xml b/docs/changes.xml
index 989001dd..0175fd33 100644
--- a/docs/changes.xml
+++ b/docs/changes.xml
@@ -122,6 +122,12 @@ the prototype crashed.
</para>
</change>
+<change type="bugfix">
+<para>
+mutex leak in the C API.
+</para>
+</change>
+
</changes>
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);