9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi/*
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi * This file and its contents are supplied under the terms of the
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi * Common Development and Distribution License ("CDDL"), version 1.0.
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi * You may only use this file in accordance with the terms of version
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi * 1.0 of the CDDL.
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi *
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi * A full copy of the text of the CDDL should have accompanied this
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi * source. A copy of the CDDL is also available via the Internet at
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi * http://www.illumos.org/license/CDDL.
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi */
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi/*
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi * Copyright (c) 2015, Joyent, Inc.
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi */
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi/*
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi * Verify that using MC_INHERIT_ZERO doesn't work on mappings that aren't
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi * anonymous private mappings.
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi */
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi#include <sys/types.h>
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi#include <unistd.h>
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi#include <assert.h>
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi#include <sys/mman.h>
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi#include <string.h>
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi#include <errno.h>
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi#include <stdlib.h>
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi#include <wait.h>
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi#include <sys/stat.h>
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi#include <fcntl.h>
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchiint
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchimain(void)
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi{
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi void *buf;
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi int ret, fd;
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi char *template = "/tmp/inz_inval.XXXXXX";
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi char *tmpfile;
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi size_t mapsz = sysconf(_SC_PAGESIZE) * 2;
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi caddr_t bad = (caddr_t)(uintptr_t)23;
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi buf = mmap(NULL, mapsz, PROT_READ | PROT_WRITE,
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi MAP_PRIVATE | MAP_ANON, -1, 0);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi assert(buf != MAP_FAILED);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi /* Bad arguments to memcntl */
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi ret = memcntl(buf, mapsz, MC_INHERIT_ZERO, bad, 0, 0);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi assert(ret == -1);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi assert(errno == EINVAL);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi ret = memcntl(buf, mapsz, MC_INHERIT_ZERO, 0, PROT_READ, 0);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi assert(ret == -1);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi assert(errno == EINVAL);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi ret = memcntl(buf, mapsz, MC_INHERIT_ZERO, bad, PROT_READ | PRIVATE, 0);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi assert(ret == -1);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi assert(errno == EINVAL);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi ret = memcntl(buf, mapsz, MC_INHERIT_ZERO, 0, 0, 1);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi assert(ret == -1);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi assert(errno == EINVAL);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi ret = munmap(buf, mapsz);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi assert(ret == 0);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi /* Mapping non-existant region */
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi ret = memcntl(buf, mapsz, MC_INHERIT_ZERO, 0, 0, 0);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi assert(ret == -1);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi assert(errno == ENOMEM);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi /* Map anon MAP_SHARED */
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi buf = mmap(NULL, mapsz, PROT_READ | PROT_WRITE,
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi MAP_SHARED | MAP_ANON, -1, 0);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi assert(buf != MAP_FAILED);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi ret = memcntl(buf, mapsz, MC_INHERIT_ZERO, 0, 0, 0);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi assert(ret == -1);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi assert(errno == EINVAL);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi ret = munmap(buf, mapsz);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi assert(ret == 0);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi /* Grab a temp file and get it to be the right size */
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi tmpfile = strdup(template);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi assert(tmpfile != NULL);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi fd = mkstemp(tmpfile);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi assert(fd >= 0);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi ret = ftruncate(fd, mapsz);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi assert(ret == 0);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi /* MAP_PRIVATE file */
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi buf = mmap(NULL, mapsz, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi assert(buf != MAP_FAILED);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi ret = memcntl(buf, mapsz, MC_INHERIT_ZERO, 0, 0, 0);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi assert(ret == -1);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi assert(errno == EINVAL);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi ret = munmap(buf, mapsz);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi assert(ret == 0);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi /* MAP_SHARED file */
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi buf = mmap(NULL, mapsz, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi assert(buf != MAP_FAILED);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi ret = memcntl(buf, mapsz, MC_INHERIT_ZERO, 0, 0, 0);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi assert(ret == -1);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi assert(errno == EINVAL);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi ret = munmap(buf, mapsz);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi assert(ret == 0);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi ret = close(fd);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi assert(ret == 0);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi (void) unlink(tmpfile);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi free(tmpfile);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi return (0);
9d12795f87b63c2e39e87bff369182edd34677d3Robert Mustacchi}