changeset 82:550f223e6a0f draft

Add safe_strncpy function to ensure everything is NULL terminated
author Roy Marples <roy@marples.name>
date Thu, 05 Apr 2007 16:56:58 +0000
parents 4016314de606
children 28623d1e2c59
files common.c common.h configure.c dhcp.c dhcpcd.c interface.c socket.c
diffstat 7 files changed, 30 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/common.c	Thu Apr 05 15:01:50 2007 +0000
+++ b/common.c	Thu Apr 05 16:56:58 2007 +0000
@@ -27,6 +27,16 @@
 #include "common.h"
 #include "logger.h"
 
+/* A way of safely handling strncpy */
+char *safe_strncpy (char *dst, const char *src, size_t size)
+{
+  if (! size)
+    return dst;
+
+  dst[--size] = '\0';
+  return strncpy (dst, src, size);
+}
+
 /* This requires us to link to rt on glibc, so we use sysinfo instead */
 #ifdef __linux__
 #include <sys/sysinfo.h>
--- a/common.h	Thu Apr 05 15:01:50 2007 +0000
+++ b/common.h	Thu Apr 05 16:56:58 2007 +0000
@@ -22,7 +22,9 @@
 #ifndef COMMON_H
 #define COMMON_H
 
+char *safe_strncpy (char *dst, const char *src, size_t size);
 long uptime (void);
 void *xmalloc (size_t size);
 
+
 #endif
--- a/configure.c	Thu Apr 05 15:01:50 2007 +0000
+++ b/configure.c	Thu Apr 05 16:56:58 2007 +0000
@@ -689,7 +689,7 @@
       || strcmp (curhostname, "localhost") == 0)
     {
       if (dhcp->hostname)
-	strcpy (newhostname, dhcp->hostname); 
+	safe_strncpy (newhostname, dhcp->hostname, sizeof (newhostname)); 
 
       if (*newhostname)
 	{
--- a/dhcp.c	Thu Apr 05 15:01:50 2007 +0000
+++ b/dhcp.c	Thu Apr 05 16:56:58 2007 +0000
@@ -513,7 +513,8 @@
   memset (first_route, 0, sizeof (route_t));
 
   dhcp->address.s_addr = message->yiaddr;
-  strcpy (dhcp->servername, message->servername);
+  safe_strncpy (dhcp->servername, message->servername,
+		sizeof (dhcp->servername));
 
 #define LEN_ERR \
     { \
--- a/dhcpcd.c	Thu Apr 05 15:01:50 2007 +0000
+++ b/dhcpcd.c	Thu Apr 05 16:56:58 2007 +0000
@@ -206,7 +206,7 @@
 	    exit (EXIT_FAILURE);
 	  }
 	else
-	  strcpy (options.hostname, optarg);
+	  safe_strncpy (options.hostname, optarg, sizeof (options.hostname));
 	break;
       case 'i':
 	if (strlen (optarg) > CLASS_ID_MAX_LEN)
@@ -334,7 +334,8 @@
 		  argv[optind], IF_NAMESIZE);
 	  exit (EXIT_FAILURE);
 	}
