2003-06-29 Miloslav Trmac <mitr@volny.cz>
authorMiloslav Trmac <mitr@volny.cz>
Sat, 28 Jun 2003 23:12:11 +0000 (23:12 +0000)
committerMiloslav Trmac <mitr@volny.cz>
Sat, 28 Jun 2003 23:12:11 +0000 (23:12 +0000)
* dbus/dbus-memory.c (dbus_realloc): Don't check guards after shrinking
the allocated block.
(_dbus_memory_test): New function.
* dbus/dbus-test.h: Add _dbus_memory_test ().
* dbus/dbus-test.c (dbus_internal_do_not_use_run_tests): Call it.

ChangeLog
dbus/dbus-memory.c
dbus/dbus-test.c
dbus/dbus-test.h

index 68c5dfb..55b09ed 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2003-06-29  Miloslav Trmac  <mitr@volny.cz>
 
+       * dbus/dbus-memory.c (dbus_realloc): Don't check guards after shrinking
+       the allocated block.
+       (_dbus_memory_test): New function.
+       * dbus/dbus-test.h: Add _dbus_memory_test ().
+       * dbus/dbus-test.c (dbus_internal_do_not_use_run_tests): Call it.
+
        * dbus/dbus-message.c (decode_header_data): Use %.4s instead
        of %c%c%c%c.
        (dbus_message_new): Remove obsolete @todo.
index 02bc1a4..cfe4dfa 100644 (file)
@@ -555,6 +555,7 @@ dbus_realloc (void  *memory,
     {
       if (memory)
         {
+          size_t old_bytes;
           void *block;
           
           check_guards (memory);
@@ -562,7 +563,8 @@ dbus_realloc (void  *memory,
           block = realloc (((unsigned char*)memory) - GUARD_START_OFFSET,
                            bytes + GUARD_EXTRA_SIZE);
 
-          if (block)
+         old_bytes = *(dbus_uint32_t*)block;
+          if (block && bytes >= old_bytes)
             /* old guards shouldn't have moved */
             check_guards (((unsigned char*)block) + GUARD_START_OFFSET);
           
@@ -762,3 +764,42 @@ dbus_shutdown (void)
 }
 
 /** @} */ /** End of public API docs block */
+
+#ifdef DBUS_BUILD_TESTS
+#include "dbus-test.h"
+
+/**
+ * @ingroup DBusMemoryInternals
+ * Unit test for DBusMemory
+ * @returns #TRUE on success.
+ */
+dbus_bool_t
+_dbus_memory_test (void)
+{
+  dbus_bool_t old_guards;
+  void *p;
+  size_t size;
+
+  old_guards = guards;
+  guards = TRUE;
+  p = dbus_malloc (4);
+  if (p == NULL)
+    _dbus_assert_not_reached ("no memory");
+  for (size = 4; size < 256; size += 4)
+    {
+      p = dbus_realloc (p, size);
+      if (p == NULL)
+       _dbus_assert_not_reached ("no memory");
+    }
+  for (size = 256; size != 0; size -= 4)
+    {
+      p = dbus_realloc (p, size);
+      if (p == NULL)
+       _dbus_assert_not_reached ("no memory");
+    }
+  dbus_free (p);
+  guards = old_guards;
+  return TRUE;
+}
+
+#endif
index 00eb22d..2fbab5a 100644 (file)
@@ -105,7 +105,13 @@ dbus_internal_do_not_use_run_tests (const char *test_data_dir)
     die ("marshalling");
 
   check_memleaks ();
+
+  printf ("%s: running memory tests\n", "dbus-test");
+  if (!_dbus_memory_test ())
+    die ("memory");
   
+  check_memleaks ();
+
   printf ("%s: running memory pool tests\n", "dbus-test");
   if (!_dbus_mem_pool_test ())
     die ("memory pools");
index 2216a43..22a43f7 100644 (file)
@@ -52,6 +52,7 @@ dbus_bool_t _dbus_data_slot_test       (void);
 dbus_bool_t _dbus_sysdeps_test         (void);
 dbus_bool_t _dbus_spawn_test           (const char *test_data_dir);
 dbus_bool_t _dbus_userdb_test          (const char *test_data_dir);
+dbus_bool_t _dbus_memory_test         (void);
 
 
 void        dbus_internal_do_not_use_run_tests         (const char          *test_data_dir);