[hackers] [sdhcp] [PATCH] Fix sent lease time on 64-bit systems

From: Michael Forney <mforney_AT_mforney.org>
Date: Thu, 9 Feb 2017 13:42:27 -0800

The lease time option is defined in RFC 1533 to be a 32-bit unsigned
integer. However, on 64-bit systems, unsigned long long is 64 bits, so
hnput writes 8 bytes, the first 4 of which are 0.

dnsmasq (and possibly other DHCP servers) only looks at the first 4
bytes in the option, so interprets a lease time of 0. It then sets the
lease time to a minimum of 120 seconds. This causes the server to expire
the lease long before sdhcp attempts to renew it.
---
 sdhcp.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/sdhcp.c b/sdhcp.c
index c5f986a..7b8c687 100644
--- a/sdhcp.c
+++ b/sdhcp.c
_AT_@ -9,6 +9,7 @@
 #include <fcntl.h>
 #include <poll.h>
 #include <signal.h>
+#include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
_AT_@ -95,7 +96,7 @@ static unsigned char client[4];
 static unsigned char mask[4];
 static unsigned char router[4];
 static unsigned char dns[4];
-static unsigned long t1;
+static uint32_t t1;
 
 static int dflag = 1; /* change DNS in /etc/resolv.conf ? */
 static int iflag = 1; /* set IP ? */
_AT_@ -104,7 +105,7 @@ static int fflag = 0; /* run in foreground */
 #define IP(a,b,c,d) (unsigned char[4]){a,b,c,d}
 
 static void
-hnput(unsigned char *dst, unsigned long long src, size_t n)
+hnput(unsigned char *dst, uint32_t src, size_t n)
 {
 	unsigned int i;
 
_AT_@ -249,7 +250,7 @@ optput(unsigned char *p, int opt, unsigned char *data, size_t len)
 }
 
 static unsigned char *
-hnoptput(unsigned char *p, int opt, long long data, size_t len)
+hnoptput(unsigned char *p, int opt, uint32_t data, size_t len)
 {
 	*p++ = opt;
 	*p++ = (unsigned char)len;
-- 
2.11.1
Received on Thu Feb 09 2017 - 22:42:27 CET

This archive was generated by hypermail 2.3.0 : Thu Feb 09 2017 - 22:48:18 CET