From patchwork Thu Aug 27 21:20:50 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 52780 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-wi0-f200.google.com (mail-wi0-f200.google.com [209.85.212.200]) by patches.linaro.org (Postfix) with ESMTPS id 80A9F22EA3 for ; Thu, 27 Aug 2015 21:21:12 +0000 (UTC) Received: by wieo17 with SMTP id o17sf510806wie.2 for ; Thu, 27 Aug 2015 14:21:11 -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:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-type :content-transfer-encoding:x-original-sender :x-original-authentication-results; bh=tQdfFxX6XZUys5Ssj49GkNNfnDAMJb5rVLQeygT3scc=; b=eaXo+sP/Ql/+3D/a184HxDl+kTGE2EvxSccY03gJIPZzy25/4mf6rhYkF/OwwJMJts Y1raHh+JaboL0dp1T9eRXIGPrz7L2UK2VPUIH4nAjJoyXtIn4EQxW8zB+tzrfq0oDFQ3 xPWkgPwh7u1zNTWm3yDaAbY06UdNciPu6s/6ZikX32ah2eolwlfvljcE//lldP/AgvVt ILbR0mpCzHZG9vb0kImtcWWGQVhA/XI01BR+74RM8iOpKaP9rra+4J86ry7VzldiAl1B RRSPAQnhcUyaWwPcA1SAiP8YZ3XD3kr1KvsSWv8BE4BrzIiSvfQ/djaACOnx2JfSn+Sv tL/g== X-Gm-Message-State: ALoCoQmWE66UfQM9Ym2qZ7lNvkD6a75ZBsOZBpKDIYnF67ipPzC9KXlCQG3IIqC2yFvtrGvm9xI/ X-Received: by 10.152.6.103 with SMTP id z7mr1802199laz.8.1440710471407; Thu, 27 Aug 2015 14:21:11 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.246.36 with SMTP id xt4ls154214lac.1.gmail; Thu, 27 Aug 2015 14:21:11 -0700 (PDT) X-Received: by 10.112.141.136 with SMTP id ro8mr3248668lbb.88.1440710471265; Thu, 27 Aug 2015 14:21:11 -0700 (PDT) Received: from mail-lb0-x22f.google.com (mail-lb0-x22f.google.com. [2a00:1450:4010:c04::22f]) by mx.google.com with ESMTPS id lf9si3639616lab.167.2015.08.27.14.21.11 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 27 Aug 2015 14:21:11 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 2a00:1450:4010:c04::22f as permitted sender) client-ip=2a00:1450:4010:c04::22f; Received: by lbbpu9 with SMTP id pu9so19401374lbb.3 for ; Thu, 27 Aug 2015 14:21:11 -0700 (PDT) X-Received: by 10.112.209.106 with SMTP id ml10mr3203318lbc.112.1440710470951; Thu, 27 Aug 2015 14:21:10 -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 us2csp95648lbb; Thu, 27 Aug 2015 14:21:09 -0700 (PDT) X-Received: by 10.66.131.10 with SMTP id oi10mr9636110pab.87.1440710469792; Thu, 27 Aug 2015 14:21:09 -0700 (PDT) Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id q1si5938281pdg.31.2015.08.27.14.21.08 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 27 Aug 2015 14:21:09 -0700 (PDT) Received-SPF: pass (google.com: domain of libc-alpha-return-62759-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Received: (qmail 98375 invoked by alias); 27 Aug 2015 21:20:58 -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 98330 invoked by uid 89); 27 Aug 2015 21:20:57 -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-f181.google.com X-Received: by 10.129.40.207 with SMTP id o198mr3900104ywo.145.1440710453811; Thu, 27 Aug 2015 14:20:53 -0700 (PDT) Subject: Re: [PATCH] Fix wordsize-32 mmap offset for negative value (BZ#18877) To: libc-alpha@sourceware.org References: <55DF6F59.3000404@linaro.org> <20150827205128.GA2635@altlinux.org> From: Adhemerval Zanella Message-ID: <55DF7F32.2010308@linaro.org> Date: Thu, 27 Aug 2015 18:20:50 -0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.2.0 MIME-Version: 1.0 In-Reply-To: <20150827205128.GA2635@altlinux.org> 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::22f as permitted sender) smtp.mailfrom=patch+caf_=patchwork-forward=linaro.org@linaro.org; dkim=pass header.i=@sourceware.org X-Google-Group-Id: 836684582541 On 27-08-2015 17:51, Dmitry V. Levin wrote: > On Thu, Aug 27, 2015 at 05:13:13PM -0300, Adhemerval Zanella wrote: >> 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. > > As we have posix/tst-mmap.c already, my idea was to call it > tst-mmap-offset.c, > >> + char fname[] = "tst-mmap-offset-XXXXXX"; > > hence the name of this temporary file. > >> - offset >> MMAP_PAGE_SHIFT); >> + offset/MMAP_PAGE_UNIT); > > offset / MMAP_PAGE_UNIT Thanks for the review, what about now: --- [BZ #18877] * posix/Makefile (tests): Add tst-mmap * sysdeps/unix/sysv/linux/generic/wordsize-32/mmap.c (__mmap): Fix offset calculation for negative values. * posix/tst-mmap-offset.c: New file. -- diff --git a/posix/Makefile b/posix/Makefile index 15e8818..39423a9 100644 --- a/posix/Makefile +++ b/posix/Makefile @@ -64,7 +64,7 @@ routines := \ aux := init-posix environ tests := tstgetopt testfnm runtests runptests \ tst-preadwrite tst-preadwrite64 test-vfork regexbug1 \ - tst-mmap tst-getaddrinfo tst-truncate \ + tst-mmap tst-mmap-offset tst-getaddrinfo tst-truncate \ tst-truncate64 tst-fork tst-fnmatch tst-regexloc tst-dir \ tst-chmod bug-regex1 bug-regex2 bug-regex3 bug-regex4 \ tst-gnuglob tst-regex bug-regex5 bug-regex6 bug-regex7 \ diff --git a/posix/tst-mmap-offset.c b/posix/tst-mmap-offset.c new file mode 100644 index 0000000..15dc4da --- /dev/null +++ b/posix/tst-mmap-offset.c @@ -0,0 +1,67 @@ +/* BZ #18877 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 (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 () +#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..82d8920 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)