Commit e8dfb48e authored by Rusty Russell's avatar Rusty Russell

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.
parent 3fb6b6be
...@@ -801,21 +801,25 @@ static int talloc_destroy_pointer(void ***pptr) ...@@ -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 _talloc_set(void *ptr, const void *ctx, size_t size, const char *name)
{ {
void ***child; void ***child;
void **pptr = ptr; void *p;
*pptr = talloc_named_const(ctx, size, name); p = talloc_named_const(ctx, size, name);
if (unlikely(!*pptr)) if (unlikely(!p))
return; goto set_ptr;
child = talloc(*pptr, void **); child = talloc(p, void **);
if (unlikely(!child)) { if (unlikely(!child)) {
talloc_free(*pptr); talloc_free(p);
*pptr = NULL; p = NULL;
return; goto set_ptr;
} }
*child = pptr; *child = ptr;
talloc_set_name_const(child, "talloc_set destructor"); talloc_set_name_const(child, "talloc_set destructor");
talloc_set_destructor(child, talloc_destroy_pointer); talloc_set_destructor(child, talloc_destroy_pointer);
set_ptr:
/* memcpy rather than cast avoids aliasing problems. */
memcpy(ptr, &p, sizeof(p));
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment