s3: Fix timeout calculation if g_lock_lock is given a timeout < 60s
authorVolker Lendecke <vl@samba.org>
Tue, 16 Feb 2010 14:21:25 +0000 (15:21 +0100)
committerVolker Lendecke <vl@samba.org>
Tue, 16 Feb 2010 14:28:42 +0000 (15:28 +0100)
Detected while showing this code to obnox :-)

source3/lib/g_lock.c

index add670c154dee1b749c92c14bc258f96fd4cadba..e4c6d7c660e4d4abbfc7eed4e2d1728a5cb2f0f9 100644 (file)
@@ -338,7 +338,7 @@ NTSTATUS g_lock_lock(struct g_lock_ctx *ctx, const char *name,
                fd_set *r_fds = NULL;
                int max_fd = 0;
                int ret;
-               struct timeval select_timeout;
+               struct timeval timeout_remaining, select_timeout;
 
                status = g_lock_trylock(ctx, name, lock_type);
                if (NT_STATUS_IS_OK(status)) {
@@ -395,8 +395,13 @@ NTSTATUS g_lock_lock(struct g_lock_ctx *ctx, const char *name,
                }
 #endif
 
+               time_now = timeval_current();
+               timeout_remaining = timeval_until(&time_now, &timeout_end);
                select_timeout = timeval_set(60, 0);
 
+               select_timeout = timeval_min(&select_timeout,
+                                            &timeout_remaining);
+
                ret = sys_select(max_fd + 1, r_fds, NULL, NULL,
                                 &select_timeout);
                if (ret == -1) {