]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
Fix bug 6828 - infinite timeout occurs when byte lock held outside of samba Jeremy.
authorJeremy Allison <jra@samba.org>
Wed, 21 Oct 2009 01:17:19 +0000 (18:17 -0700)
committerKarolin Seeger <kseeger@samba.org>
Thu, 22 Oct 2009 14:32:11 +0000 (16:32 +0200)
source/smbd/blocking.c

index 2c37fea496d61283c20103c18942f8a7fb985fba..f4adc0d047d9ccd609aeee0b358d3767f2ac451b 100644 (file)
@@ -93,6 +93,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.
@@ -116,19 +132,13 @@ static bool recalc_brl_timeout(void)
                         */
                         if (brl->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 = brl->expire_time;
-               }
-               else {
-                       next_timeout = timeval_min(&next_timeout,
-                                                  &brl->expire_time);
-               }
+               next_timeout = timeval_brl_min(&next_timeout, &brl->expire_time);
        }
 
        if (timeval_is_zero(&next_timeout)) {