/**** Kernel Problem Report & Test Case
Summary: mprotect() can't set a memory region as read-only
In the course of our project development, we've noticed a major
flaw in the Linux 2.4.x kernels: in-process memory protection
just doesn't seem to work at all.
I've tried the attached simple program on RedHat 2.4.9-17 and
the lastest 2.4.17 build from IBM, and both fail miserably:
On the s390 box, under both 2.4.x kernels, I get:
[root@s390devel root]# ./foo
Value of mem is 1234
Protect 0x40018000 with 0x5
Protect err=0 (0)
Value of mem is 1235
The expected output (ie, on an x86 box) is the following:
[root@x86devel root]# ./foo
Value of mem is 1234
Protect 0x40016000 with 0x5
Protect err=0 (0)
Segmentation fault (core dumped)
Note the "Segmentation fault" in the x86 case when I try to
write into the mprotect()ed memory...
*/
#include <stdio.h>
#include <errno.h>
#include <sys/mman.h>
#include <limits.h>
#ifndef PAGESIZE
#define PAGESIZE 4096
#endif
int *mem=NULL;
void doit(void)
{
fprintf(stderr,"Value of mem is %x\n",*mem);
}
int main(int argc,char **argv)
{
int err;
mem=mmap(NULL,PAGESIZE,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0);
*mem=0x1234;
doit();
fprintf(stderr,"Protect %p with 0x%x\n",mem,PROT_READ|PROT_EXEC);
err=mprotect(mem,PAGESIZE, PROT_READ|PROT_EXEC);
fprintf(stderr,"Protect err=%d (%d)\n",err,errno);
*mem=0x1235;
doit();
return 0;
}
/**
Jason McMullan, Senior Linux Consultant
Linuxcare, Inc. 412.432.6457 tel, 412.656.3519 cell
[EMAIL PROTECTED], http://www.linuxcare.com/
Linuxcare. Putting open source to work. */