From 6439a0af0ca6b0256a4273a8ae0175e896bcc8da Mon Sep 17 00:00:00 2001 From: =?utf8?q?P=C3=A1draig=20Brady?= Date: Mon, 21 Sep 2015 23:46:05 +0100 Subject: [PATCH] nanosleep: fix return code for interrupted replacement * lib/nanosleep.c (nanosleep): In the replaced nanosleep, ensure that we return -1 in the case the call is interrupted by a signal, rather than the current value of 1. Diagnosed and tested by Daniel Richard G. --- ChangeLog | 8 ++++++++ lib/nanosleep.c | 22 ++++++++++++---------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7c83566007..c552225b64 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2015-09-21 Pádraig Brady + + nanosleep: fix return code for interrupted replacement + * lib/nanosleep.c (nanosleep): In the replaced nanosleep, ensure + that we return -1 in the case the call is interrupted by a signal, + rather than the current value of 1. + Diagnosed and tested by Daniel Richard G. + 2015-09-19 Paul Eggert Diagnose ERE '()|\1' diff --git a/lib/nanosleep.c b/lib/nanosleep.c index 3060db0936..1364f7a019 100644 --- a/lib/nanosleep.c +++ b/lib/nanosleep.c @@ -202,7 +202,7 @@ sighandler (int sig) /* Suspend execution for at least *TS_DELAY seconds. */ -static void +static int my_usleep (const struct timespec *ts_delay) { struct timeval tv_delay; @@ -218,7 +218,7 @@ my_usleep (const struct timespec *ts_delay) tv_delay.tv_usec = 0; } } - select (0, NULL, NULL, NULL, &tv_delay); + return select (0, NULL, NULL, NULL, &tv_delay); } /* Suspend execution for at least *REQUESTED_DELAY seconds. The @@ -256,19 +256,21 @@ nanosleep (const struct timespec *requested_delay, suspended = 0; - my_usleep (requested_delay); - - if (suspended) + if (my_usleep (requested_delay) == -1) { - /* Calculate time remaining. */ - /* FIXME: the code in sleep doesn't use this, so there's no - rush to implement it. */ + if (suspended) + { + /* Calculate time remaining. */ + /* FIXME: the code in sleep doesn't use this, so there's no + rush to implement it. */ - errno = EINTR; + errno = EINTR; + } + return -1; } /* FIXME: Restore sig handler? */ - return suspended; + return 0; } #endif -- 2.39.5