mprotect locked arrays.
authorFlorent Bruneau <florent.bruneau@polytechnique.org>
Sun, 28 Sep 2008 09:34:38 +0000 (11:34 +0200)
committerFlorent Bruneau <florent.bruneau@polytechnique.org>
Sun, 28 Sep 2008 09:34:38 +0000 (11:34 +0200)
Signed-off-by: Florent Bruneau <florent.bruneau@polytechnique.org>
common/array.h

index 86cf360..0ca70de 100644 (file)
         array_wipe(array);                                                     \
     } while (0)
 
+#define array_byte_len(array) (array).len * sizeof(*(array).data)
+
 #define array_lock(array)                                                      \
-    ((array).locked ||                                                         \
-        (mlock((array).data, (array).len * sizeof(*(array).data)) == 0         \
-         && ((array).locked = true)))
+    ((array).locked                                                            \
+     || (mprotect((array).data, array_byte_len(array), PROT_READ) == 0         \
+         && mlock((array).data, array_byte_len(array)) == 0                    \
+         && ((array).locked = true))                                           \
+     || (mprotect((array).data, array_byte_len(array),                         \
+                  PROT_READ | PROT_WRITE) > 0))
 #define array_unlock(array)                                                    \
     if ((array).locked) {                                                      \
-        (void)munlock((array).data, (array).len * sizeof(*(array).data));      \
+        (void)munlock((array).data, array_byte_len(array));                    \
+        (void)mprotect((array).data, array_byte_len(array),                    \
+                       PROT_READ | PROT_WRITE);                                \
         (array).locked = false;                                                \
     }