]> git.ozlabs.org Git - ccan/blobdiff - ccan/talloc/talloc.c
gitify the tree, especially the web makefile.
[ccan] / ccan / talloc / talloc.c
index a5cd447e908b79cafc6709d860eac959715a9150..ed958a8e5f25fdbeebf83f30b1ea8fef82d018bc 100644 (file)
@@ -43,7 +43,7 @@
 #define ALWAYS_REALLOC 0
 
 
 #define ALWAYS_REALLOC 0
 
 
-#define MAX_TALLOC_SIZE 0x10000000
+#define MAX_TALLOC_SIZE 0x7FFFFFFF
 #define TALLOC_MAGIC 0xe814ec70
 #define TALLOC_FLAG_FREE 0x01
 #define TALLOC_FLAG_LOOP 0x02
 #define TALLOC_MAGIC 0xe814ec70
 #define TALLOC_FLAG_FREE 0x01
 #define TALLOC_FLAG_LOOP 0x02
@@ -789,6 +789,35 @@ void *_talloc(const void *context, size_t size)
        return __talloc(context, size);
 }
 
        return __talloc(context, size);
 }
 
+static int talloc_destroy_pointer(void ***pptr)
+{
+       if ((uintptr_t)**pptr < getpagesize())
+               TALLOC_ABORT("Double free or invalid talloc_set?");
+       /* Invalidate pointer so it can't be used again. */
+       **pptr = (void *)1;
+       return 0;
+}
+
+void _talloc_set(void *ptr, const void *ctx, size_t size, const char *name)
+{
+       void ***child;
+       void **pptr = ptr;
+
+       *pptr = talloc_named_const(ctx, size, name);
+       if (unlikely(!*pptr))
+               return;
+
+       child = talloc(*pptr, void **);
+       if (unlikely(!child)) {
+               talloc_free(*pptr);
+               *pptr = NULL;
+               return;
+       }
+       *child = pptr;
+       talloc_set_name_const(child, "talloc_set destructor");
+       talloc_set_destructor(child, talloc_destroy_pointer);
+}
+
 /*
   externally callable talloc_set_name_const()
 */
 /*
   externally callable talloc_set_name_const()
 */