1*b7041c07Sderaadt /* $OpenBSD: mmap0.c,v 1.3 2021/10/24 21:24:20 deraadt Exp $ */
2b77a1a04Sariane /*
3b77a1a04Sariane * Copyright (c) 2011 Ariane van der Steldt <ariane@stack.nl>
4b77a1a04Sariane *
5b77a1a04Sariane * Permission to use, copy, modify, and distribute this software for any
6b77a1a04Sariane * purpose with or without fee is hereby granted, provided that the above
7b77a1a04Sariane * copyright notice and this permission notice appear in all copies.
8b77a1a04Sariane *
9b77a1a04Sariane * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10b77a1a04Sariane * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11b77a1a04Sariane * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12b77a1a04Sariane * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13b77a1a04Sariane * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14b77a1a04Sariane * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15b77a1a04Sariane * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16b77a1a04Sariane */
17b77a1a04Sariane
18b77a1a04Sariane #include <sys/types.h>
19b77a1a04Sariane #include <sys/mman.h>
20b77a1a04Sariane #include <err.h>
21b77a1a04Sariane #include <errno.h>
2238f718e5Sguenther #include <fcntl.h>
2338f718e5Sguenther #include <stdio.h>
2438f718e5Sguenther #include <sysexits.h>
25b77a1a04Sariane
26b77a1a04Sariane
27b77a1a04Sariane /*
28b77a1a04Sariane * Mmap allocations with len=0 must fail with EINVAL.
29b77a1a04Sariane *
30b77a1a04Sariane * Posix says so and the vmmap implementation may not deal well with them
31b77a1a04Sariane * either.
32b77a1a04Sariane */
33b77a1a04Sariane int
main()34b77a1a04Sariane main()
35b77a1a04Sariane {
36b77a1a04Sariane void *ptr;
37b77a1a04Sariane int errors = 0;
38b77a1a04Sariane int fd;
39b77a1a04Sariane
40*b7041c07Sderaadt fd = open("/dev/zero", O_RDWR);
41b77a1a04Sariane if (fd == -1)
42b77a1a04Sariane err(EX_OSERR, "open");
43b77a1a04Sariane
44b77a1a04Sariane ptr = mmap(NULL, 0, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
45b77a1a04Sariane if (ptr != MAP_FAILED) {
46b77a1a04Sariane warn("mmap(len=0, MAP_ANON) return %p, expected MAP_FAILED",
47b77a1a04Sariane ptr);
48b77a1a04Sariane errors += 1;
49b77a1a04Sariane } else if (errno != EINVAL) {
50b77a1a04Sariane warn("mmap(len=0, MAP_ANON) errno %d, expected %d",
51b77a1a04Sariane errno, EINVAL);
52b77a1a04Sariane }
53b77a1a04Sariane
54b77a1a04Sariane ptr = mmap(NULL, 0, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
55b77a1a04Sariane if (ptr != MAP_FAILED) {
56b77a1a04Sariane warn("mmap(len=0, fd=\"/dev/zero\") returned %p, "
57b77a1a04Sariane "expected MAP_FAILED", ptr);
58b77a1a04Sariane errors += 1;
59b77a1a04Sariane } else if (errno != EINVAL) {
60b77a1a04Sariane warn("mmap(len=0, fd=\"/dev/zero\") errno %d, expected %d",
61b77a1a04Sariane errno, EINVAL);
62b77a1a04Sariane }
63b77a1a04Sariane
64b77a1a04Sariane return errors;
65b77a1a04Sariane }
66