From 9ee9eb3234c3eb4ac160507e1f8db2a6be4c72a5 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Sun, 14 Jun 2009 17:49:41 +0200 Subject: [PATCH] Fix empth_sleep() for argument in the past and pthreads Calculation of sleep duration suffered integer underflow for unsigned time_t and arguments in the past. This made empth_sleep() sleep for "a few" years instead of not at all. --- src/lib/empthread/pthread.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/lib/empthread/pthread.c b/src/lib/empthread/pthread.c index 319b272e..6d08611f 100644 --- a/src/lib/empthread/pthread.c +++ b/src/lib/empthread/pthread.c @@ -345,14 +345,16 @@ int empth_sleep(time_t until) { empth_t *ctx = pthread_getspecific(ctx_key); + time_t now; struct timeval tv; int res; - empth_status("going to sleep %ld sec", until - time(0)); pthread_mutex_unlock(&mtx_ctxsw); do { - tv.tv_sec = until - time(NULL); + now = time(NULL); + tv.tv_sec = until >= now ? until - now : 0; tv.tv_usec = 0; + empth_status("going to sleep %ld sec", (long)tv.tv_sec); res = select(0, NULL, NULL, NULL, &tv); } while (res < 0 && !ctx->wakeup); empth_status("sleep done. Waiting for lock");