Fixed memory leak occurring upon failure to accept a connection.
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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,12 +231,14 @@ 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;
|
||||||
|
|
||||||
c = nxt_conn_accept_alloc(task, lev);
|
if (c == NULL) {
|
||||||
|
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,14 +358,10 @@ 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;
|
|
||||||
|
|
||||||
|
c = nxt_conn_accept_next(task, lev);
|
||||||
if (c == NULL) {
|
if (c == NULL) {
|
||||||
c = nxt_conn_accept_next(task, lev);
|
return;
|
||||||
|
|
||||||
if (c == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
nxt_fd_event_enable_accept(task->thread->engine, &lev->socket);
|
nxt_fd_event_enable_accept(task->thread->engine, &lev->socket);
|
||||||
|
|||||||
Reference in New Issue
Block a user