From: Stephen Hemminger Date: Fri, 11 Jan 2019 20:35:16 +0000 (-0800) Subject: net/tap: check interface name in kvargs X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=7d0c83270982e3f1366cbb479e000b8eb6c1d1bb;p=dpdk.git net/tap: check interface name in kvargs If interface name is passed to remote or iface then check the length and for invalid characters. This avoids problems where name gets truncated or rejected by kernel. Signed-off-by: Stephen Hemminger Acked-by Keith Wiles --- diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c index 11e402e42b..d8e9ede7ac 100644 --- a/drivers/net/tap/rte_eth_tap.c +++ b/drivers/net/tap/rte_eth_tap.c @@ -37,6 +37,7 @@ #include #include #include +#include #include #include @@ -1884,6 +1885,24 @@ error_exit_nodev: return -EINVAL; } +/* make sure name is a possible Linux network device name */ +static bool +is_valid_iface(const char *name) +{ + if (*name == '\0') + return false; + + if (strnlen(name, IFNAMSIZ) == IFNAMSIZ) + return false; + + while (*name) { + if (*name == '/' || *name == ':' || isspace(*name)) + return false; + name++; + } + return true; +} + static int set_interface_name(const char *key __rte_unused, const char *value, @@ -1891,12 +1910,17 @@ set_interface_name(const char *key __rte_unused, { char *name = (char *)extra_args; - if (value) + if (value) { + if (!is_valid_iface(value)) { + TAP_LOG(ERR, "TAP invalid remote interface name (%s)", + value); + return -1; + } strlcpy(name, value, RTE_ETH_NAME_MAX_LEN); - else + } else { snprintf(name, RTE_ETH_NAME_MAX_LEN, "%s%d", DEFAULT_TAP_NAME, tap_unit - 1); - + } return 0; } @@ -1907,8 +1931,14 @@ set_remote_iface(const char *key __rte_unused, { char *name = (char *)extra_args; - if (value) + if (value) { + if (!is_valid_iface(value)) { + TAP_LOG(ERR, "TAP invalid remote interface name (%s)", + value); + return -1; + } strlcpy(name, value, RTE_ETH_NAME_MAX_LEN); + } return 0; }