Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 28 Feb 2000 12:50:13 -0800
From:      Brooks Davis <brooks@one-eyed-alien.net>
To:        freebsd-hackers@freebsd.org
Subject:   mprotect(2) won't make shared memory read-only
Message-ID:  <20000228125013.A25992@orion.ac.hmc.edu>

next in thread | raw e-mail | index | archive | help
On a -current system as of a week or two ago (as well as a 3.3-RC and a
2.2.8-STABLE box) I've found that mprotect fails with with EACCES when
trying to make a shared memory segment that was created user read/write
read-only.  It works find if I malloc the memory instead and making the
shm segment write-only or inaccessible works fine as well.  Is this
expected behavior?  If so it's pretty weird.

The following program can be used to exercise the bug.  Compiled normally
it will attempt to use SysV shared memory and compiled with -DUSEMALLOC
it will malloc the memory.  The correct behavior is to bus error and
dump core due to a trap on one of the memory accesses following the
mprotect.

--<cut>--
/* Test the mprotect(2) function */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define SIZE 1024*sizeof(int)

int main(int argc, char **argv)
{
	int *array;

#ifdef USEMALLOC
	array = malloc(SIZE);
#else
	int shmid;
	shmid = shmget(IPC_PRIVATE, SIZE, SHM_R|SHM_W);
	array = shmat(shmid, NULL, 0);
	shmctl(shmid, IPC_RMID, NULL);
#endif

	bzero(array, SIZE);

	if(mprotect(array, SIZE, PROT_READ) != 0)
		perror("mprotect(array) failed");

	fprintf(stderr, "array[0] = %d\n", array[0]);

	array[0] = 1;

	return 0;
}
--<cut>--

Thanks,
Brooks

-- 
Any statement of the form "X is the one, true Y" is FALSE.


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20000228125013.A25992>