aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Hemminger <sthemmin@microsoft.com>2021-03-04 09:21:57 -0800
committerStephen Hemminger <sthemmin@microsoft.com>2021-03-04 09:21:57 -0800
commita1f20223cfcf7b9eae8c9e7e7a07e7bf1377f65b (patch)
tree3ac4b610abaae121820e089133a6d0494846476c
parent4691bf3e5cc3d62c1ea271768cef7dce3b92ba05 (diff)
downloadbridge-utils-a1f20223cfcf7b9eae8c9e7e7a07e7bf1377f65b.tar.gz
fix string overflow warnings
Gcc 10 now gives warnings about possible string overflow and non-null terminated strings. Resolve these by introducing strlcpy() and expanding the size of some path string buffers. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
-rw-r--r--configure.ac1
-rw-r--r--libbridge/libbridge.h3
-rw-r--r--libbridge/libbridge_devif.c16
-rw-r--r--libbridge/libbridge_if.c8
-rw-r--r--libbridge/libbridge_init.c6
-rw-r--r--libbridge/libbridge_misc.c23
6 files changed, 42 insertions, 15 deletions
diff --git a/configure.ac b/configure.ac
index 8b2e2ea..87d0e88 100644
--- a/configure.ac
+++ b/configure.ac
@@ -24,6 +24,7 @@ AC_HEADER_TIME
dnl Checks for library functions.
AC_CHECK_FUNCS(gethostname socket strdup uname)
AC_CHECK_FUNCS(if_nametoindex if_indextoname)
+AC_CHECK_FUNCS(strlcpy strlcat)
AC_SUBST(KERNEL_HEADERS)
diff --git a/libbridge/libbridge.h b/libbridge/libbridge.h
index c038b92..962f316 100644
--- a/libbridge/libbridge.h
+++ b/libbridge/libbridge.h
@@ -31,6 +31,9 @@
extern unsigned int if_nametoindex (const char *__ifname);
extern char *if_indextoname (unsigned int __ifindex, char *__ifname);
+#ifndef HAVE_STRLCPY
+size_t strlcpy(char *dst, const char *src, size_t size);
+#endif
struct bridge_id
{
diff --git a/libbridge/libbridge_devif.c b/libbridge/libbridge_devif.c
index 2cf78f6..8b7d954 100644
--- a/libbridge/libbridge_devif.c
+++ b/libbridge/libbridge_devif.c
@@ -30,9 +30,9 @@
static FILE *fpopen(const char *dir, const char *name)
{
- char path[SYSFS_PATH_MAX];
+ char path[PATH_MAX];
- snprintf(path, SYSFS_PATH_MAX, "%s/%s", dir, name);
+ snprintf(path, PATH_MAX, "%s/%s", dir, name);
return fopen(path, "r");
}
@@ -91,7 +91,7 @@ static int get_portno(const char *brname, const char *ifname)
goto error;
memset(ifindices, 0, sizeof(ifindices));
- strncpy(ifr.ifr_name, brname, IFNAMSIZ);
+ strlcpy(ifr.ifr_name, brname, IFNAMSIZ);
ifr.ifr_data = (char *) &args;
if (ioctl(br_socket_fd, SIOCDEVPRIVATE, &ifr) < 0) {
@@ -119,7 +119,7 @@ static int old_get_bridge_info(const char *bridge, struct bridge_info *info)
(unsigned long) &i, 0, 0 };
memset(info, 0, sizeof(*info));
- strncpy(ifr.ifr_name, bridge, IFNAMSIZ);
+ strlcpy(ifr.ifr_name, bridge, IFNAMSIZ);
ifr.ifr_data = (char *) &args;
if (ioctl(br_socket_fd, SIOCDEVPRIVATE, &ifr) < 0) {
@@ -213,7 +213,7 @@ static int old_get_port_info(const char *brname, const char *port,
unsigned long args[4] = { BRCTL_GET_PORT_INFO,
(unsigned long) &i, index, 0 };
- strncpy(ifr.ifr_name, brname, IFNAMSIZ);
+ strlcpy(ifr.ifr_name, brname, IFNAMSIZ);
ifr.ifr_data = (char *) &args;
if (ioctl(br_socket_fd, SIOCDEVPRIVATE, &ifr) < 0) {
@@ -312,7 +312,7 @@ static int br_set(const char *bridge, const char *name,
struct ifreq ifr;
unsigned long args[4] = { oldcode, value, 0, 0 };
- strncpy(ifr.ifr_name, bridge, IFNAMSIZ);
+ strlcpy(ifr.ifr_name, bridge, IFNAMSIZ);
ifr.ifr_data = (char *) &args;
ret = ioctl(br_socket_fd, SIOCDEVPRIVATE, &ifr);
}
@@ -373,7 +373,7 @@ static int port_set(const char *bridge, const char *ifname,
struct ifreq ifr;
unsigned long args[4] = { oldcode, index, value, 0 };
- strncpy(ifr.ifr_name, bridge, IFNAMSIZ);
+ strlcpy(ifr.ifr_name, bridge, IFNAMSIZ);
ifr.ifr_data = (char *) &args;
ret = ioctl(br_socket_fd, SIOCDEVPRIVATE, &ifr);
}
@@ -429,7 +429,7 @@ int br_read_fdb(const char *bridge, struct fdb_entry *fdbs,
struct ifreq ifr;
int retries = 0;
- strncpy(ifr.ifr_name, bridge, IFNAMSIZ);
+ strlcpy(ifr.ifr_name, bridge, IFNAMSIZ);
ifr.ifr_data = (char *) args;
retry:
diff --git a/libbridge/libbridge_if.c b/libbridge/libbridge_if.c
index 9cf4bac..5f3aed1 100644
--- a/libbridge/libbridge_if.c
+++ b/libbridge/libbridge_if.c
@@ -40,7 +40,7 @@ int br_add_bridge(const char *brname)
unsigned long arg[3]
= { BRCTL_ADD_BRIDGE, (unsigned long) _br };
- strncpy(_br, brname, IFNAMSIZ);
+ strlcpy(_br, brname, IFNAMSIZ);
ret = ioctl(br_socket_fd, SIOCSIFBR, arg);
}
@@ -60,7 +60,7 @@ int br_del_bridge(const char *brname)
unsigned long arg[3]
= { BRCTL_DEL_BRIDGE, (unsigned long) _br };
- strncpy(_br, brname, IFNAMSIZ);
+ strlcpy(_br, brname, IFNAMSIZ);
ret = ioctl(br_socket_fd, SIOCSIFBR, arg);
}
return ret < 0 ? errno : 0;
@@ -75,7 +75,7 @@ int br_add_interface(const char *bridge, const char *dev)
if (ifindex == 0)
return ENODEV;
- strncpy(ifr.ifr_name, bridge, IFNAMSIZ);
+ strlcpy(ifr.ifr_name, bridge, IFNAMSIZ);
#ifdef SIOCBRADDIF
ifr.ifr_ifindex = ifindex;
err = ioctl(br_socket_fd, SIOCBRADDIF, &ifr);
@@ -100,7 +100,7 @@ int br_del_interface(const char *bridge, const char *dev)
if (ifindex == 0)
return ENODEV;
- strncpy(ifr.ifr_name, bridge, IFNAMSIZ);
+ strlcpy(ifr.ifr_name, bridge, IFNAMSIZ);
#ifdef SIOCBRDELIF
ifr.ifr_ifindex = ifindex;
err = ioctl(br_socket_fd, SIOCBRDELIF, &ifr);
diff --git a/libbridge/libbridge_init.c b/libbridge/libbridge_init.c
index f3a551e..c914971 100644
--- a/libbridge/libbridge_init.c
+++ b/libbridge/libbridge_init.c
@@ -46,7 +46,7 @@ void br_shutdown(void)
/* If /sys/class/net/XXX/bridge exists then it must be a bridge */
static int isbridge(const struct dirent *entry)
{
- char path[SYSFS_PATH_MAX];
+ char path[PATH_MAX];
struct stat st;
int ret, saved_errno;
@@ -56,7 +56,7 @@ static int isbridge(const struct dirent *entry)
&& entry->d_name[2] == '\0')))
return 0;
- snprintf(path, SYSFS_PATH_MAX,
+ snprintf(path, PATH_MAX,
SYSFS_CLASS_NET "%s/bridge", entry->d_name);
/* Workaround old glibc breakage.
@@ -161,7 +161,7 @@ static int old_foreach_port(const char *brname,
(unsigned long)ifindices, MAX_PORTS, 0 };
memset(ifindices, 0, sizeof(ifindices));
- strncpy(ifr.ifr_name, brname, IFNAMSIZ);
+ strlcpy(ifr.ifr_name, brname, IFNAMSIZ);
ifr.ifr_data = (char *) &args;
err = ioctl(br_socket_fd, SIOCDEVPRIVATE, &ifr);
diff --git a/libbridge/libbridge_misc.c b/libbridge/libbridge_misc.c
index 5791638..9379e93 100644
--- a/libbridge/libbridge_misc.c
+++ b/libbridge/libbridge_misc.c
@@ -48,3 +48,26 @@ int __get_hz(void)
const char * s = getenv("HZ");
return s ? atoi(s) : HZ;
}
+
+#ifndef HAVE_STRLCPY
+#ifndef min
+# define min(x, y) ({ \
+ typeof(x) _min1 = (x); \
+ typeof(y) _min2 = (y); \
+ (void) (&_min1 == &_min2); \
+ _min1 < _min2 ? _min1 : _min2; })
+#endif
+
+size_t strlcpy(char *dst, const char *src, size_t size)
+{
+ size_t srclen = strlen(src);
+
+ if (size) {
+ size_t minlen = min(srclen, size - 1);
+
+ memcpy(dst, src, minlen);
+ dst[minlen] = '\0';
+ }
+ return srclen;
+}
+#endif