summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorValentin Bartenev <vbart@nginx.com>2020-08-05 14:55:34 +0300
committerValentin Bartenev <vbart@nginx.com>2020-08-05 14:55:34 +0300
commit2b53c7bbbd518131b46867343caaad18534ebd8f (patch)
tree549ddf04ba00def255db7a04685d309fbb2fd283
parentb28b4459b0899cb8357df5f6c1e904fd1a34ebe3 (diff)
downloadunit-2b53c7bbbd518131b46867343caaad18534ebd8f.tar.gz
unit-2b53c7bbbd518131b46867343caaad18534ebd8f.tar.bz2
Fixed nxt_conn_accept_alloc() behavior in low memory conditions.
Earlier, if nxt_mp_create() failed to allocate memory while accepting a new connection, the resulting NULL was subsequently passed to nxt_mp_destroy(), crashing the process. More, if nxt_mp_create() was successful but nxt_sockaddr_cache_alloc() failed, the connection object wasn't destroyed properly, leaving the connection counter in an inconsistent state. Repeated, this condition lowered the connection capacity of the process and could eventually prevent it from accepting connections altogether.
Diffstat (limited to '')
-rw-r--r--src/nxt_conn_accept.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/src/nxt_conn_accept.c b/src/nxt_conn_accept.c
index 6a89840c..77c44c58 100644
--- a/src/nxt_conn_accept.c
+++ b/src/nxt_conn_accept.c
@@ -98,7 +98,9 @@ nxt_conn_accept_alloc(nxt_task_t *task, nxt_listen_event_t *lev)
if (nxt_fast_path(mp != NULL)) {
c = nxt_conn_create(mp, lev->socket.task);
if (nxt_slow_path(c == NULL)) {
- goto fail;
+ nxt_mp_destroy(mp);
+
+ return NULL;
}
c->socket.read_work_queue = lev->socket.read_work_queue;
@@ -109,11 +111,9 @@ nxt_conn_accept_alloc(nxt_task_t *task, nxt_listen_event_t *lev)
lev->next = c;
return c;
}
- }
- fail:
-
- nxt_mp_destroy(mp);
+ nxt_conn_free(task, c);
+ }
}
return NULL;