Ho cercato di utilizzare prima mprotect
prima di leggere e poi di scrivere.Comportamento di PROT_READ e PROT_WRITE con mprotect
'qui il mio codice
#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;
}
Sotto Linux ecco i risultati:
Ecco l'output per PROT_WRITE
:
$ ./main
a = 42
a = 24
e per PROT_READ
$ ./main
a = 42
Segmentation fault
In Mac OS X 10.7:
Ecco l'output per PROT_WRITE
:
$ ./main
a = 42
a = 24
e per PROT_READ
$ ./main
[1] 2878 bus error ./main
Finora, ho capito che il comportamento OSX/Linux potrebbe essere diverso, ma non capisco perché PROT_WRITE
non blocchi il programma durante la lettura del valore con printf
.
Qualcuno può spiegare questa parte?
Perché dovresti aspettarti che "PROT_WRITE" si arresti? – Art
perché con solo flag 'PROT_WRITE', la memoria dovrebbe essere illeggibile AFAIK. Se si desidera accedere rw, è necessario 'PROT_WRITE | Flag PROT_READ' – Mali
@Mali a destra, che avrebbe senso come una domanda se si aspettava un crash durante la lettura dell'argomento sul primo printf, non quando sovrascriveva il valore con '* a = 24'. Ad ogni modo, ho cercato di coprire tutto questo nella mia risposta. – Art