Add safe_strncpy function to ensure everything is NULL terminated

This commit is contained in:
Roy Marples 2007-04-05 16:56:58 +00:00
parent 505951cbf0
commit 235ce0896d
7 changed files with 30 additions and 16 deletions

View File

@ -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>

View File

@ -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

View 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)
{

3
dhcp.c
View File

@ -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 \
{ \

View File

@ -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
{

View 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) \
{ \

View File

@ -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",