diff options
author | Stephen Hemminger <sthemmin@microsoft.com> | 2021-03-04 09:21:57 -0800 |
---|---|---|
committer | Stephen Hemminger <sthemmin@microsoft.com> | 2021-03-04 09:21:57 -0800 |
commit | a1f20223cfcf7b9eae8c9e7e7a07e7bf1377f65b (patch) | |
tree | 3ac4b610abaae121820e089133a6d0494846476c | |
parent | 4691bf3e5cc3d62c1ea271768cef7dce3b92ba05 (diff) | |
download | bridge-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.ac | 1 | ||||
-rw-r--r-- | libbridge/libbridge.h | 3 | ||||
-rw-r--r-- | libbridge/libbridge_devif.c | 16 | ||||
-rw-r--r-- | libbridge/libbridge_if.c | 8 | ||||
-rw-r--r-- | libbridge/libbridge_init.c | 6 | ||||
-rw-r--r-- | libbridge/libbridge_misc.c | 23 |
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 |