[PATCH v5 24/52] net/af_xdp: replace strerror with reentrant version

Dengdui Huang huangdengdui at huawei.com
Mon Nov 4 12:10:09 CET 2024


The function strerror() is insecure in a multi-thread environment.
This patch uses strerror_r() to replace it.

Signed-off-by: Dengdui Huang <huangdengdui at huawei.com>
Acked-by: Chengwen Feng <fengchengwen at huawei.com>
Acked-by: Morten Brørup <mb at smartsharesystems.com>
Acked-by: Huisong Li <lihuisong at 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



More information about the dev mailing list