From mboxrd@z Thu Jan 1 00:00:00 1970 From: Michal Jastrzebski Subject: [PATCH] eal: fix check number of bytes from read function Date: Wed, 20 Jul 2016 16:24:49 +0200 Message-ID: <1469024689-1076-1-git-send-email-michalx.k.jastrzebski@intel.com> Cc: dev@dpdk.org, michalx.kobylinski@intel.com, sergio.gonzalez.monroy@intel.com, david.marchand@6wind.com To: bruce.richardson@intel.com Return-path: Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by dpdk.org (Postfix) with ESMTP id C091B3989 for ; Wed, 20 Jul 2016 16:25:02 +0200 (CEST) List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" In rte_mem_virt2phy: Value returned from a function and indicating the number of bytes was ignored. This could cause a wrong pfn (page frame number) mask read from pagemap file. When read returns less than the number of sizeof(uint64_t) bytes, function rte_mem_virt2phy returns error. Coverity issue: 13212 Fixes: 40b966a211ab ("ivshmem: library changes for mmaping using ivshmem"). Signed-off-by: Michal Jastrzebski --- lib/librte_eal/linuxapp/eal/eal_memory.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/librte_eal/linuxapp/eal/eal_memory.c b/lib/librte_eal/linuxapp/eal/eal_memory.c index 42a29fa..05769fb 100644 --- a/lib/librte_eal/linuxapp/eal/eal_memory.c +++ b/lib/librte_eal/linuxapp/eal/eal_memory.c @@ -158,7 +158,7 @@ rte_mem_lock_page(const void *virt) phys_addr_t rte_mem_virt2phy(const void *virtaddr) { - int fd; + int fd, retval; uint64_t page, physaddr; unsigned long virt_pfn; int page_size; @@ -209,11 +209,19 @@ rte_mem_virt2phy(const void *virtaddr) close(fd); return RTE_BAD_PHYS_ADDR; } - if (read(fd, &page, sizeof(uint64_t)) < 0) { + + retval = read(fd, &page, sizeof(uint64_t)); + if (retval < 0) { RTE_LOG(ERR, EAL, "%s(): cannot read /proc/self/pagemap: %s\n", __func__, strerror(errno)); close(fd); return RTE_BAD_PHYS_ADDR; + } else if (retval >= 0 && retval < (int)sizeof(uint64_t)) { + RTE_LOG(ERR, EAL, "%s(): read %d bytes from /proc/self/pagemap " + "but expected %d: %s\n", + __func__, retval, (int)sizeof(uint64_t), strerror(errno)); + close(fd); + return RTE_BAD_PHYS_ADDR; } /* -- 1.7.9.5