Message ID | 1489067857-32213-1-git-send-email-ian.stokes@intel.com |
---|---|
State | Accepted |
Headers | show |
2017-03-09 5:57 GMT-08:00 Ian Stokes <ian.stokes@intel.com>: > The dpdk_mp_get() function can return a NULL pointer which leads to a > segfault when a mempool cannot be created. The lack of a return value > check for the function netdev_dpdk_mempool_configure() when called in > netdev_dpdk_reconfigure() can result in a segfault also as > a NULL pointer for the mempool will be passed to rte_eth_rx_queue_setup(). > > Fix this by adding appropriate NULL pointer and return value checks to > dpdk_mp_get(), netdev_dpdk_reconfigure() and dpdk_vhost_reconfigure_helper(). > > Signed-off-by: Ian Stokes <ian.stokes@intel.com> > Fixes: 2ae3d542 ("netdev-dpdk: Refactor dpdk_mp_get().") > Fixes: 0072e931 ("netdev-dpdk: add support for jumbo frames") > CC: Daniele Di Proietto <diproiettod@vmware.com> > CC: Mark Kavanagh <mark.b.kavanagh@intel.com> > Thanks, applied to master and branch-2.7 > --- > v3 > * Remove assignments within if conditions for > netdev_dpdk_reconfigure(), netdev_vhost_reconfigure_helper() and > dpdk_mp_get() > > v2 > * Remove extra VLOG_ERR in netdev_dpdk_reconfigure() > * Remove extra VLOG_ERR in netdev_vhost_reconfigure_helper() > * Remove check for NULL mempool in netdev_vhost_reconfigure_helper() as > netdev_dpdk_mempool_configure() already checks and returns ENOMEM error > for this case. > > v1 > * Add NULL pointer check to dpdk_mp_get() when calling dpdk_mp_create(). > * Add return type check when calling netdev_dpdk_mempool_configure() in > netdev_dpdk_reconfigure(). > * Add return type check when calling netdev_dpdk_mempool_configure() in > netdev_vhost_reconfigure_helper() > --- > lib/netdev-dpdk.c | 20 +++++++++++++------- > 1 files changed, 13 insertions(+), 7 deletions(-) > > diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c > index ee53c4c..67905c4 100644 > --- a/lib/netdev-dpdk.c > +++ b/lib/netdev-dpdk.c > @@ -530,7 +530,9 @@ dpdk_mp_get(int socket_id, int mtu) > } > > dmp = dpdk_mp_create(socket_id, mtu); > - ovs_list_push_back(&dpdk_mp_list, &dmp->list_node); > + if (dmp) { > + ovs_list_push_back(&dpdk_mp_list, &dmp->list_node); > + } > > out: > ovs_mutex_unlock(&dpdk_mp_mutex); > @@ -3131,7 +3133,10 @@ netdev_dpdk_reconfigure(struct netdev *netdev) > > if (dev->mtu != dev->requested_mtu > || dev->socket_id != dev->requested_socket_id) { > - netdev_dpdk_mempool_configure(dev); > + err = netdev_dpdk_mempool_configure(dev); > + if (err) { > + goto out; > + } > } > > netdev->n_txq = dev->requested_n_txq; > @@ -3160,6 +3165,7 @@ dpdk_vhost_reconfigure_helper(struct netdev_dpdk *dev) > { > dev->up.n_txq = dev->requested_n_txq; > dev->up.n_rxq = dev->requested_n_rxq; > + int err; > > /* Enable TX queue 0 by default if it wasn't disabled. */ > if (dev->tx_q[0].map == OVS_VHOST_QUEUE_MAP_UNKNOWN) { > @@ -3170,15 +3176,15 @@ dpdk_vhost_reconfigure_helper(struct netdev_dpdk *dev) > > if (dev->requested_socket_id != dev->socket_id > || dev->requested_mtu != dev->mtu) { > - if (!netdev_dpdk_mempool_configure(dev)) { > + err = netdev_dpdk_mempool_configure(dev); > + if (err) { > + return err; > + } > + else { > netdev_change_seq_changed(&dev->up); > } > } > > - if (!dev->dpdk_mp) { > - return ENOMEM; > - } > - > if (netdev_dpdk_get_vid(dev) >= 0) { > dev->vhost_reconfigured = true; > } > -- > 1.7.0.7 > > _______________________________________________ > dev mailing list > dev@openvswitch.org > https://mail.openvswitch.org/mailman/listinfo/ovs-dev
diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index ee53c4c..67905c4 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -530,7 +530,9 @@ dpdk_mp_get(int socket_id, int mtu) } dmp = dpdk_mp_create(socket_id, mtu); - ovs_list_push_back(&dpdk_mp_list, &dmp->list_node); + if (dmp) { + ovs_list_push_back(&dpdk_mp_list, &dmp->list_node); + } out: ovs_mutex_unlock(&dpdk_mp_mutex); @@ -3131,7 +3133,10 @@ netdev_dpdk_reconfigure(struct netdev *netdev) if (dev->mtu != dev->requested_mtu || dev->socket_id != dev->requested_socket_id) { - netdev_dpdk_mempool_configure(dev); + err = netdev_dpdk_mempool_configure(dev); + if (err) { + goto out; + } } netdev->n_txq = dev->requested_n_txq; @@ -3160,6 +3165,7 @@ dpdk_vhost_reconfigure_helper(struct netdev_dpdk *dev) { dev->up.n_txq = dev->requested_n_txq; dev->up.n_rxq = dev->requested_n_rxq; + int err; /* Enable TX queue 0 by default if it wasn't disabled. */ if (dev->tx_q[0].map == OVS_VHOST_QUEUE_MAP_UNKNOWN) { @@ -3170,15 +3176,15 @@ dpdk_vhost_reconfigure_helper(struct netdev_dpdk *dev) if (dev->requested_socket_id != dev->socket_id || dev->requested_mtu != dev->mtu) { - if (!netdev_dpdk_mempool_configure(dev)) { + err = netdev_dpdk_mempool_configure(dev); + if (err) { + return err; + } + else { netdev_change_seq_changed(&dev->up); } } - if (!dev->dpdk_mp) { - return ENOMEM; - } - if (netdev_dpdk_get_vid(dev) >= 0) { dev->vhost_reconfigured = true; }
The dpdk_mp_get() function can return a NULL pointer which leads to a segfault when a mempool cannot be created. The lack of a return value check for the function netdev_dpdk_mempool_configure() when called in netdev_dpdk_reconfigure() can result in a segfault also as a NULL pointer for the mempool will be passed to rte_eth_rx_queue_setup(). Fix this by adding appropriate NULL pointer and return value checks to dpdk_mp_get(), netdev_dpdk_reconfigure() and dpdk_vhost_reconfigure_helper(). Signed-off-by: Ian Stokes <ian.stokes@intel.com> Fixes: 2ae3d542 ("netdev-dpdk: Refactor dpdk_mp_get().") Fixes: 0072e931 ("netdev-dpdk: add support for jumbo frames") CC: Daniele Di Proietto <diproiettod@vmware.com> CC: Mark Kavanagh <mark.b.kavanagh@intel.com> --- v3 * Remove assignments within if conditions for netdev_dpdk_reconfigure(), netdev_vhost_reconfigure_helper() and dpdk_mp_get() v2 * Remove extra VLOG_ERR in netdev_dpdk_reconfigure() * Remove extra VLOG_ERR in netdev_vhost_reconfigure_helper() * Remove check for NULL mempool in netdev_vhost_reconfigure_helper() as netdev_dpdk_mempool_configure() already checks and returns ENOMEM error for this case. v1 * Add NULL pointer check to dpdk_mp_get() when calling dpdk_mp_create(). * Add return type check when calling netdev_dpdk_mempool_configure() in netdev_dpdk_reconfigure(). * Add return type check when calling netdev_dpdk_mempool_configure() in netdev_vhost_reconfigure_helper() --- lib/netdev-dpdk.c | 20 +++++++++++++------- 1 files changed, 13 insertions(+), 7 deletions(-)