uloop: avoid integer overflow in tv_diff
[project/libubox.git] / uloop.c
diff --git a/uloop.c b/uloop.c
index 3813e188522d87c03877072ea820a48f5526eafe..2972727374644505c8b58f8bf6e3dec8e8ae816b 100644 (file)
--- a/uloop.c
+++ b/uloop.c
@@ -58,6 +58,7 @@ static struct list_head processes = LIST_HEAD_INIT(processes);
 
 static int poll_fd = -1;
 bool uloop_cancelled = false;
+bool uloop_handle_sigchld = true;
 static int uloop_status = 0;
 static bool do_sigchld = false;
 
@@ -248,7 +249,7 @@ int uloop_fd_delete(struct uloop_fd *fd)
        return __uloop_fd_delete(fd);
 }
 
-static int tv_diff(struct timeval *t1, struct timeval *t2)
+static int64_t tv_diff(struct timeval *t1, struct timeval *t2)
 {
        return
                (t1->tv_sec - t2->tv_sec) * 1000 +
@@ -316,7 +317,7 @@ int uloop_timeout_cancel(struct uloop_timeout *timeout)
        return 0;
 }
 
-int uloop_timeout_remaining(struct uloop_timeout *timeout)
+int64_t uloop_timeout_remaining(struct uloop_timeout *timeout)
 {
        struct timeval now;
 
@@ -466,7 +467,9 @@ static void uloop_setup_signals(bool add)
 
        uloop_install_handler(SIGINT, uloop_handle_sigint, &old_sigint, add);
        uloop_install_handler(SIGTERM, uloop_handle_sigint, &old_sigterm, add);
-       uloop_install_handler(SIGCHLD, uloop_sigchld, &old_sigchld, add);
+
+       if (uloop_handle_sigchld)
+               uloop_install_handler(SIGCHLD, uloop_sigchld, &old_sigchld, add);
 
        uloop_ignore_signal(SIGPIPE, add);
 }
@@ -474,7 +477,7 @@ static void uloop_setup_signals(bool add)
 static int uloop_get_next_timeout(struct timeval *tv)
 {
        struct uloop_timeout *timeout;
-       int diff;
+       int64_t diff;
 
        if (list_empty(&timeouts))
                return -1;