summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/smbd/process_single.c31
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);
}