Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 28 Feb 2000 17:04:43 -0800
From:      Brooks Davis <brooks@one-eyed-alien.net>
To:        Brooks Davis <brooks@one-eyed-alien.net>
Cc:        freebsd-hackers@FreeBSD.ORG
Subject:   Re: mprotect(2) won't make shared memory read-only
Message-ID:  <20000228170443.A16556@orion.ac.hmc.edu>
In-Reply-To: <20000228125013.A25992@orion.ac.hmc.edu>; from brooks@one-eyed-alien.net on Mon, Feb 28, 2000 at 12:50:13PM -0800
References:  <20000228125013.A25992@orion.ac.hmc.edu>

next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, Feb 28, 2000 at 12:50:13PM -0800, Brooks Davis wrote:
> 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.

Following up on this.  Charles Randall suggested I try shmctl to make
the segment read-only.  Unfortunatly it appears that shared memory
premissions are screwed up as well.  You can create a read-only shared
memory segment either via shmget or via shmctl on an existing read-write
segment and it will appear via ipcs, but it doesn't appear to have any
effect.  The following program creates a read-only segment and then
proceds to write to it twice, both of which work under FreeBSD -current.
When run on a Solaris 2.6 machine it segfaults in the first write.


--<cut>--
/* Test read-only shared memory segments */
#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;

	int shmid;
	shmid = shmget(IPC_PRIVATE, SIZE, SHM_R);
	array = shmat(shmid, NULL, 0);

	bzero(array, SIZE);

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

	array[0] = 1;

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

	shmctl(shmid, IPC_RMID, NULL);

	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?20000228170443.A16556>