uloop: restore return type of uloop_timeout_remaining
authorStijn Tintel <stijn@linux-ipv6.be>
Thu, 4 Nov 2021 10:14:02 +0000 (12:14 +0200)
committerStijn Tintel <stijn@linux-ipv6.be>
Thu, 4 Nov 2021 11:03:25 +0000 (13:03 +0200)
The uloop_timeout_remaining function is public and changing its return
type breaks ABI. Change the return type back to int, and return INT_MIN
or INT_MAX if the value returned by tv_diff would overflow integer.

Fixes: be3dc7223a6d ("uloop: avoid integer overflow in tv_diff")
Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>
Acked-by: Jo-Philipp Wich <jo@mein.io>
Acked-by: John Crispin <john@phrozen.org>
uloop.c
uloop.h

diff --git a/uloop.c b/uloop.c
index 2972727374644505c8b58f8bf6e3dec8e8ae816b..769b6c580711257923cd8b960c9376365ec55fee 100644 (file)
--- a/uloop.c
+++ b/uloop.c
@@ -26,6 +26,7 @@
 #include <string.h>
 #include <fcntl.h>
 #include <stdbool.h>
+#include <limits.h>
 
 #include "uloop.h"
 #include "utils.h"
@@ -317,8 +318,9 @@ int uloop_timeout_cancel(struct uloop_timeout *timeout)
        return 0;
 }
 
-int64_t uloop_timeout_remaining(struct uloop_timeout *timeout)
+int uloop_timeout_remaining(struct uloop_timeout *timeout)
 {
+       int64_t td;
        struct timeval now;
 
        if (!timeout->pending)
@@ -326,7 +328,14 @@ int64_t uloop_timeout_remaining(struct uloop_timeout *timeout)
 
        uloop_gettime(&now);
 
-       return tv_diff(&timeout->time, &now);
+       td = tv_diff(&timeout->time, &now);
+
+       if (td > INT_MAX)
+               return INT_MAX;
+       else if (td < INT_MIN)
+               return INT_MIN;
+       else
+               return (int)td;
 }
 
 int uloop_process_add(struct uloop_process *p)
diff --git a/uloop.h b/uloop.h
index ab6149f514e58c90d88d1759777fc9634a0f94e2..36084f520e2ac8570967f1c98474874f9fba0af9 100644 (file)
--- a/uloop.h
+++ b/uloop.h
@@ -92,7 +92,7 @@ int uloop_fd_delete(struct uloop_fd *sock);
 int uloop_timeout_add(struct uloop_timeout *timeout);
 int uloop_timeout_set(struct uloop_timeout *timeout, int msecs);
 int uloop_timeout_cancel(struct uloop_timeout *timeout);
-int64_t uloop_timeout_remaining(struct uloop_timeout *timeout);
+int uloop_timeout_remaining(struct uloop_timeout *timeout);
 
 int uloop_process_add(struct uloop_process *p);
 int uloop_process_delete(struct uloop_process *p);