-      strcpy (options.interface, argv[optind]);
+      safe_strncpy (options.interface, argv[optind],
+		    sizeof (options.interface));
     }
   else
     {
--- a/interface.c	Thu Apr 05 15:01:50 2007 +0000
+++ b/interface.c	Thu Apr 05 16:56:58 2007 +0000
@@ -190,7 +190,7 @@
 #endif
 
   memset (&ifr, 0, sizeof (struct ifreq));
-  strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
+  safe_strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
   if ((s = socket (AF_INET, SOCK_DGRAM, 0)) < 0)
     {
       logger (LOG_ERR, "socket: %s", strerror (errno));
@@ -200,7 +200,7 @@
 #ifdef __linux__
   /* Do something with the metric parameter to satisfy the compiler warning */
   metric = 0;
-  strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
+  safe_strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
   if (ioctl (s, SIOCGIFHWADDR, &ifr) <0)
     {
       logger (LOG_ERR, "ioctl SIOCGIFHWADDR: %s", strerror (errno));
@@ -227,7 +227,7 @@
   family = ifr.ifr_hwaddr.sa_family;
 #else
   ifr.ifr_metric = metric;
-  strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
+  safe_strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
   if (ioctl (s, SIOCSIFMETRIC, &ifr) < 0)
     {
       logger (LOG_ERR, "ioctl SIOCSIFMETRIC: %s", strerror (errno));
@@ -236,7 +236,7 @@
     }
 #endif
 
-  strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
+  safe_strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
   if (ioctl(s, SIOCGIFMTU, &ifr) < 0)
     {
       logger (LOG_ERR, "ioctl SIOCGIFMTU: %s", strerror (errno));
@@ -247,7 +247,7 @@
     {
       logger (LOG_DEBUG, "MTU of %d is too low, setting to %d", ifr.ifr_mtu, MTU_MIN);
       ifr.ifr_mtu = MTU_MIN;
-      strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
+      safe_strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
       if (ioctl(s, SIOCSIFMTU, &ifr) < 0)
 	{
 	  logger (LOG_ERR, "ioctl SIOCSIFMTU,: %s", strerror (errno));
@@ -257,7 +257,7 @@
     }
   mtu = ifr.ifr_mtu;
 
-  strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
+  safe_strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
   if (ioctl(s, SIOCGIFFLAGS, &ifr) < 0)
     {
       logger (LOG_ERR, "ioctl SIOCGIFFLAGS: %s", strerror (errno));
@@ -266,7 +266,7 @@
     }
 
   ifr.ifr_flags |= IFF_UP | IFF_RUNNING;
-  strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
+  safe_strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
   if (ioctl(s, SIOCSIFFLAGS, &ifr) < 0)
     {
       logger (LOG_ERR, "ioctl SIOCSIFFLAGS: %s", strerror (errno));
@@ -278,7 +278,7 @@
 
   iface = xmalloc (sizeof (interface_t));
   memset (iface, 0, sizeof (interface_t));
-  strncpy (iface->name, ifname, IF_NAMESIZE);
+  safe_strncpy (iface->name, ifname, IF_NAMESIZE);
   snprintf (iface->infofile, PATH_MAX, INFOFILE, ifname);
   memcpy (&iface->hwaddr, hwaddr, hwlen);
   iface->hwlen = hwlen;
@@ -309,7 +309,7 @@
     }
 
   memset (&ifr, 0, sizeof (struct ifreq));
-  strcpy (ifr.ifr_name, ifname);
+  safe_strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
   r = ioctl (s, SIOCGIFMTU, &ifr);
   close (s);
 
@@ -336,7 +336,7 @@
 
   memset (&ifr, 0, sizeof (struct ifreq));
   logger (LOG_DEBUG, "setting MTU to %d", mtu);
-  strcpy (ifr.ifr_name, ifname);
+  safe_strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
   ifr.ifr_mtu = mtu;
   r = ioctl (s, SIOCSIFMTU, &ifr);
   close (s);
@@ -365,7 +365,7 @@
     }
 
   memset (&ifa, 0, sizeof (ifa));
-  strcpy (ifa.ifra_name, ifname);
+  safe_strncpy (ifa.ifra_name, ifname, sizeof (ifa.ifra_name));
 
 #define ADDADDR(_var, _addr) \
     { \
--- a/socket.c	Thu Apr 05 15:01:50 2007 +0000
+++ b/socket.c	Thu Apr 05 16:56:58 2007 +0000
@@ -262,7 +262,7 @@
     }
 
   memset (&ifr, 0, sizeof (struct ifreq));
-  strncpy (ifr.ifr_name, iface->name, sizeof (ifr.ifr_name));
+  safe_strncpy (ifr.ifr_name, iface->name, sizeof (ifr.ifr_name));
   if (ioctl (fd, BIOCSETIF, &ifr) < 0)
     {
       logger (LOG_ERR, "cannot attach interface `%s' to bpf device `%s': %s",