2017-03-09 5:57 GMT-08:00 Ian Stokes <[email protected]>:
> 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 <[email protected]>
> Fixes: 2ae3d542 ("netdev-dpdk: Refactor dpdk_mp_get().")
> Fixes: 0072e931 ("netdev-dpdk: add support for jumbo frames")
> CC: Daniele Di Proietto <[email protected]>
> CC: Mark Kavanagh <[email protected]>
>
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
> [email protected]
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev