X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Ftalloc%2Ftalloc.c;h=fdf8eebed297db56d26abdca812b515702ffdf02;hb=2d4243996a4ace6d4eac1da460dd5bbcb31304ce;hp=ed958a8e5f25fdbeebf83f30b1ea8fef82d018bc;hpb=76ae790f2cc2cb1e46bb0b9e5002c7feb6a79df1;p=ccan diff --git a/ccan/talloc/talloc.c b/ccan/talloc/talloc.c index ed958a8e..fdf8eebe 100644 --- a/ccan/talloc/talloc.c +++ b/ccan/talloc/talloc.c @@ -664,7 +664,7 @@ int talloc_unlink(const void *context, void *ptr) /* add a name to an existing pointer - va_list version */ -static inline const char *talloc_set_name_v(const void *ptr, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); +static inline const char *talloc_set_name_v(const void *ptr, const char *fmt, va_list ap) PRINTF_FMT(2,0); static inline const char *talloc_set_name_v(const void *ptr, const char *fmt, va_list ap) { @@ -801,21 +801,25 @@ static int talloc_destroy_pointer(void ***pptr) void _talloc_set(void *ptr, const void *ctx, size_t size, const char *name) { void ***child; - void **pptr = ptr; + void *p; - *pptr = talloc_named_const(ctx, size, name); - if (unlikely(!*pptr)) - return; + p = talloc_named_const(ctx, size, name); + if (unlikely(!p)) + goto set_ptr; - child = talloc(*pptr, void **); + child = talloc(p, void **); if (unlikely(!child)) { - talloc_free(*pptr); - *pptr = NULL; - return; + talloc_free(p); + p = NULL; + goto set_ptr; } - *child = pptr; + *child = ptr; talloc_set_name_const(child, "talloc_set destructor"); talloc_set_destructor(child, talloc_destroy_pointer); + +set_ptr: + /* memcpy rather than cast avoids aliasing problems. */ + memcpy(ptr, &p, sizeof(p)); } /*