From: Jeremy Allison Date: Wed, 21 Oct 2009 01:17:19 +0000 (-0700) Subject: Fix bug 6828 - infinite timeout occurs when byte lock held outside of samba Jeremy. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4fce98ce2578f4bc5063a766fdacbdd5f840e446;p=thirdparty%2Fsamba.git Fix bug 6828 - infinite timeout occurs when byte lock held outside of samba Jeremy. --- diff --git a/source/smbd/blocking.c b/source/smbd/blocking.c index 2c37fea496d..f4adc0d047d 100644 --- a/source/smbd/blocking.c +++ b/source/smbd/blocking.c @@ -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)) {