diff options
author | 2011-07-05 17:48:15 +0000 | |
---|---|---|
committer | 2011-07-05 17:48:15 +0000 | |
commit | 98a610fc7a32eca587d30d9aeb476724e1d2c24d (patch) | |
tree | 67627708ace678852cfd751ea1c6f7a266d20bc3 | |
parent | More non-512-byte sector groundwork. Don't let disklabel hint that (diff) | |
download | wireguard-openbsd-98a610fc7a32eca587d30d9aeb476724e1d2c24d.tar.xz wireguard-openbsd-98a610fc7a32eca587d30d9aeb476724e1d2c24d.zip |
Test for when we're writing to a file from an mmaped area of the file.
-rw-r--r-- | regress/sys/uvm/mmap_write_self/Makefile | 5 | ||||
-rw-r--r-- | regress/sys/uvm/mmap_write_self/mmap_write_self.c | 58 |
2 files changed, 63 insertions, 0 deletions
diff --git a/regress/sys/uvm/mmap_write_self/Makefile b/regress/sys/uvm/mmap_write_self/Makefile new file mode 100644 index 00000000000..4ad508eccfa --- /dev/null +++ b/regress/sys/uvm/mmap_write_self/Makefile @@ -0,0 +1,5 @@ +# $OpenBSD: Makefile,v 1.1 2011/07/05 17:48:15 art Exp $ + +PROG=mmap_write_self + +.include <bsd.regress.mk> diff --git a/regress/sys/uvm/mmap_write_self/mmap_write_self.c b/regress/sys/uvm/mmap_write_self/mmap_write_self.c new file mode 100644 index 00000000000..417850d072a --- /dev/null +++ b/regress/sys/uvm/mmap_write_self/mmap_write_self.c @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2011 Artur Grabowski <art@openbsd.org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + + +#include <sys/types.h> +#include <sys/mman.h> +#include <err.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <unistd.h> +#include <errno.h> + +/* + * Test a corner case writing to a file from an mmap region from that file + * should fail. + */ +int +main(int argc, char **argv) +{ + char name[20] = "/tmp/fluff.XXXXXX"; + char *buf; + size_t ps; + int fd; + + ps = getpagesize(); + + if ((fd = mkstemp(name)) == -1) + err(1, "mkstemp"); + + if (unlink(name) == -1) + err(1, "unlink"); + + buf = mmap(NULL, ps, PROT_READ, MAP_FILE|MAP_SHARED, fd, 0); + if (buf == MAP_FAILED) + err(1, "mmap"); + + if (pwrite(fd, buf, ps, 0) == ps) + errx(1, "write to self succeeded"); + + if (errno != EFAULT) + err(1, "unexpected errno"); + + return (0); +} |