From patchwork Thu Aug 27 20:13:13 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 52779 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-lb0-f200.google.com (mail-lb0-f200.google.com [209.85.217.200]) by patches.linaro.org (Postfix) with ESMTPS id 4A59922EA3 for ; Thu, 27 Aug 2015 20:13:32 +0000 (UTC) Received: by lbcli1 with SMTP id li1sf10288066lbc.2 for ; Thu, 27 Aug 2015 13:13:31 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:mailing-list:precedence:list-id :list-unsubscribe:list-subscribe:list-archive:list-post:list-help :sender:delivered-to:to:from:subject:message-id:date:user-agent :mime-version:content-type:content-transfer-encoding :x-original-sender:x-original-authentication-results; bh=4I8xJFvtywDy4qrlIiYBeG3TzFBbQzxJsMYf58kZZN0=; b=g8mTBT8usIirtsvLrCC8mgylHNBE3VTMOXgEQ2xuohd/EmbuSebUa/GiQ3cktWfWy0 3kGO7KdoMj8xhHJvVFmnogWoSslt7+v/EPWZdX2aUg8xMhnrqmi4TjslT3EK14uCpt63 9efxVkAgs94qTgAOjsbSB+8lyUVxS+xTlZz/yuyPb+wAl+V2OpEaORaZbYJI0oO4e9wI kEErLqho9MH/IC+nN8Z3O98hxKenEDmgnvJG4DxM5kHm93G+0ctCDLAMw32S1dNU9vZT Iq4U17HK5xAmGW2xq/MgVlSbzwEoz3FeowxsU0Fcgic0NcAD+Tds69JMxhNnTLXaU8za PJ1w== X-Gm-Message-State: ALoCoQkNCYK8m+M4yxvcd8/Gi+xDjn0xlWnr+xZQK4oNZV8jbkn0Q1s1QrrgzByKN8jpWXUt2+us X-Received: by 10.112.139.65 with SMTP id qw1mr1628281lbb.24.1440706411290; Thu, 27 Aug 2015 13:13:31 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.27.100 with SMTP id s4ls122918lag.83.gmail; Thu, 27 Aug 2015 13:13:31 -0700 (PDT) X-Received: by 10.152.26.163 with SMTP id m3mr3162449lag.86.1440706411163; Thu, 27 Aug 2015 13:13:31 -0700 (PDT) Received: from mail-lb0-x22c.google.com (mail-lb0-x22c.google.com. [2a00:1450:4010:c04::22c]) by mx.google.com with ESMTPS id v10si3478408lav.62.2015.08.27.13.13.30 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 27 Aug 2015 13:13:30 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 2a00:1450:4010:c04::22c as permitted sender) client-ip=2a00:1450:4010:c04::22c; Received: by lbbsx3 with SMTP id sx3so18473312lbb.0 for ; Thu, 27 Aug 2015 13:13:30 -0700 (PDT) X-Received: by 10.152.203.134 with SMTP id kq6mr3156760lac.106.1440706410877; Thu, 27 Aug 2015 13:13:30 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.151.194 with SMTP id us2csp65284lbb; Thu, 27 Aug 2015 13:13:29 -0700 (PDT) X-Received: by 10.66.156.196 with SMTP id wg4mr9228586pab.65.1440706409853; Thu, 27 Aug 2015 13:13:29 -0700 (PDT) Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id w2si5651961pdl.88.2015.08.27.13.13.28 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 27 Aug 2015 13:13:29 -0700 (PDT) Received-SPF: pass (google.com: domain of libc-alpha-return-62753-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Received: (qmail 3688 invoked by alias); 27 Aug 2015 20:13:20 -0000 Mailing-List: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org Precedence: list List-Id: List-Unsubscribe: , List-Subscribe: List-Archive: List-Post: , List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 3670 invoked by uid 89); 27 Aug 2015 20:13:19 -0000 X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.3 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-yk0-f182.google.com X-Received: by 10.129.157.67 with SMTP id u64mr1439779ywg.11.1440706396212; Thu, 27 Aug 2015 13:13:16 -0700 (PDT) To: GNU C Library From: Adhemerval Zanella Subject: [PATCH] Fix wordsize-32 mmap offset for negative value (BZ#18877) Message-ID: <55DF6F59.3000404@linaro.org> Date: Thu, 27 Aug 2015 17:13:13 -0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.2.0 MIME-Version: 1.0 X-Original-Sender: adhemerval.zanella@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 2a00:1450:4010:c04::22c as permitted sender) smtp.mailfrom=patch+caf_=patchwork-forward=linaro.org@linaro.org; dkim=pass header.i=@sourceware.org X-Google-Group-Id: 836684582541 This patch fixes the default wordsize-32 mmap implementation offset calculation for negative values. Current code uses signed shift operation to calculate the multiple size to use with syscall and it is implementation defined. Change it to use a division base on mmap page size (default being as before, 4096). Tested on armv7hf. [BZ #18877] * misc/Makefile (tests): Add tst-mmap * sysdeps/unix/sysv/linux/generic/wordsize-32/mmap.c (__mmap): Fix offset calculation for negative values. * misc/tst-mmap.c: New file. --- -- diff --git a/misc/Makefile b/misc/Makefile index aecb0da..2929d61 100644 --- a/misc/Makefile +++ b/misc/Makefile @@ -76,7 +76,8 @@ install-lib := libg.a gpl2lgpl := error.c error.h tests := tst-dirname tst-tsearch tst-fdset tst-efgcvt tst-mntent tst-hsearch \ - tst-error1 tst-pselect tst-insremque tst-mntent2 bug-hsearch1 + tst-error1 tst-pselect tst-insremque tst-mntent2 bug-hsearch1 \ + tst-mmap ifeq ($(run-built-tests),yes) tests-special += $(objpfx)tst-error1-mem.out endif diff --git a/misc/tst-mmap.c b/misc/tst-mmap.c new file mode 100644 index 0000000..8b006b5 --- /dev/null +++ b/misc/tst-mmap.c @@ -0,0 +1,67 @@ +/* mmap offset test. + + Copyright (C) 2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include +#include + +static int +printmsg (int rc, const char *msg) +{ + printf ("%s failed: %m\n", msg); + return rc; +} + +/* Check if negative offset are handled correctly by mmap. */; +static int +do_test_bz18877 (void) +{ + const int prot = PROT_READ | PROT_WRITE; + const int flags = MAP_SHARED; + const unsigned long length = 0x10000; + const unsigned long offset = 0xace00000; + const unsigned long size = offset + length; + void *addr; + int fd; + char fname[] = "tst-mmap-offset-XXXXXX"; + + fd = mkstemp64 (fname); + if (fd < 0) + return printmsg (1, "mkstemp"); + + if (unlink (fname)) + return printmsg (1, "unlink"); + + if (ftruncate64 (fd, size)) + return printmsg (0, "ftruncate64"); + + addr = mmap (NULL, length, prot, flags, fd, offset); + if (MAP_FAILED == addr) + return printmsg (1, "mmap"); + + /* This memcpy is likely to SIGBUS if mmap has messed up with offset. */ + memcpy (addr, fname, sizeof (fname)); + + return 0; +} + +#define TEST_FUNCTION do_test_bz18877 () +#include "../test-skeleton.c" diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/mmap.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/mmap.c index 24835ce..f5a4c32 100644 --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/mmap.c +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/mmap.c @@ -21,20 +21,20 @@ #include #include -#ifndef MMAP_PAGE_SHIFT -#define MMAP_PAGE_SHIFT 12 +#ifndef MMAP_PAGE_UNIT +#define MMAP_PAGE_UNIT 4096UL #endif __ptr_t __mmap (__ptr_t addr, size_t len, int prot, int flags, int fd, off_t offset) { - if (offset & ((1 << MMAP_PAGE_SHIFT) - 1)) + if (offset & (MMAP_PAGE_UNIT - 1)) { __set_errno (EINVAL); return MAP_FAILED; } return (__ptr_t) INLINE_SYSCALL (mmap2, 6, addr, len, prot, flags, fd, - offset >> MMAP_PAGE_SHIFT); + offset/MMAP_PAGE_UNIT); } weak_alias (__mmap, mmap)