diff options
Diffstat (limited to 'source4/smbd')
-rw-r--r-- | source4/smbd/process_single.c | 10 | ||||
-rw-r--r-- | source4/smbd/process_standard.c | 10 | ||||
-rw-r--r-- | source4/smbd/process_thread.c | 12 | ||||
-rw-r--r-- | source4/smbd/service.c | 37 |
4 files changed, 28 insertions, 41 deletions
diff --git a/source4/smbd/process_single.c b/source4/smbd/process_single.c index 62d780277c..12a265b62f 100644 --- a/source4/smbd/process_single.c +++ b/source4/smbd/process_single.c @@ -71,15 +71,7 @@ static void single_terminate_connection(struct server_connection *conn, const ch DEBUG(2,("single_terminate_connection: reason[%s]\n",reason)); if (conn) { - if (conn->service) { - conn->service->ops->close_connection(conn,reason); - } - - if (conn->server_socket) { - DLIST_REMOVE(conn->server_socket->connection_list,conn); - } - - server_destroy_connection(conn); + talloc_free(conn); } } diff --git a/source4/smbd/process_standard.c b/source4/smbd/process_standard.c index 1bb30c2ef0..194c6d24cc 100644 --- a/source4/smbd/process_standard.c +++ b/source4/smbd/process_standard.c @@ -94,15 +94,7 @@ static void standard_terminate_connection(struct server_connection *conn, const DEBUG(2,("single_terminate_connection: reason[%s]\n",reason)); if (conn) { - if (conn->service) { - conn->service->ops->close_connection(conn,reason); - } - - if (conn->server_socket) { - DLIST_REMOVE(conn->server_socket->connection_list,conn); - } - - server_destroy_connection(conn); + talloc_free(conn->service->srv_ctx); } /* terminate this process */ diff --git a/source4/smbd/process_thread.c b/source4/smbd/process_thread.c index 4e11137f37..55688f85e8 100644 --- a/source4/smbd/process_thread.c +++ b/source4/smbd/process_thread.c @@ -117,17 +117,7 @@ static void thread_terminate_connection(struct server_connection *conn, const ch DEBUG(0,("thread_terminate_connection: reason[%s]\n",reason)); if (conn) { - if (conn->service) { - conn->service->ops->close_connection(conn,reason); - } - - if (conn->server_socket) { - MUTEX_LOCK_BY_ID(MUTEX_SMBD); - DLIST_REMOVE(conn->server_socket->connection_list,conn); - MUTEX_UNLOCK_BY_ID(MUTEX_SMBD); - } - - server_destroy_connection(conn); + talloc_free(conn); } /* terminate this thread */ diff --git a/source4/smbd/service.c b/source4/smbd/service.c index e3eb4a02c1..1f6033c238 100644 --- a/source4/smbd/service.c +++ b/source4/smbd/service.c @@ -172,6 +172,29 @@ struct server_socket *service_setup_socket(struct server_service *service, return srv_sock; } +/* + destructor that handles necessary event context changes + */ +static int server_destructor(void *ptr) +{ + struct server_connection *conn = ptr; + + if (conn->service) { + conn->service->ops->close_connection(conn, "shutdown"); + } + + socket_destroy(conn->socket); + + event_remove_fd(conn->event.ctx, conn->event.fde); + conn->event.fde = NULL; + event_remove_timed(conn->event.ctx, conn->event.idle); + conn->event.idle = NULL; + + DLIST_REMOVE(conn->server_socket->connection_list, conn); + + return 0; +} + struct server_connection *server_setup_connection(struct event_context *ev, struct server_socket *server_socket, struct socket_context *sock, @@ -215,6 +238,8 @@ struct server_connection *server_setup_connection(struct event_context *ev, srv_conn->event.fde = event_add_fd(ev,&fde); srv_conn->event.idle = event_add_timed(ev,&idle); + talloc_set_destructor(srv_conn, server_destructor); + if (!socket_check_access(sock, "smbd", lp_hostsallow(-1), lp_hostsdeny(-1))) { server_terminate_connection(srv_conn, "denied by access rules"); return NULL; @@ -232,18 +257,6 @@ void server_terminate_connection(struct server_connection *srv_conn, const char srv_conn->service->model_ops->terminate_connection(srv_conn, reason); } -void server_destroy_connection(struct server_connection *srv_conn) -{ - socket_destroy(srv_conn->socket); - - event_remove_fd(srv_conn->event.ctx, srv_conn->event.fde); - srv_conn->event.fde = NULL; - event_remove_timed(srv_conn->event.ctx, srv_conn->event.idle); - srv_conn->event.idle = NULL; - - talloc_free(srv_conn); -} - void server_io_handler(struct event_context *ev, struct fd_event *fde, time_t t, uint16_t flags) { struct server_connection *conn = fde->private; |