+dhcpcd-3.1.5
+Rework the arp code again so that we don't link to librt on Linux.
Thanks to regenrecht for reporting the below three overflows:-
Fix a potential buffer overflow in hwaddr_ntoa if length > 42.
Fix a potential heap overflow in decode_CSR when CIDR > 32.
dhcpcd_OBJS = arp.o client.o common.o configure.o dhcp.o dhcpcd.o duid.o \
info.o interface.o ipv4ll.o logger.o signals.o socket.o
-# These are nasty hacks to work out what libs we need to link to
-# We require librt for glibc bases systems
-LIBRT != ldd /bin/date 2>/dev/null | grep -q /librt.so && echo "-lrt" || exit 0
-LIBRT ?= $(shell ldd /bin/date 2>/dev/null | grep -q /librt.so && echo "-lrt")
-
# Darwin needs this, but we have no way of detecting this atm
#LIBRESOLV = -lresolv
dhcpcd: $(dhcpcd_H) $(dhcpcd_OBJS)
- $(CC) $(LDFLAGS) $(dhcpcd_OBJS) $(LIBRT) $(LIBRESOLV) -o dhcpcd
+ $(CC) $(LDFLAGS) $(dhcpcd_OBJS) $(LIBRESOLV) -o dhcpcd
version.h:
echo '#define VERSION "$(VERSION)"' > version.h
int nprobes = 0;
int nclaims = 0;
struct in_addr null_address;
+
+#ifdef HAVE_GET_TIME
struct timeval stopat;
struct timeval now;
+#endif
if (! iface)
return (-1);
break;
}
+
+#ifdef HAVE_GET_TIME
/* Setup our stop time */
if (get_time (&stopat) != 0)
break;
stopat.tv_usec += timeout;
+#endif
continue;
}
- /* We maybe ARP flooded, so check our time */
+ /* Check for ARP floods */
+#ifdef __linux__
+ /* Linux does modify the tv struct, otherwise we would have to link
+ * into librt to use get get_time function */
+ timeout = tv.tv_usec;
+ if (timeout <= 0)
+ continue;
+#else
if (get_time (&now) != 0)
break;
if (timercmp (&now, &stopat, >)) {
timeout = 0;
continue;
}
+#endif
if (! FD_ISSET (iface->fd, &rset))
continue;
# endif
#endif
+/* This requires us to link to rt on glibc, so we use sysinfo instead */
+#ifdef __linux__
+#include <sys/sysinfo.h>
+long uptime (void)
+{
+ struct sysinfo info;
+
+ sysinfo (&info);
+ return info.uptime;
+}
+#elif __APPLE__
+/* Darwin doesn't appear to have an uptime, so try and make one ourselves */
+long uptime (void)
+{
+ struct timeval tv;
+ static long start = 0;
+
+ if (gettimeofday (&tv, NULL) == -1) {
+ logger (LOG_ERR, "gettimeofday: %s", strerror (errno));
+ return -1;
+ }
+
+ if (start == 0)
+ start = tv.tv_sec;
+
+ return tv.tv_sec - start;
+}
+#else
+long uptime (void)
+{
+ struct timespec tp;
+
+ if (clock_gettime (CLOCK_MONOTONIC, &tp) == -1) {
+ logger (LOG_ERR, "clock_gettime: %s", strerror (errno));
+ return -1;
+ }
+
+ return tp.tv_sec;
+}
+#endif
+
/* Handy function to get the time.
* We only care about time advancements, not the actual time itself
* Which is why we use CLOCK_MONOTONIC, but it is not available on all
* platforms
*/
-#ifdef CLOCK_MONOTONIC
+#ifdef HAVE_GET_TIME
+# ifdef CLOCK_MONOTONIC
int get_time (struct timeval *tp)
{
struct timespec ts;
tp->tv_usec = ts.tv_nsec / 1000;
return (0);
}
-
-long uptime (void)
-{
- struct timespec tp;
-
- if (clock_gettime (CLOCK_MONOTONIC, &tp) == -1) {
- logger (LOG_ERR, "clock_gettime: %s", strerror (errno));
- return (-1);
- }
-
- return (tp.tv_sec);
-}
-#else
+# else
int get_time (struct timeval *tp)
{
if (gettimeofday (&tp, NULL) == -1) {
}
return (0);
}
-
-long uptime (void)
-{
- struct timeval tv;
- static long start = 0;
-
- if (gettimeofday (&tv, NULL) == -1) {
- logger (LOG_ERR, "gettimeofday: %s", strerror (errno));
- return (-1);
- }
-
- if (start == 0)
- start = tv.tv_sec;
-
- return (tv.tv_sec - start);
-}
+# endif
#endif
void *xmalloc (size_t s)
#ifdef __linux__
void srandomdev (void);
+#else
+#define HAVE_GET_TIME
+int get_time (struct timeval *tp);
#endif
-int get_time (struct timeval *tp);
long uptime (void);
void *xmalloc (size_t size);
char *xstrdup (const char *str);