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)
committerKarolin Seeger <kseeger@samba.org>
Thu, 1 Apr 2010 07:39:18 +0000 (09:39 +0200)
Detected while showing this code to obnox :-)
(cherry picked from commit f8b246e44c819b909b23b4b98ef0999c84d2f4ff)
(cherry picked from commit f73b306797f354d0a24ff8af40b05d6151e52a06)

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) {