Fixed memory leak occurring upon failure to accept a connection.

This commit is contained in:
Igor Sysoev
2020-04-15 15:10:14 +03:00
parent 04143c8c7e
commit ee62736a11
2 changed files with 11 additions and 12 deletions

View File

@@ -106,7 +106,7 @@ typedef struct {
nxt_work_handler_t accept; nxt_work_handler_t accept;
nxt_listen_socket_t *listen; nxt_listen_socket_t *listen;
nxt_conn_t *next; /* STUB */ nxt_conn_t *next;
nxt_work_queue_t *work_queue; nxt_work_queue_t *work_queue;
nxt_timer_t timer; nxt_timer_t timer;

View File

@@ -101,12 +101,12 @@ nxt_conn_accept_alloc(nxt_task_t *task, nxt_listen_event_t *lev)
goto fail; goto fail;
} }
lev->next = c;
c->socket.read_work_queue = lev->socket.read_work_queue; c->socket.read_work_queue = lev->socket.read_work_queue;
c->socket.write_ready = 1; c->socket.write_ready = 1;
c->remote = nxt_sockaddr_cache_alloc(engine, lev->listen); c->remote = nxt_sockaddr_cache_alloc(engine, lev->listen);
if (nxt_fast_path(c->remote != NULL)) { if (nxt_fast_path(c->remote != NULL)) {
lev->next = c;
return c; return c;
} }
} }
@@ -199,6 +199,7 @@ nxt_conn_accept(nxt_task_t *task, nxt_listen_event_t *lev, nxt_conn_t *c)
c->listen = lev; c->listen = lev;
lev->count++; lev->count++;
lev->next = NULL;
c->socket.data = NULL; c->socket.data = NULL;
c->read_work_queue = lev->work_queue; c->read_work_queue = lev->work_queue;
@@ -230,13 +231,15 @@ nxt_conn_accept_next(nxt_task_t *task, nxt_listen_event_t *lev)
{ {
nxt_conn_t *c; nxt_conn_t *c;
lev->next = NULL; c = lev->next;
if (c == NULL) {
c = nxt_conn_accept_alloc(task, lev); c = nxt_conn_accept_alloc(task, lev);
if (nxt_slow_path(c == NULL)) { if (nxt_slow_path(c == NULL)) {
nxt_conn_accept_close_idle(task, lev); nxt_conn_accept_close_idle(task, lev);
} }
}
return c; return c;
} }
@@ -355,15 +358,11 @@ nxt_conn_listen_timer_handler(nxt_task_t *task, void *obj, void *data)
timer = obj; timer = obj;
lev = nxt_timer_data(timer, nxt_listen_event_t, timer); lev = nxt_timer_data(timer, nxt_listen_event_t, timer);
c = lev->next;
if (c == NULL) {
c = nxt_conn_accept_next(task, lev); c = nxt_conn_accept_next(task, lev);
if (c == NULL) { if (c == NULL) {
return; return;
} }
}
nxt_fd_event_enable_accept(task->thread->engine, &lev->socket); nxt_fd_event_enable_accept(task->thread->engine, &lev->socket);