talloc: change TALLOC_MAGIC for version 2.0.0
[metze/samba/wip.git] / lib / talloc / talloc.c
index 60a48ad8112593754fe1729f2dc3e243924fc76d..c8ecac1619fa423dce8d1a3cf30bb9fe18bf9fb5 100644 (file)
@@ -57,7 +57,9 @@
 
 
 #define MAX_TALLOC_SIZE 0x10000000
-#define TALLOC_MAGIC 0xe814ec70
+#define TALLOC_MAGIC_V1 0xe814ec70
+#define TALLOC_MAGIC_V2 0xe814ec80
+#define TALLOC_MAGIC    TALLOC_MAGIC_V2
 #define TALLOC_FLAG_FREE 0x01
 #define TALLOC_FLAG_LOOP 0x02
 #define TALLOC_FLAG_POOL 0x04          /* This is a talloc pool */
@@ -154,6 +156,11 @@ static void talloc_abort(const char *reason)
        talloc_abort_fn(reason);
 }
 
+static void talloc_abort_magic_v1(void)
+{
+       talloc_abort("Bad talloc magic value - old magic v1 used");
+}
+
 static void talloc_abort_double_free(void)
 {
        talloc_abort("Bad talloc magic value - double free");
@@ -170,6 +177,10 @@ static inline struct talloc_chunk *talloc_chunk_from_ptr(const void *ptr)
        const char *pp = (const char *)ptr;
        struct talloc_chunk *tc = discard_const_p(struct talloc_chunk, pp - TC_HDR_SIZE);
        if (unlikely((tc->flags & (TALLOC_FLAG_FREE | ~0xF)) != TALLOC_MAGIC)) { 
+               if ((tc->flags & (~0xF)) == TALLOC_MAGIC_V1)) {
+                       talloc_abort_magic_v1();
+               }
+
                if (tc->flags & TALLOC_FLAG_FREE) {
                        talloc_abort_double_free();
                } else {
@@ -1008,6 +1019,11 @@ void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *n
                return NULL;
        }
 
+       /* don't let anybody try to realloc a talloc_pool */
+       if (unlikely(tc->flags & TALLOC_FLAG_POOL)) {
+               return NULL;
+       }
+
        /* don't shrink if we have less than 1k to gain */
        if ((size < tc->size) && ((tc->size - size) < 1024)) {
                tc->size = size;