diff options
author | Rusty Russell <rusty@rustcorp.com.au> | 2010-11-03 10:46:42 +1030 |
---|---|---|
committer | Rusty Russell <rusty@rustcorp.com.au> | 2010-11-03 10:46:42 +1030 |
commit | e8dfb48ec9dd9a7575b179e8208cd2dd5c73bcce (patch) | |
tree | 83cede9c31da00bf6df31f20e50a04ab41916553 | |
parent | 3fb6b6be5a395fbe293e61339e6be67118234508 (diff) |
talloc: fix gcc -O3 aliasing warnings
A void * could point to anything, but a void ** can't point to any pointer.
So we use a void * and memcpy, which I believe is safe.
-rw-r--r-- | ccan/talloc/talloc.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/ccan/talloc/talloc.c b/ccan/talloc/talloc.c index ed958a8e..1b96f90f 100644 --- a/ccan/talloc/talloc.c +++ b/ccan/talloc/talloc.c @@ -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)); } /* |