eal: fix access to huge page with high address
authorThomas Monjalon <thomas.monjalon@6wind.com>
Thu, 2 Aug 2012 15:17:37 +0000 (17:17 +0200)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Thu, 25 Jul 2013 14:07:50 +0000 (16:07 +0200)
The returned value of lseek is a virtual address
which can be different from the offset.
Indeed, if the return address has a 64-bit canonical form,
the 16 higher bits are all 1 if bit 47 is 1.

So the check was wrong. It is better to test against an error value.

Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
Acked-by: Damien Millescamps <damien.millescamps@6wind.com>
lib/librte_eal/linuxapp/eal/eal_memory.c

index ef8d36a..6a91f35 100644 (file)
  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  * 
  */
+/*   BSD LICENSE
+ *
+ *   Copyright(c) 2013 6WIND.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of 6WIND S.A. nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
 
 #include <errno.h>
 #include <stdarg.h>
@@ -336,7 +366,7 @@ find_physaddr(struct hugepage *hugepg_tbl, struct hugepage_info *hpi)
                virt_pfn = (unsigned long)hugepg_tbl[i].orig_va /
                        page_size;
                offset = sizeof(uint64_t) * virt_pfn;
-               if (lseek(fd, offset, SEEK_SET) != offset){
+               if (lseek(fd, offset, SEEK_SET) == (off_t) -1) {
                        RTE_LOG(ERR, EAL, "%s(): seek error in /proc/self/pagemap: %s\n",
                                        __func__, strerror(errno));
                        close(fd);