X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftalloc%2Ftalloc.c;h=ed958a8e5f25fdbeebf83f30b1ea8fef82d018bc;hp=a5cd447e908b79cafc6709d860eac959715a9150;hb=d1cea3ebf96f61b5bbac1e74975700770e06add6;hpb=f7d595da4f2859256625bf59585a6f988b781f44;ds=sidebyside diff --git a/ccan/talloc/talloc.c b/ccan/talloc/talloc.c index a5cd447e..ed958a8e 100644 --- a/ccan/talloc/talloc.c +++ b/ccan/talloc/talloc.c @@ -43,7 +43,7 @@ #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 @@ -789,6 +789,35 @@ void *_talloc(const void *context, size_t 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() */