Mercurial > hg > dhcpcd
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",
