From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Thu, 16 May 2019 12:41:33 -0500 Subject: [PATCH] libmultipath: handle clock_gettime failures in tur checker If clock_gettime() fails, and multipathd can't figure out when it should time out, it should just default to assuming that it has already timed out. Found by coverity. Signed-off-by: Benjamin Marzinski --- libmultipath/checkers/tur.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/libmultipath/checkers/tur.c b/libmultipath/checkers/tur.c index 6b08dbb..717353e 100644 --- a/libmultipath/checkers/tur.c +++ b/libmultipath/checkers/tur.c @@ -290,7 +290,12 @@ static void *tur_thread(void *ctx) static void tur_timeout(struct timespec *tsp) { - clock_gettime(CLOCK_MONOTONIC, tsp); + if (clock_gettime(CLOCK_MONOTONIC, tsp) != 0) { + /* can't get time. clear tsp to not wait */ + tsp->tv_sec = 0; + tsp->tv_nsec = 0; + return; + } tsp->tv_nsec += 1000 * 1000; /* 1 millisecond */ normalize_timespec(tsp); } @@ -300,8 +305,12 @@ static void tur_set_async_timeout(struct checker *c) struct tur_checker_context *ct = c->context; struct timespec now; - clock_gettime(CLOCK_MONOTONIC, &now); - ct->time = now.tv_sec + c->timeout; + if (clock_gettime(CLOCK_MONOTONIC, &now) != 0) + /* can't get time. clear time to always timeout on + * next path check */ + ct->time = 0; + else + ct->time = now.tv_sec + c->timeout; } static int tur_check_async_timeout(struct checker *c) @@ -309,7 +318,9 @@ static int tur_check_async_timeout(struct checker *c) struct tur_checker_context *ct = c->context; struct timespec now; - clock_gettime(CLOCK_MONOTONIC, &now); + if (clock_gettime(CLOCK_MONOTONIC, &now) != 0) + /* can't get time. assume we've timed out */ + return 1; return (now.tv_sec > ct->time); } -- 2.17.2