also BADFOOD on realloc
authorChristian Grothoff <christian@grothoff.org>
Wed, 25 Dec 2019 16:00:16 +0000 (17:00 +0100)
committerChristian Grothoff <christian@grothoff.org>
Wed, 25 Dec 2019 16:01:55 +0000 (17:01 +0100)
contrib/build-common
src/util/.gitignore
src/util/common_allocation.c
src/util/perf_malloc.c

index 1915a74bbb4cd2ae9bc541a382dfebc37064a2fd..6ac60bd0b1f96324b4175fa03aaf9780ed8efb47 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 1915a74bbb4cd2ae9bc541a382dfebc37064a2fd
+Subproject commit 6ac60bd0b1f96324b4175fa03aaf9780ed8efb47
index dfa6c7947da8ec400099839dc5b798ddaa0eb622..01ebcc8345d5e762b884ba619148eb4fe373dd49 100644 (file)
@@ -74,3 +74,4 @@ test_regex
 test_tun
 gnunet-timeout
 python27_location
+perf_malloc
index 137af7b85013c9cda2a61d8d948529ca051f40fc..35c557000bf89c193dbdcf907cf87a69ad9fb701 100644 (file)
@@ -264,6 +264,30 @@ GNUNET_xrealloc_ (void *ptr, size_t n, const char *filename, int linenumber)
   n += sizeof(size_t);
   ptr = &((size_t *) ptr)[-1];
   mem_used = mem_used - *((size_t *) ptr) + n;
+#endif
+#if defined(M_SIZE)
+#if ENABLE_POISONING
+  {
+    uint64_t *base = ptr;
+    size_t s = M_SIZE (ptr);
+
+    if (s > n)
+    {
+      const uint64_t baadfood = GNUNET_ntohll (0xBAADF00DBAADF00DLL);
+      char *cbase = ptr;
+
+      GNUNET_memcpy (&cbase[n],
+                     &baadfood,
+                     GNUNET_MIN (8 - (n % 8),
+                                 s - n));
+      for (size_t i = 1 + (n + 7) / 8; i < s / 8; i++)
+        base[i] = baadfood;
+      GNUNET_memcpy (&base[s / 8],
+                     &baadfood,
+                     s % 8);
+    }
+  }
+#endif
 #endif
   ptr = realloc (ptr, n);
   if ((NULL == ptr) && (n > 0))
@@ -316,9 +340,8 @@ GNUNET_xfree_ (void *ptr, const char *filename, int linenumber)
     const uint64_t baadfood = GNUNET_ntohll (0xBAADF00DBAADF00DLL);
     uint64_t *base = ptr;
     size_t s = M_SIZE (ptr);
-    size_t i;
 
-    for (i = 0; i < s / 8; i++)
+    for (size_t i = 0; i < s / 8; i++)
       base[i] = baadfood;
     GNUNET_memcpy (&base[s / 8], &baadfood, s % 8);
   }
index 727e15979521ed197307975a91a173df7a7c0a8d..6582505c8e9ee009713b5e8810975f68898bf9aa 100644 (file)
 #include <gauger.h>
 
 static uint64_t
-perfMalloc ()
+perf_malloc ()
 {
-  size_t i;
   uint64_t ret;
 
   ret = 0;
-  for (i = 1; i < 1024 * 1024; i += 1024)
+  for (size_t i = 1; i < 1024 * 1024; i += 1024)
   {
     ret += i;
     GNUNET_free (GNUNET_malloc (i));
@@ -43,6 +42,32 @@ perfMalloc ()
 }
 
 
+static uint64_t
+perf_realloc ()
+{
+  uint64_t ret;
+
+  ret = 0;
+  for (size_t i = 10; i < 1024 * 1024 / 5; i += 1024)
+  {
+    char *ptr;
+
+    ret += i;
+    ptr = GNUNET_malloc (i);
+    memset (ptr, 1, i);
+    ptr = GNUNET_realloc (ptr, i + 5);
+    for (size_t j=0;j<i;j++)
+      GNUNET_assert (1 == ptr[j]);
+    memset (ptr, 6, i + 5);
+    ptr = GNUNET_realloc (ptr, i - 5);
+    for (size_t j=0;j<i-5;j++)
+      GNUNET_assert (6 == ptr[j]);
+    GNUNET_free (ptr);
+  }
+  return ret;
+}
+
+
 int
 main (int argc, char *argv[])
 {
@@ -50,7 +75,7 @@ main (int argc, char *argv[])
   uint64_t kb;
 
   start = GNUNET_TIME_absolute_get ();
-  kb = perfMalloc ();
+  kb = perf_malloc ();
   printf ("Malloc perf took %s\n",
           GNUNET_STRINGS_relative_time_to_string (
             GNUNET_TIME_absolute_get_duration (start),
@@ -59,6 +84,12 @@ main (int argc, char *argv[])
           kb / 1024 / (1
                        + GNUNET_TIME_absolute_get_duration
                          (start).rel_value_us / 1000LL), "kb/ms");
+  start = GNUNET_TIME_absolute_get ();
+  kb = perf_realloc ();
+  printf ("Realloc perf took %s\n",
+          GNUNET_STRINGS_relative_time_to_string (
+            GNUNET_TIME_absolute_get_duration (start),
+            GNUNET_YES));
   return 0;
 }