diff options
author | Artur Grabowski <art@cvs.openbsd.org> | 2011-07-05 17:48:16 +0000 |
---|---|---|
committer | Artur Grabowski <art@cvs.openbsd.org> | 2011-07-05 17:48:16 +0000 |
commit | 53225b3b3c79afda318c0c915e2d61fe0cb9addc (patch) | |
tree | 7167c90e5532c866048a60cef7ff9834d2512da2 /regress/sys | |
parent | 5c445af1674ad181574daa345a1b7584e6e0a194 (diff) |
Test for when we're writing to a file from an mmaped area of the file.
Diffstat (limited to 'regress/sys')
-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); +} |