From bb7cf9ad23b05416aa6a50de8b2b3b6aad674809 Mon Sep 17 00:00:00 2001
From: Jeremy Allison <jra@samba.org>
Date: Tue, 20 Oct 2009 17:52:34 -0700
Subject: Fix bug 6828 - infinite timeout occurs when byte lock held outside of
 samba Jeremy.

---
 source3/smbd/blocking.c | 26 ++++++++++++++++++--------
 1 file changed, 18 insertions(+), 8 deletions(-)

(limited to 'source3')

diff --git a/source3/smbd/blocking.c b/source3/smbd/blocking.c
index e752194ca5e..01d9ca81052 100644
--- a/source3/smbd/blocking.c
+++ b/source3/smbd/blocking.c
@@ -47,6 +47,22 @@ static void brl_timeout_fn(struct event_context *event_ctx,
 	process_blocking_lock_queue();
 }
 
+/****************************************************************************
+ We need a version of timeval_min that treats zero timval as infinite.
+****************************************************************************/
+
+static struct timeval timeval_brl_min(const struct timeval *tv1,
+					const struct timeval *tv2)
+{
+	if (timeval_is_zero(tv1)) {
+		return *tv2;
+	}
+	if (timeval_is_zero(tv2)) {
+		return *tv1;
+	}
+	return timeval_min(tv1, tv2);
+}
+
 /****************************************************************************
  After a change to blocking_lock_queue, recalculate the timed_event for the
  next processing.
@@ -70,19 +86,13 @@ static bool recalc_brl_timeout(void)
 			 */
                         if (blr->blocking_pid == 0xFFFFFFFF) {
 				struct timeval psx_to = timeval_current_ofs(10, 0);
-				next_timeout = timeval_min(&next_timeout, &psx_to);
+				next_timeout = timeval_brl_min(&next_timeout, &psx_to);
                         }
 
 			continue;
 		}
 
-		if (timeval_is_zero(&next_timeout)) {
-			next_timeout = blr->expire_time;
-		}
-		else {
-			next_timeout = timeval_min(&next_timeout,
-						   &blr->expire_time);
-		}
+		next_timeout = timeval_brl_min(&next_timeout, &blr->expire_time);
 	}
 
 	if (timeval_is_zero(&next_timeout)) {
-- 
cgit