]> jfr.im git - irc/quakenet/newserv.git/commitdiff
Add memory protection to debug version of (old) sstring.
authorChris Porter <redacted>
Tue, 19 Aug 2008 01:23:36 +0000 (02:23 +0100)
committerChris Porter <redacted>
Tue, 19 Aug 2008 01:23:36 +0000 (02:23 +0100)
lib/sstring.c

index ade298ef23665b9bc62a9257d286d9da6f391f52..86eac12964561c2137f84f1f6cae81ba06284e53 100644 (file)
@@ -192,6 +192,11 @@ void sstringstats(int hooknum, void *arg) {
 
 #else /* USE_VALGRIND */
 
+#include <sys/mman.h>
+
+#define MModify(x) mprotect(x, x->s->u.l.alloc, PROT_READ|PROT_WRITE)
+#define MUnmodify(x) mprotect(x, x->s->u.l.alloc, PROT_READ)
+
 typedef struct sstringlist {
   struct sstringlist *prev;
   struct sstringlist *next;
@@ -210,6 +215,8 @@ void finisstring() {
 
   for(s=head;s;s=sn) {
     sn = s->next;
+
+    MModify(s);
     s->next = NULL;
     s->prev = NULL;
 
@@ -223,6 +230,7 @@ sstring *getsstring(const char *inputstr, int maxlen) {
   sstringlist *s;
   size_t len;
   char *p;
+  void *m;
 
   if(!inputstr)
     return NULL;
@@ -231,20 +239,29 @@ sstring *getsstring(const char *inputstr, int maxlen) {
     ; /* empty */
 
   len = p - inputstr;
-  s=(sstringlist *)malloc(sizeof(sstringlist) + sizeof(sstring));
-  
+  m=mmap((void *)0, sizeof(sstringlist) + sizeof(sstring) + len + 1, PROT_WRITE|PROT_READ, MAP_PRIVATE|MAP_ANON, -1, 0);
+  s=(sstringlist *)m;
+
+  if(m == MAP_FAILED)
+    s->s->u.l.length = 0;
+
   s->s->u.l.length = len;
-  s->s->content=(char *)malloc(len + 1);
+  s->s->u.l.alloc = sizeof(sstringlist) + sizeof(sstring) + len + 1;
+  s->s->content=(char *)m + sizeof(sstringlist) + sizeof(sstring);
 
   memcpy(s->s->content, inputstr, len);
   s->s->content[len] = '\0';
 
   s->next = head;
   s->prev = NULL;
-  if(head)
+  if(head) {
+    MModify(head);
     head->prev = s;
+    MUnmodify(head);
+  }
   head = s;
 
+  MUnmodify(s);
   return s->s;
 }
 
@@ -255,18 +272,26 @@ void freesstring(sstring *inval) {
 
   s = (sstringlist *)inval - 1;
 
+  MModify(s);
   if(s->prev) {
+    MModify(s->prev);
     s->prev->next = s->next;
-    if(s->next)
+    MUnmodify(s->prev);
+    if(s->next) {
+      MModify(s->next);
       s->next->prev = s->prev;
+      MUnmodify(s->prev);
+    }
   } else {
     head = s->next;
-    if(head)
+    if(head) {
+      MModify(head);
       head->prev = NULL;
+      MUnmodify(head);
+    }
   }
 
-  free(inval->content);
-  free(s);
+  munmap(s, s->s->u.l.alloc);
 }
 #endif