Ich habe versucht, mprotect
gegen Lesen zuerst zu verwenden und dann zu schreiben.Verhalten von PROT_READ und PROT_WRITE mit mprotect
Ist hier mein Code
#include <sys/types.h>
#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
int pagesize = sysconf(_SC_PAGE_SIZE);
int *a;
if (posix_memalign((void**)&a, pagesize, sizeof(int)) != 0)
perror("memalign");
*a = 42;
if (mprotect(a, pagesize, PROT_WRITE) == -1) /* Resp. PROT_READ */
perror("mprotect");
printf("a = %d\n", *a);
*a = 24;
printf("a = %d\n", *a);
free (a);
return 0;
}
Unter Linux sind hier die Ergebnisse:
Hier ist der Ausgang für PROT_WRITE
ist:
$ ./main
a = 42
a = 24
und für PROT_READ
$ ./main
a = 42
Segmentation fault
Unter Mac OS X 10.7:
Hier ist die Ausgabe für PROT_WRITE
:
$ ./main
a = 42
a = 24
und für PROT_READ
$ ./main
[1] 2878 bus error ./main
Bisher Ich verstehe, dass OSX/Linux Verhalten anders sein könnte, aber ich verstehe nicht, warum PROT_WRITE
das Programm beim Lesen des Wertes mit printf
nicht abstürzt.
Kann jemand diesen Teil erklären?
Warum sollten Sie erwarten, dass 'PROT_WRITE' zum Absturz kommt? – Art
weil mit 'PROT_WRITE'-Flag nur Speicher AFAIK unlesbar sein soll. Wenn Sie einen RW-Zugriff wünschen, benötigen Sie 'PROT_WRITE | PROT_READ' flag – Mali
@Mali right, das wäre als Frage sinnvoll wenn er beim Einlesen im Argument zum ersten printf einen Absturz erwarten würde, nicht beim Überschreiben des Wertes mit '* a = 24'. Jedenfalls habe ich versucht, das alles in meiner Antwort zu beschreiben. – Art