]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
Add safe_strncpy function to ensure everything is NULL terminated
authorRoy Marples <roy@marples.name>
Thu, 5 Apr 2007 16:56:58 +0000 (16:56 +0000)
committerRoy Marples <roy@marples.name>
Thu, 5 Apr 2007 16:56:58 +0000 (16:56 +0000)
common.c
common.h
configure.c
dhcp.c
dhcpcd.c
interface.c
socket.c

index c7a50e02abdd32e05a0cf5f4fea15901bb188dbb..8246b8e118e5b764ad7ef53ef2d39feca315dde3 100644 (file)
--- a/common.c
+++ b/common.c
 #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>
index 3ef15804234dc01d42ba0f9ccb3a639c2e921e79..e788e0bb6fc3c18198b4435da6d135a8a6d764fd 100644 (file)
--- a/common.h
+++ b/common.h
@@ -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
index 3ea93db798f0dd0bd18c634fc9382dbac3600065..a50b6880ee1beeb1c879dde4d927c1e799f7af4f 100644 (file)
@@ -689,7 +689,7 @@ int configure (const options_t *options, interface_t *iface,
       || strcmp (curhostname, "localhost") == 0)
     {
       if (dhcp->hostname)
-       strcpy (newhostname, dhcp->hostname); 
+       safe_strncpy (newhostname, dhcp->hostname, sizeof (newhostname)); 
 
       if (*newhostname)
        {
diff --git a/dhcp.c b/dhcp.c
index bd7289a169758a81ad17dee419c4145994723065..31e385f2b67caa097922d1fb47bcf7210b449efb 100644 (file)
--- a/dhcp.c
+++ b/dhcp.c
@@ -513,7 +513,8 @@ int parse_dhcpmessage (dhcp_t *dhcp, const dhcpmessage_t *message)
   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 \
     { \
index 1d8fed250741363219a1f060bfdced6c8f214298..ff74da0338b86cec2917562199aa4fd01f30a2aa 100644 (file)
--- a/dhcpcd.c
+++ b/dhcpcd.c
@@ -206,7 +206,7 @@ int main(int argc, char **argv)
            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 @@ int main(int argc, char **argv)
                  argv[optind], IF_NAMESIZE);
          exit (EXIT_FAILURE);
        }
-      strcpy (options.interface, argv[optind]);
+      safe_strncpy (options.interface, argv[optind],
+                   sizeof (options.interface));
     }
   else
     {
index 7dce0500e54f40330ff18bf875a74deab799508d..3f4e248137647547334b26676a43589c52e72954 100644 (file)
@@ -190,7 +190,7 @@ interface_t *read_interface (const char *ifname, int metric)
 #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 @@ interface_t *read_interface (const char *ifname, int metric)
 #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 @@ interface_t *read_interface (const char *ifname, int metric)
   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 @@ interface_t *read_interface (const char *ifname, int metric)
     }
 #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 @@ interface_t *read_interface (const char *ifname, int metric)
     {
       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 @@ interface_t *read_interface (const char *ifname, int metric)
     }
   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 @@ interface_t *read_interface (const char *ifname, int metric)
     }
 
   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 @@ interface_t *read_interface (const char *ifname, int metric)
 
   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 @@ int get_mtu (const char *ifname)
     }
 
   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 @@ int set_mtu (const char *ifname, short int mtu)
 
   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 @@ static int do_address (const char *ifname, struct in_addr address,
     }
 
   memset (&ifa, 0, sizeof (ifa));
-  strcpy (ifa.ifra_name, ifname);
+  safe_strncpy (ifa.ifra_name, ifname, sizeof (ifa.ifra_name));
 
 #define ADDADDR(_var, _addr) \
     { \
index 35ba658678cf22b6a61d2aed2bb9e0582b59c3b9..f2d8a25c486144714310f96d70976e45aedb8844 100644 (file)
--- a/socket.c
+++ b/socket.c
@@ -262,7 +262,7 @@ int open_socket (interface_t *iface, bool arp)
     }
 
   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",