The function strerror() is insecure in a multi-thread environment. This patch uses strerror_r() to replace it.
Signed-off-by: Dengdui Huang <huangdeng...@huawei.com> Acked-by: Chengwen Feng <fengcheng...@huawei.com> Acked-by: Morten Brørup <m...@smartsharesystems.com> Acked-by: Huisong Li <lihuis...@huawei.com> --- drivers/net/mlx4/mlx4.c | 27 +++++++++++++++++++++------ drivers/net/mlx4/mlx4_rxq.c | 14 +++++++++++--- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c index 9c2872429f..e8872e105c 100644 --- a/drivers/net/mlx4/mlx4.c +++ b/drivers/net/mlx4/mlx4.c @@ -247,15 +247,18 @@ static int mlx4_dev_configure(struct rte_eth_dev *dev) { struct mlx4_priv *priv = dev->data->dev_private; + char errmsg[RTE_STRERR_BUFSIZE]; struct rte_flow_error error; int ret; /* Prepare internal flow rules. */ ret = mlx4_flow_sync(priv, &error); if (ret) { + if (strerror_r(-ret, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", -ret); ERROR("cannot set up internal flow rules (code %d, \"%s\")," " flow error type %d, cause %p, message: %s", - -ret, strerror(-ret), error.type, error.cause, + -ret, errmsg, error.type, error.cause, error.message ? error.message : "(unspecified)"); goto exit; } @@ -291,6 +294,7 @@ static int mlx4_dev_start(struct rte_eth_dev *dev) { struct mlx4_priv *priv = dev->data->dev_private; + char errmsg[RTE_STRERR_BUFSIZE]; struct rte_flow_error error; uint16_t i; int ret; @@ -301,8 +305,10 @@ mlx4_dev_start(struct rte_eth_dev *dev) priv->started = 1; ret = mlx4_rss_init(priv); if (ret) { + if (strerror_r(-ret, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", -ret); ERROR("%p: cannot initialize RSS resources: %s", - (void *)dev, strerror(-ret)); + (void *)dev, errmsg); goto err; } #ifdef RTE_LIBRTE_MLX4_DEBUG @@ -316,10 +322,12 @@ mlx4_dev_start(struct rte_eth_dev *dev) } ret = mlx4_flow_sync(priv, &error); if (ret) { + if (strerror_r(-ret, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", -ret); ERROR("%p: cannot attach flow rules (code %d, \"%s\")," " flow error type %d, cause %p, message: %s", (void *)dev, - -ret, strerror(-ret), error.type, error.cause, + -ret, errmsg, error.type, error.cause, error.message ? error.message : "(unspecified)"); goto err; } @@ -788,6 +796,7 @@ mlx4_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev) unsigned int vf; int i; char ifname[IF_NAMESIZE]; + char errmsg[RTE_STRERR_BUFSIZE]; (void)pci_drv; err = mlx4_init_once(); @@ -946,7 +955,9 @@ mlx4_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev) err = mlx4_glue->query_port(ctx, port, &port_attr); if (err) { err = ENODEV; - ERROR("port query failed: %s", strerror(err)); + if (strerror_r(err, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", err); + ERROR("port query failed: %s", errmsg); goto port_error; } if (port_attr.link_layer != IBV_LINK_LAYER_ETHERNET) { @@ -962,8 +973,10 @@ mlx4_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev) /* Make asynchronous FD non-blocking to handle interrupts. */ err = mlx4_fd_set_non_blocking(ctx->async_fd); if (err) { + if (strerror_r(err, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", err); ERROR("cannot make asynchronous FD non-blocking: %s", - strerror(err)); + errmsg); goto port_error; } /* Allocate protection domain. */ @@ -1023,8 +1036,10 @@ mlx4_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev) /* Configure the first MAC address by default. */ err = mlx4_get_mac(priv, &mac.addr_bytes); if (err) { + if (strerror_r(err, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", err); ERROR("cannot get MAC address, is mlx4_en loaded?" - " (error: %s)", strerror(err)); + " (error: %s)", errmsg); goto port_error; } INFO("port %u MAC address is " RTE_ETHER_ADDR_PRT_FMT, diff --git a/drivers/net/mlx4/mlx4_rxq.c b/drivers/net/mlx4/mlx4_rxq.c index 781ee256df..d147bcad26 100644 --- a/drivers/net/mlx4/mlx4_rxq.c +++ b/drivers/net/mlx4/mlx4_rxq.c @@ -332,6 +332,7 @@ mlx4_rss_init(struct mlx4_priv *priv) { struct rte_eth_dev *dev = ETH_DEV(priv); uint8_t log2_range = rte_log2_u32(dev->data->nb_rx_queues); + char errmsg[RTE_STRERR_BUFSIZE]; uint32_t wq_num_prev = 0; const char *msg; unsigned int i; @@ -351,9 +352,11 @@ mlx4_rss_init(struct mlx4_priv *priv) MLX4DV_SET_CTX_ATTR_LOG_WQS_RANGE_SZ, &log2_range); if (ret) { + if (strerror_r(ret, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", ret); ERROR("cannot set up range size for RSS context to %u" " (for %u Rx queues), error: %s", - 1 << log2_range, dev->data->nb_rx_queues, strerror(ret)); + 1 << log2_range, dev->data->nb_rx_queues, errmsg); rte_errno = ret; return -ret; } @@ -430,8 +433,10 @@ mlx4_rss_init(struct mlx4_priv *priv) priv->rss_init = 1; return 0; error: + if (strerror_r(ret, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", ret); ERROR("cannot initialize common RSS resources (queue %u): %s: %s", - i, msg, strerror(ret)); + i, msg, errmsg); while (i--) { struct rxq *rxq = ETH_DEV(priv)->data->rx_queues[i]; @@ -508,6 +513,7 @@ mlx4_rxq_attach(struct rxq *rxq) uint32_t create_flags = 0; uint32_t comp_mask = 0; volatile struct mlx4_wqe_data_seg (*wqes)[]; + char errmsg[RTE_STRERR_BUFSIZE]; unsigned int i; int ret; @@ -630,8 +636,10 @@ mlx4_rxq_attach(struct rxq *rxq) claim_zero(mlx4_glue->destroy_cq(cq)); --rxq->usecnt; rte_errno = ret; + if (strerror_r(ret, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", ret); ERROR("error while attaching Rx queue %p: %s: %s", - (void *)rxq, msg, strerror(ret)); + (void *)rxq, msg, errmsg); priv->verbs_alloc_ctx.type = MLX4_VERBS_ALLOC_TYPE_NONE; return -ret; } -- 2.33.0