xref: /openbsd-src/regress/sys/uvm/mmap0/mmap0.c (revision b7041c0781c8668129da8084451ded41b0c43954)
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