dhcpd: fix an improper widening conversion
authorDenys Vlasenko <vda.linux@googlemail.com>
Tue, 27 Jan 2015 20:59:40 +0000 (21:59 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Tue, 27 Jan 2015 20:59:40 +0000 (21:59 +0100)
We wanted to detect when tv_sec = unsigned1 - unsigned2
underflows by looking at tv_sec's sign. But if tv_sec
is long and it is wider than unsigned, we get unsigned -> long
conversion which is in this case never negative.

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
networking/udhcp/dhcpd.c

index 4b3ed240c490f025ae7dec88cd77dee894953700..2de074f9bc61f689659f21cbd22bb06a2cc2703d 100644 (file)
@@ -413,7 +413,8 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
 
                max_sock = udhcp_sp_fd_set(&rfds, server_socket);
                if (server_config.auto_time) {
-                       tv.tv_sec = timeout_end - monotonic_sec();
+                       /* cast to signed is essential if tv_sec is wider than int */
+                       tv.tv_sec = (int)(timeout_end - monotonic_sec());
                        tv.tv_usec = 0;
                }
                retval = 0;