Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 31 Oct 2009 03:38:24 +0100 (CET)
From:      Alexander Best <alexbestms@math.uni-muenster.de>
To:        John Baldwin <jhb@freebsd.org>, <freebsd-hackers@freebsd.org>
Cc:        Alexander Best <alexbestms@math.uni-muenster.de>
Subject:   Re: mmap(2) with MAP_ANON honouring offset although it shouldn't
Message-ID:  <permail-200910310238241e86ffa800003202-a_best01@message-id.uni-muenster.de>
In-Reply-To: <200910211349.10174.jhb@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
  This is a MIME encoded multipart message.

--+permail-200910310238241e86ffa800003202-a_best01+
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

John Baldwin schrieb am 2009-10-21:
> On Wednesday 21 October 2009 11:51:04 am Alexander Best wrote:
> > although the mmap(2) manual states in section MAP_ANON:

> > "The offset argument is ignored."

> > this doesn't seem to be true. running

> > printf("%p\n", mmap((void*)0x1000, 0x1000, PROT_NONE, MAP_ANON, -1,
> > 0x12345678));

> > and

> > printf("%p\n", mmap((void*)0x1000, 0x1000, PROT_NONE, MAP_ANON, -1,
> > 0));

> > produces different outputs. i've attached a patch to solve the
> > problem. the
> > patch is similar to the one proposed in this PR, but should apply
> > cleanly to
> > CURRENT: http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/71258

> A simpler patch would be to simply set pos = 0 below the MAP_STACK
> line if
> MAP_ANON is set.

how about the following patch. problem seems to be that pos = 0 needs to be
set before pageoff is being calculated.

i've tested mmap with MAP_STACK and the offset gets discarded just as
documented in mmap(2). with the patch the offset handling with MAP_ANON and
MAP_STACK (implies MAP_ANON) are the same.

another short question:

why does the second call when doing

        printf("%p\n", mmap((void*)0x1000, 0x1000, PROT_READ|PROT_WRITE,
        MAP_STACK, -1, 0x0));
        printf("%p\n", mmap((void*)0x1000, 0x1000, PROT_READ|PROT_WRITE,
        MAP_STACK, -1, 0x0));

fail? doesn't MAP_STACK allow mapping the same region twice?

        printf("%p\n", mmap((void*)0x1000, 0x1000, PROT_READ|PROT_WRITE,
        MAP_STACK, -1, 0x0));
        printf("%p\n", mmap((void*)0x2000, 0x1000, PROT_READ|PROT_WRITE,
        MAP_STACK, -1, 0x0));

works just as expected.

cheers.
alex

--+permail-200910310238241e86ffa800003202-a_best01+
Content-Type: text/plain
Content-Transfer-Encoding: Base64
Content-Disposition: attachment; filename="vmmmap.c.patch.txt"

LS0tIC91c3Ivc3JjL3N5cy92bS92bV9tbWFwLmMJMjAwOS0xMC0yOCAyMTozNzo1My4wMDAwMDAw
MDAgKzAxMDAKKysrIC4vdm1fbW1hcC5jCTIwMDktMTAtMzEgMDM6MjI6NDQuMDAwMDAwMDAwICsw
MTAwCkBAIC0yNDEsOSArMjQxLDExIEBACiAJCSAgICAoKHByb3QgJiAoUFJPVF9SRUFEIHwgUFJP
VF9XUklURSkpICE9IChQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKSkpCiAJCQlyZXR1cm4gKEVJTlZB
TCk7CiAJCWZsYWdzIHw9IE1BUF9BTk9OOwotCQlwb3MgPSAwOwogCX0KIAorCWlmIChmbGFncyAm
IE1BUF9BTk9OKQorCQlwb3MgPSAwOworCiAJLyoKIAkgKiBBbGlnbiB0aGUgZmlsZSBwb3NpdGlv
biB0byBhIHBhZ2UgYm91bmRhcnksCiAJICogYW5kIHNhdmUgaXRzIHBhZ2Ugb2Zmc2V0IGNvbXBv
bmVudC4KQEAgLTMwMCw3ICszMDIsNiBAQAogCQloYW5kbGUgPSBOVUxMOwogCQloYW5kbGVfdHlw
ZSA9IE9CSlRfREVGQVVMVDsKIAkJbWF4cHJvdCA9IFZNX1BST1RfQUxMOwotCQlwb3MgPSAwOwog
CX0gZWxzZSB7CiAJCS8qCiAJCSAqIE1hcHBpbmcgZmlsZSwgZ2V0IGZwIGZvciB2YWxpZGF0aW9u
IGFuZAo=

--+permail-200910310238241e86ffa800003202-a_best01+--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?permail-200910310238241e86ffa800003202-a_best01>