summaryrefslogtreecommitdiff
path: root/source3/smbd/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/smbd/server.c')
-rw-r--r--source3/smbd/server.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/source3/smbd/server.c b/source3/smbd/server.c
index ecc8e4ce9c..3ececed393 100644
--- a/source3/smbd/server.c
+++ b/source3/smbd/server.c
@@ -3445,6 +3445,27 @@ static void process(void)
t = time(NULL);
+ {
+ /* the following bit of code was added to combat smbd
+ looping chewing lots of CPU time. It should never
+ actually be needed, but it seems that some systems
+ don't set error correctly, which is used to distinguish
+ a select() timeout from a read error
+
+ we exit if receive_smb() returns false 3 times in one second.
+ */
+ static int error_count=0;
+ static time_t error_time=0;
+ if (error_count==0) {
+ error_time = t;
+ } else if (error_time != t) {
+ error_count = 0;
+ } else if (error_count++ > 2) {
+ exit_server("looping in process()\n");
+ }
+ }
+
+
/* become root again if waiting */
unbecome_user();