From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 418A945C76; Mon, 4 Nov 2024 12:14:30 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id B93B1427AA; Mon, 4 Nov 2024 12:11:24 +0100 (CET) Received: from szxga08-in.huawei.com (szxga08-in.huawei.com [45.249.212.255]) by mails.dpdk.org (Postfix) with ESMTP id 7175040E39 for ; Mon, 4 Nov 2024 12:10:44 +0100 (CET) Received: from mail.maildlp.com (unknown [172.19.162.254]) by szxga08-in.huawei.com (SkyGuard) with ESMTP id 4Xhpc73SS6z1T9k5; Mon, 4 Nov 2024 19:08:23 +0800 (CST) Received: from dggpeml500011.china.huawei.com (unknown [7.185.36.84]) by mail.maildlp.com (Postfix) with ESMTPS id D90CD180105; Mon, 4 Nov 2024 19:10:40 +0800 (CST) Received: from localhost.huawei.com (10.50.165.33) by dggpeml500011.china.huawei.com (7.185.36.84) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.39; Mon, 4 Nov 2024 19:10:40 +0800 From: Dengdui Huang To: CC: , , , , , , , , , , Subject: [PATCH v5 15/52] bus/pci: replace strerror with reentrant version Date: Mon, 4 Nov 2024 19:10:00 +0800 Message-ID: <20241104111037.3632161-16-huangdengdui@huawei.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20241104111037.3632161-1-huangdengdui@huawei.com> References: <20231114082539.1858594-1-huangdengdui@huawei.com> <20241104111037.3632161-1-huangdengdui@huawei.com> MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Originating-IP: [10.50.165.33] X-ClientProxiedBy: dggems706-chm.china.huawei.com (10.3.19.183) To dggpeml500011.china.huawei.com (7.185.36.84) X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org The function strerror() is insecure in a multi-thread environment. This patch uses strerror_r() to replace it. Signed-off-by: Dengdui Huang Acked-by: Chengwen Feng Acked-by: Morten Brørup Acked-by: Huisong Li --- drivers/bus/pci/bsd/pci.c | 20 +++++++++--- drivers/bus/pci/linux/pci.c | 16 ++++++++-- drivers/bus/pci/linux/pci_uio.c | 50 +++++++++++++++++++++++------- drivers/bus/pci/linux/pci_vfio.c | 52 +++++++++++++++++++++++++------- drivers/bus/pci/pci_common_uio.c | 6 +++- 5 files changed, 114 insertions(+), 30 deletions(-) diff --git a/drivers/bus/pci/bsd/pci.c b/drivers/bus/pci/bsd/pci.c index 2f88252418..916832af7e 100644 --- a/drivers/bus/pci/bsd/pci.c +++ b/drivers/bus/pci/bsd/pci.c @@ -38,6 +38,7 @@ #include #include #include +#include #include "eal_filesystem.h" #include "private.h" @@ -101,6 +102,7 @@ int pci_uio_alloc_resource(struct rte_pci_device *dev, struct mapped_pci_resource **uio_res) { + char errmsg[RTE_STRERR_BUFSIZE]; char devname[PATH_MAX]; /* contains the /dev/uioX */ struct rte_pci_addr *loc; @@ -122,7 +124,9 @@ pci_uio_alloc_resource(struct rte_pci_device *dev, } if (rte_intr_fd_get(dev->intr_handle) < 0) { - PCI_LOG(ERR, "Cannot open %s: %s", devname, strerror(errno)); + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); + PCI_LOG(ERR, "Cannot open %s: %s", devname, errmsg); goto error; } @@ -156,6 +160,7 @@ pci_uio_map_resource_by_index(struct rte_pci_device *dev, int res_idx, uint64_t offset; uint64_t pagesz; struct pci_map *maps; + char errmsg[RTE_STRERR_BUFSIZE]; maps = uio_res->maps; devname = uio_res->path; @@ -164,7 +169,9 @@ pci_uio_map_resource_by_index(struct rte_pci_device *dev, int res_idx, /* allocate memory to keep path */ maps[map_idx].path = rte_malloc(NULL, strlen(devname) + 1, 0); if (maps[map_idx].path == NULL) { - PCI_LOG(ERR, "Cannot allocate memory for path: %s", strerror(errno)); + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); + PCI_LOG(ERR, "Cannot allocate memory for path: %s", errmsg); return -1; } @@ -173,7 +180,9 @@ pci_uio_map_resource_by_index(struct rte_pci_device *dev, int res_idx, */ fd = open(devname, O_RDWR); if (fd < 0) { - PCI_LOG(ERR, "Cannot open %s: %s", devname, strerror(errno)); + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); + PCI_LOG(ERR, "Cannot open %s: %s", devname, errmsg); goto error; } @@ -331,6 +340,7 @@ rte_pci_scan(void) .match_buf_len = sizeof(matches), .matches = &matches[0], }; + char errmsg[RTE_STRERR_BUFSIZE]; struct rte_pci_addr pci_addr; /* for debug purposes, PCI can be disabled */ @@ -346,8 +356,10 @@ rte_pci_scan(void) do { unsigned i; if (ioctl(fd, PCIOCGETCONF, &conf_io) < 0) { + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); PCI_LOG(ERR, "%s(): error with ioctl on /dev/pci: %s", - __func__, strerror(errno)); + __func__, errmsg); goto error; } diff --git a/drivers/bus/pci/linux/pci.c b/drivers/bus/pci/linux/pci.c index 9056035b33..2ef17a288e 100644 --- a/drivers/bus/pci/linux/pci.c +++ b/drivers/bus/pci/linux/pci.c @@ -12,6 +12,7 @@ #include #include #include +#include #include "eal_filesystem.h" @@ -442,6 +443,7 @@ rte_pci_scan(void) DIR *dir; char dirname[PATH_MAX]; struct rte_pci_addr addr; + char errmsg[RTE_STRERR_BUFSIZE]; /* for debug purposes, PCI can be disabled */ if (!rte_eal_has_pci()) @@ -449,7 +451,9 @@ rte_pci_scan(void) dir = opendir(rte_pci_get_sysfs_path()); if (dir == NULL) { - PCI_LOG(ERR, "%s(): opendir failed: %s", __func__, strerror(errno)); + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); + PCI_LOG(ERR, "%s(): opendir failed: %s", __func__, errmsg); return -1; } @@ -487,6 +491,7 @@ pci_device_iommu_support_va(const struct rte_pci_device *dev) char filename[PATH_MAX]; FILE *fp; uint64_t mgaw, vtd_cap_reg = 0; + char errmsg[RTE_STRERR_BUFSIZE]; snprintf(filename, sizeof(filename), "%s/" PCI_PRI_FMT "/iommu/intel-iommu/cap", @@ -499,8 +504,10 @@ pci_device_iommu_support_va(const struct rte_pci_device *dev) if (errno == ENOENT) return true; + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); PCI_LOG(ERR, "%s(): can't open %s: %s", - __func__, filename, strerror(errno)); + __func__, filename, errmsg); return false; } @@ -547,11 +554,14 @@ pci_device_iommu_support_va(__rte_unused const struct rte_pci_device *dev) char filename[PATH_MAX] = "/proc/cpuinfo"; FILE *fp = fopen(filename, "r"); bool pseries = false, powernv = false, qemu = false; + char errmsg[RTE_STRERR_BUFSIZE]; bool ret = false; if (fp == NULL) { + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); PCI_LOG(ERR, "%s(): can't open %s: %s", - __func__, filename, strerror(errno)); + __func__, filename, errmsg); return ret; } diff --git a/drivers/bus/pci/linux/pci_uio.c b/drivers/bus/pci/linux/pci_uio.c index 4c1d3327a9..77a41beb77 100644 --- a/drivers/bus/pci/linux/pci_uio.c +++ b/drivers/bus/pci/linux/pci_uio.c @@ -21,6 +21,7 @@ #include #include #include +#include #include "eal_filesystem.h" #include "pci_init.h" @@ -79,6 +80,7 @@ pci_uio_mmio_write(const struct rte_pci_device *dev, int bar, static int pci_mknod_uio_dev(const char *sysfs_uio_path, unsigned uio_num) { + char errmsg[RTE_STRERR_BUFSIZE]; FILE *f; char filename[PATH_MAX]; int ret; @@ -108,7 +110,9 @@ pci_mknod_uio_dev(const char *sysfs_uio_path, unsigned uio_num) dev = makedev(major, minor); ret = mknod(filename, S_IFCHR | S_IRUSR | S_IWUSR, dev); if (ret != 0) { - PCI_LOG(ERR, "%s(): mknod() failed %s", __func__, strerror(errno)); + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); + PCI_LOG(ERR, "%s(): mknod() failed %s", __func__, errmsg); return -1; } @@ -217,6 +221,7 @@ int pci_uio_alloc_resource(struct rte_pci_device *dev, struct mapped_pci_resource **uio_res) { + char errmsg[RTE_STRERR_BUFSIZE]; char dirname[PATH_MAX]; char cfgname[PATH_MAX]; char devname[PATH_MAX]; /* contains the /dev/uioX */ @@ -237,7 +242,9 @@ pci_uio_alloc_resource(struct rte_pci_device *dev, /* save fd */ fd = open(devname, O_RDWR); if (fd < 0) { - PCI_LOG(ERR, "Cannot open %s: %s", devname, strerror(errno)); + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); + PCI_LOG(ERR, "Cannot open %s: %s", devname, errmsg); goto error; } @@ -249,7 +256,9 @@ pci_uio_alloc_resource(struct rte_pci_device *dev, uio_cfg_fd = open(cfgname, O_RDWR); if (uio_cfg_fd < 0) { - PCI_LOG(ERR, "Cannot open %s: %s", cfgname, strerror(errno)); + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); + PCI_LOG(ERR, "Cannot open %s: %s", cfgname, errmsg); goto error; } @@ -294,6 +303,7 @@ int pci_uio_map_resource_by_index(struct rte_pci_device *dev, int res_idx, struct mapped_pci_resource *uio_res, int map_idx) { + char errmsg[RTE_STRERR_BUFSIZE]; int fd = -1; char devname[PATH_MAX]; void *mapaddr; @@ -310,7 +320,9 @@ pci_uio_map_resource_by_index(struct rte_pci_device *dev, int res_idx, /* allocate memory to keep path */ maps[map_idx].path = rte_malloc(NULL, sizeof(devname), 0); if (maps[map_idx].path == NULL) { - PCI_LOG(ERR, "Cannot allocate memory for path: %s", strerror(errno)); + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); + PCI_LOG(ERR, "Cannot allocate memory for path: %s", errmsg); return -1; } @@ -342,7 +354,9 @@ pci_uio_map_resource_by_index(struct rte_pci_device *dev, int res_idx, /* then try to map resource file */ fd = open(devname, O_RDWR); if (fd < 0) { - PCI_LOG(ERR, "Cannot open %s: %s", devname, strerror(errno)); + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); + PCI_LOG(ERR, "Cannot open %s: %s", devname, errmsg); goto error; } } @@ -383,6 +397,7 @@ int pci_uio_ioport_map(struct rte_pci_device *dev, int bar, struct rte_pci_ioport *p) { + char errmsg[RTE_STRERR_BUFSIZE]; FILE *f = NULL; char dirname[PATH_MAX]; char filename[PATH_MAX]; @@ -397,7 +412,9 @@ pci_uio_ioport_map(struct rte_pci_device *dev, int bar, dev->addr.devid, dev->addr.function); f = fopen(filename, "r"); if (f == NULL) { - PCI_LOG(ERR, "%s(): Cannot open sysfs resource: %s", __func__, strerror(errno)); + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); + PCI_LOG(ERR, "%s(): Cannot open sysfs resource: %s", __func__, errmsg); return -1; } @@ -438,14 +455,18 @@ pci_uio_ioport_map(struct rte_pci_device *dev, int bar, RTE_INTR_HANDLE_UNKNOWN) { int uio_num = pci_get_uio_dev(dev, dirname, sizeof(dirname), 0); if (uio_num < 0) { - PCI_LOG(ERR, "cannot open %s: %s", dirname, strerror(errno)); + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); + PCI_LOG(ERR, "cannot open %s: %s", dirname, errmsg); goto error; } snprintf(filename, sizeof(filename), "/dev/uio%u", uio_num); fd = open(filename, O_RDWR); if (fd < 0) { - PCI_LOG(ERR, "Cannot open %s: %s", filename, strerror(errno)); + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); + PCI_LOG(ERR, "Cannot open %s: %s", filename, errmsg); goto error; } if (rte_intr_fd_set(dev->intr_handle, fd)) @@ -474,6 +495,7 @@ pci_uio_ioport_map(struct rte_pci_device *dev, int bar, FILE *f; char buf[BUFSIZ]; char filename[PATH_MAX]; + char errmsg[RTE_STRERR_BUFSIZE]; uint64_t phys_addr, end_addr, flags; int fd, i; void *addr; @@ -484,7 +506,9 @@ pci_uio_ioport_map(struct rte_pci_device *dev, int bar, dev->addr.devid, dev->addr.function); f = fopen(filename, "r"); if (f == NULL) { - PCI_LOG(ERR, "Cannot open sysfs resource: %s", strerror(errno)); + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); + PCI_LOG(ERR, "Cannot open sysfs resource: %s", errmsg); return -1; } for (i = 0; i < bar + 1; i++) { @@ -507,14 +531,18 @@ pci_uio_ioport_map(struct rte_pci_device *dev, int bar, /* mmap the pci resource */ fd = open(filename, O_RDWR); if (fd < 0) { - PCI_LOG(ERR, "Cannot open %s: %s", filename, strerror(errno)); + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); + PCI_LOG(ERR, "Cannot open %s: %s", filename, errmsg); goto error; } addr = mmap(NULL, end_addr + 1, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); close(fd); if (addr == MAP_FAILED) { - PCI_LOG(ERR, "Cannot mmap IO port resource: %s", strerror(errno)); + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); + PCI_LOG(ERR, "Cannot mmap IO port resource: %s", errmsg); goto error; } diff --git a/drivers/bus/pci/linux/pci_vfio.c b/drivers/bus/pci/linux/pci_vfio.c index 5317170231..ed1b458a9d 100644 --- a/drivers/bus/pci/linux/pci_vfio.c +++ b/drivers/bus/pci/linux/pci_vfio.c @@ -21,6 +21,7 @@ #include #include #include +#include #include "eal_filesystem.h" @@ -180,6 +181,7 @@ pci_vfio_setup_interrupts(struct rte_pci_device *dev, int vfio_dev_fd) { int i, ret, intr_idx; enum rte_intr_mode intr_mode; + char errmsg[RTE_STRERR_BUFSIZE]; /* default to invalid index */ intr_idx = VFIO_PCI_NUM_IRQS; @@ -222,8 +224,10 @@ pci_vfio_setup_interrupts(struct rte_pci_device *dev, int vfio_dev_fd) ret = ioctl(vfio_dev_fd, VFIO_DEVICE_GET_IRQ_INFO, &irq); if (ret < 0) { + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); PCI_LOG(ERR, "Cannot get VFIO IRQ info, error %i (%s)", - errno, strerror(errno)); + errno, errmsg); return -1; } @@ -248,8 +252,10 @@ pci_vfio_setup_interrupts(struct rte_pci_device *dev, int vfio_dev_fd) /* set up an eventfd for interrupts */ fd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); if (fd < 0) { + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); PCI_LOG(ERR, "Cannot set up eventfd, error %i (%s)", - errno, strerror(errno)); + errno, errmsg); return -1; } @@ -323,14 +329,17 @@ pci_vfio_req_handler(void *param) static int pci_vfio_enable_notifier(struct rte_pci_device *dev, int vfio_dev_fd) { + char errmsg[RTE_STRERR_BUFSIZE]; int ret; int fd = -1; /* set up an eventfd for req notifier */ fd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); if (fd < 0) { + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); PCI_LOG(ERR, "Cannot set up eventfd, error %i (%s)", - errno, strerror(errno)); + errno, errmsg); return -1; } @@ -431,6 +440,8 @@ pci_vfio_is_ioport_bar(const struct rte_pci_device *dev, int vfio_dev_fd, static int pci_rte_vfio_setup_device(struct rte_pci_device *dev, int vfio_dev_fd) { + char errmsg[RTE_STRERR_BUFSIZE]; + if (pci_vfio_setup_interrupts(dev, vfio_dev_fd) != 0) { PCI_LOG(ERR, "Error setting up interrupts!"); return -1; @@ -451,7 +462,9 @@ pci_rte_vfio_setup_device(struct rte_pci_device *dev, int vfio_dev_fd) * then it updates errno as EINVAL. */ if (ioctl(vfio_dev_fd, VFIO_DEVICE_RESET) && errno != EINVAL) { - PCI_LOG(ERR, "Unable to reset device! Error: %d (%s)", errno, strerror(errno)); + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); + PCI_LOG(ERR, "Unable to reset device! Error: %d (%s)", errno, errmsg); return -1; } @@ -715,6 +728,7 @@ pci_vfio_fill_regions(struct rte_pci_device *dev, int vfio_dev_fd, { struct rte_pci_device_internal *pdev = RTE_PCI_DEVICE_INTERNAL(dev); struct vfio_region_info *reg = NULL; + char errmsg[RTE_STRERR_BUFSIZE]; int nb_maps, i, ret; nb_maps = RTE_MIN((int)device_info->num_regions, @@ -723,8 +737,10 @@ pci_vfio_fill_regions(struct rte_pci_device *dev, int vfio_dev_fd, for (i = 0; i < nb_maps; i++) { ret = pci_vfio_get_region_info(vfio_dev_fd, ®, i); if (ret < 0) { + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); PCI_LOG(DEBUG, "%s cannot get device region info error %i (%s)", - dev->name, errno, strerror(errno)); + dev->name, errno, errmsg); return -1; } @@ -750,6 +766,7 @@ pci_vfio_map_resource_primary(struct rte_pci_device *dev) struct mapped_pci_resource *vfio_res = NULL; struct mapped_pci_res_list *vfio_res_list = RTE_TAILQ_CAST(rte_vfio_tailq.head, mapped_pci_res_list); + char errmsg[RTE_STRERR_BUFSIZE]; struct pci_map *maps; @@ -791,8 +808,10 @@ pci_vfio_map_resource_primary(struct rte_pci_device *dev) ret = pci_vfio_get_region_info(vfio_dev_fd, ®, VFIO_PCI_CONFIG_REGION_INDEX); if (ret < 0) { + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); PCI_LOG(ERR, "%s cannot get device region info error %i (%s)", - dev->name, errno, strerror(errno)); + dev->name, errno, errmsg); goto err_vfio_res; } pdev->region[VFIO_PCI_CONFIG_REGION_INDEX].size = reg->size; @@ -829,8 +848,10 @@ pci_vfio_map_resource_primary(struct rte_pci_device *dev) ret = pci_vfio_get_region_info(vfio_dev_fd, ®, i); if (ret < 0) { + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); PCI_LOG(ERR, "%s cannot get device region info error %i (%s)", - pci_addr, errno, strerror(errno)); + pci_addr, errno, errmsg); goto err_map; } @@ -890,16 +911,20 @@ pci_vfio_map_resource_primary(struct rte_pci_device *dev) if (maps[i].nr_areas > 0) { ret = pci_vfio_sparse_mmap_bar(vfio_dev_fd, vfio_res, i, 0); if (ret < 0) { + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); PCI_LOG(ERR, "%s sparse mapping BAR%i failed: %s", - pci_addr, i, strerror(errno)); + pci_addr, i, errmsg); free(reg); goto err_map; } } else { ret = pci_vfio_mmap_bar(vfio_dev_fd, vfio_res, i, 0); if (ret < 0) { + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); PCI_LOG(ERR, "%s mapping BAR%i failed: %s", - pci_addr, i, strerror(errno)); + pci_addr, i, errmsg); free(reg); goto err_map; } @@ -951,6 +976,7 @@ pci_vfio_map_resource_secondary(struct rte_pci_device *dev) struct mapped_pci_resource *vfio_res = NULL; struct mapped_pci_res_list *vfio_res_list = RTE_TAILQ_CAST(rte_vfio_tailq.head, mapped_pci_res_list); + char errmsg[RTE_STRERR_BUFSIZE]; struct pci_map *maps; @@ -994,15 +1020,19 @@ pci_vfio_map_resource_secondary(struct rte_pci_device *dev) if (maps[i].nr_areas > 0) { ret = pci_vfio_sparse_mmap_bar(vfio_dev_fd, vfio_res, i, MAP_FIXED); if (ret < 0) { + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); PCI_LOG(ERR, "%s sparse mapping BAR%i failed: %s", - pci_addr, i, strerror(errno)); + pci_addr, i, errmsg); goto err_vfio_dev_fd; } } else { ret = pci_vfio_mmap_bar(vfio_dev_fd, vfio_res, i, MAP_FIXED); if (ret < 0) { + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); PCI_LOG(ERR, "%s mapping BAR%i failed: %s", - pci_addr, i, strerror(errno)); + pci_addr, i, errmsg); goto err_vfio_dev_fd; } } diff --git a/drivers/bus/pci/pci_common_uio.c b/drivers/bus/pci/pci_common_uio.c index 30503bd23a..87f134385c 100644 --- a/drivers/bus/pci/pci_common_uio.c +++ b/drivers/bus/pci/pci_common_uio.c @@ -15,6 +15,7 @@ #include #include #include +#include #include "private.h" @@ -27,6 +28,7 @@ static int pci_uio_map_secondary(struct rte_pci_device *dev) { int fd, i = 0, j, res_idx; + char errmsg[RTE_STRERR_BUFSIZE]; struct mapped_pci_resource *uio_res; struct mapped_pci_res_list *uio_res_list = RTE_TAILQ_CAST(rte_uio_tailq.head, mapped_pci_res_list); @@ -51,8 +53,10 @@ pci_uio_map_secondary(struct rte_pci_device *dev) */ fd = open(uio_res->maps[i].path, O_RDWR); if (fd < 0) { + if (strerror_r(errno, errmsg, sizeof(errmsg)) != 0) + snprintf(errmsg, sizeof(errmsg), "Unknown error %d", errno); PCI_LOG(ERR, "Cannot open %s: %s", - uio_res->maps[i].path, strerror(errno)); + uio_res->maps[i].path, errmsg); return -1; } -- 2.33.0