From d3e943adc56bd6458b1c2b68af8f677ce28656bb Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 28 Sep 2010 18:40:49 +0200 Subject: [PATCH] s3: Attempt to fix bug 7518 If select returns -1, we can't rely on the fd sets. The current code might loop endlessly because when putting an invalid fd (the closed socket?) on the read set, a select implementation might choose not to touch it but directly return with EINVAL. Thus run_events will see the socket readable, which leads to a "return true", and thus a NT_STATUS_RETRY -> same game again. We should never get into this situation, but to me the logfiles given in bug 7518 do not reveal enough information to understand how this can happen. --- source3/smbd/process.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source3/smbd/process.c b/source3/smbd/process.c index 3367d70..5d4b6b0 100644 --- a/source3/smbd/process.c +++ b/source3/smbd/process.c @@ -837,16 +837,16 @@ static NTSTATUS smbd_server_connection_loop_once(struct smbd_server_connection * errno = sav; } - if (run_events(smbd_event_context(), selrtn, &r_fds, &w_fds)) { - return NT_STATUS_RETRY; - } - /* Check if error */ if (selrtn == -1) { /* something is wrong. Maybe the socket is dead? */ return map_nt_error_from_unix(errno); } + if (run_events(smbd_event_context(), selrtn, &r_fds, &w_fds)) { + return NT_STATUS_RETRY; + } + /* Did we timeout ? */ if (selrtn == 0) { return NT_STATUS_RETRY; -- 1.6.5.7