static void single_terminate_connection(struct server_connection *conn, const char *reason)
{
DEBUG(0,("single_terminate_connection: reason[%s]\n",reason));
- conn->service->ops->close_connection(conn,reason);
- server_destroy_connection(conn);
+
+ 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);
+ }
}
static int single_get_id(struct smbsrv_request *req)
static void standard_terminate_connection(struct server_connection *conn, const char *reason)
{
DEBUG(0,("single_terminate_connection: reason[%s]\n",reason));
- conn->service->ops->close_connection(conn,reason);
- server_destroy_connection(conn);
+
+ 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);
+ }
+
/* terminate this process */
exit(0);
}
static void thread_terminate_connection(struct server_connection *conn, const char *reason)
{
DEBUG(0,("thread_terminate_connection: reason[%s]\n",reason));
- conn->service->ops->close_connection(conn,reason);
- server_destroy_connection(conn);
+
+ 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);
+ }
+
/* terminate this thread */
pthread_exit(NULL); /* thread cleanup routine will do actual cleanup */
}
void server_destroy_connection(struct server_connection *srv_conn)
{
close(srv_conn->event.fde->fd);
+
event_remove_fd(srv_conn->event.ctx, srv_conn->event.fde);
event_remove_timed(srv_conn->event.ctx, srv_conn->event.idle);
+
+ talloc_destroy(srv_conn->mem_ctx);
}
void server_io_handler(struct event_context *ev, struct fd_event *fde, time_t t, uint16_t flags)