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/af_xdp/rte_eth_af_xdp.c | 25 ++++++++++++++++++++-----
 1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/drivers/net/af_xdp/rte_eth_af_xdp.c 
b/drivers/net/af_xdp/rte_eth_af_xdp.c
index 814398ba4b..52ad450172 100644
--- a/drivers/net/af_xdp/rte_eth_af_xdp.c
+++ b/drivers/net/af_xdp/rte_eth_af_xdp.c
@@ -1141,6 +1141,7 @@ xsk_umem_info *xdp_umem_configure(struct pmd_internals 
*internals,
        void *aligned_addr;
        uint64_t umem_size;
        struct rte_mempool_mem_range_info range;
+       char errmsg[RTE_STRERR_BUFSIZE];
 
        if (internals->shared_umem) {
                if (get_shared_umem(rxq, internals->if_name, &umem) < 0)
@@ -1190,8 +1191,10 @@ xsk_umem_info *xdp_umem_configure(struct pmd_internals 
*internals,
                ret = xsk_umem__create(&umem->umem, aligned_addr, umem_size,
                                &rxq->fq, &rxq->cq, &usr_config);
                if (ret) {
+                       if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0)
+                               snprintf(errmsg, sizeof(errmsg), "Unknown error 
%d", errno);
                        AF_XDP_LOG_LINE(ERR, "Failed to create umem [%d]: [%s]",
-                                  errno, strerror(errno));
+                                  errno, errmsg);
                        goto err;
                }
                umem->buffer = aligned_addr;
@@ -1394,6 +1397,7 @@ configure_preferred_busy_poll(struct pkt_rx_queue *rxq)
 static int
 init_uds_sock(struct sockaddr_un *server, const char *dp_path)
 {
+       char errmsg[RTE_STRERR_BUFSIZE];
        int sock;
 
        sock = socket(AF_UNIX, SOCK_SEQPACKET, 0);
@@ -1407,8 +1411,10 @@ init_uds_sock(struct sockaddr_un *server, const char 
*dp_path)
 
        if (connect(sock, (struct sockaddr *)server, sizeof(struct 
sockaddr_un)) < 0) {
                close(sock);
+               if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0)
+                       snprintf(errmsg, sizeof(errmsg), "Unknown error %d", 
errno);
                AF_XDP_LOG_LINE(ERR, "Error connecting stream socket errno = 
[%d]: [%s]",
-                          errno, strerror(errno));
+                          errno, errmsg);
                return -1;
        }
 
@@ -1472,6 +1478,7 @@ read_msg(int sock, char *response, struct sockaddr_un *s, 
int *fd)
        struct iovec iov;
        char control[CMSG_SPACE(sizeof(*fd))];
        struct cmsghdr *cmsg;
+       char errmsg[RTE_STRERR_BUFSIZE];
 
        /* Initialize message header structure */
        memset(&msgh, 0, sizeof(msgh));
@@ -1492,7 +1499,9 @@ read_msg(int sock, char *response, struct sockaddr_un *s, 
int *fd)
                return 0;
 
        if (msglen < 0) {
-               AF_XDP_LOG_LINE(ERR, "recvmsg failed, %s", strerror(errno));
+               if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0)
+                       snprintf(errmsg, sizeof(errmsg), "Unknown error %d", 
errno);
+               AF_XDP_LOG_LINE(ERR, "recvmsg failed, %s", errmsg);
                return -1;
        }
 
@@ -1514,6 +1523,7 @@ static int
 make_request_dp(int sock, struct sockaddr_un *server, char *request,
                 int *req_fd, char *response, int *out_fd, const char *dp_path)
 {
+       char errmsg[RTE_STRERR_BUFSIZE];
        int rval;
 
        AF_XDP_LOG_LINE(DEBUG, "Request: [%s]", request);
@@ -1527,7 +1537,9 @@ make_request_dp(int sock, struct sockaddr_un *server, 
char *request,
                rval = send_msg(sock, request, req_fd, dp_path);
 
        if (rval < 0) {
-               AF_XDP_LOG_LINE(ERR, "Write error %s", strerror(errno));
+               if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0)
+                       snprintf(errmsg, sizeof(errmsg), "Unknown error %d", 
errno);
+               AF_XDP_LOG_LINE(ERR, "Write error %s", errmsg);
                return -1;
        }
 
@@ -2013,6 +2025,7 @@ static int
 parse_prog_arg(const char *key __rte_unused,
               const char *value, void *extra_args)
 {
+       char errmsg[RTE_STRERR_BUFSIZE];
        char *path = extra_args;
 
        if (strnlen(value, PATH_MAX) == PATH_MAX) {
@@ -2022,8 +2035,10 @@ parse_prog_arg(const char *key __rte_unused,
        }
 
        if (access(value, F_OK) != 0) {
+               if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0)
+                       snprintf(errmsg, sizeof(errmsg), "Unknown error %d", 
errno);
                AF_XDP_LOG_LINE(ERR, "Error accessing %s: %s",
-                          value, strerror(errno));
+                          value, errmsg);
                return -EINVAL;
        }
 
-- 
2.33.0

Reply via email to