]> git.ozlabs.org Git - ccan/blobdiff - ccan/talloc/talloc.c
ccanlint: compile modules required by examples.
[ccan] / ccan / talloc / talloc.c
index ed958a8e5f25fdbeebf83f30b1ea8fef82d018bc..fdf8eebed297db56d26abdca812b515702ffdf02 100644 (file)
@@ -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));
 }
 
 /*