diff options
-rw-r--r-- | source4/smbd/process_single.c | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/source4/smbd/process_single.c b/source4/smbd/process_single.c index 5d3c36adb9..2d3c94ca6d 100644 --- a/source4/smbd/process_single.c +++ b/source4/smbd/process_single.c @@ -52,19 +52,26 @@ static void single_accept_connection(struct event_context *ev, status = socket_accept(sock, &sock2); if (!NT_STATUS_IS_OK(status)) { DEBUG(0,("single_accept_connection: accept: %s\n", nt_errstr(status))); - /* this looks strange, but is correct. We need to - throttle things until the system clears enough - resources to handle this new socket. If we don't - then we will spin filling the log and causing more - problems. We don't panic as this is probably a - temporary resource constraint */ + /* this looks strange, but is correct. + + We can only be here if woken up from select, due to + an incomming connection. + + We need to throttle things until the system clears + enough resources to handle this new socket. + + If we don't then we will spin filling the log and + causing more problems. We don't panic as this is + probably a temporary resource constraint */ sleep(1); return; } talloc_steal(private, sock); - new_conn(ev, lp_ctx, sock2, cluster_id(socket_get_fd(sock2)), private); + /* The cluster_id(0, fd) cannot collide with the incrementing + * task below, as the first component is 0, not 1 */ + new_conn(ev, lp_ctx, sock2, cluster_id(0, socket_get_fd(sock2)), private); } /* @@ -72,11 +79,17 @@ static void single_accept_connection(struct event_context *ev, */ static void single_new_task(struct event_context *ev, struct loadparm_context *lp_ctx, + const char *service_name, void (*new_task)(struct event_context *, struct loadparm_context *, struct server_id, void *), void *private) { - static uint32_t taskid = 0x10000000; - new_task(ev, lp_ctx, cluster_id(taskid++), private); + static uint32_t taskid = 0; + + /* We use 1 so we cannot collide in with cluster ids generated + * in the accept connection above, and unlikly to collide with + * PIDs from process modal standard (don't run samba as + * init) */ + new_task(ev, lp_ctx, cluster_id(1, taskid++), private); } |