This check prevents an obvious way for a vhost-user socket to escape the intended directory.
There might be other ways to escape the directory (none comes to mind at the moment), but this is a problem that should be properly solved by mandatory access control. A similar check is done for a bridge name, since that name is used as part of a socket as well. Signed-off-by: Daniele Di Proietto <diproiet...@vmware.com> --- lib/netdev-dpdk.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index d115de2..6b33c02 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -676,14 +676,24 @@ static int netdev_dpdk_vhost_user_construct(struct netdev *netdev_) { struct netdev_dpdk *netdev = netdev_dpdk_cast(netdev_); + const char *name = netdev_->name; int err; + if (strchr(name, '/') || !strcmp(name, "..")) { + VLOG_ERR("\"%s\" is not a valid name for a vhost-user port. " + "A valid name must not include '/' " + "and must not be exactly '..'", + name); + return EINVAL; + } + ovs_mutex_lock(&dpdk_mutex); /* Take the name of the vhost-user port and append it to the location where * the socket is to be created, then register the socket. */ snprintf(netdev->vhost_id, sizeof(netdev->vhost_id), "%s/%s", - vhost_sock_dir, netdev_->name); + vhost_sock_dir, name); + err = rte_vhost_driver_register(netdev->vhost_id); if (err) { VLOG_ERR("vhost-user socket device setup failure for socket %s\n", @@ -691,7 +701,7 @@ netdev_dpdk_vhost_user_construct(struct netdev *netdev_) } else { fatal_signal_add_file_to_unlink(netdev->vhost_id); VLOG_INFO("Socket %s created for vhost-user port %s\n", - netdev->vhost_id, netdev_->name); + netdev->vhost_id, name); err = vhost_construct_helper(netdev_); } -- 2.1.4 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev