r16446: talloc_set_name() allocates and can fail...
authorStefan Metzmacher <metze@samba.org>
Wed, 21 Jun 2006 19:28:24 +0000 (19:28 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:09:15 +0000 (14:09 -0500)
pass the error to the callers

metze

source/lib/talloc/talloc.c
source/lib/talloc/talloc.h

index d480cc2689e9b04dc36516ed041027236dd06a35..ab199678c169c321cd65775a20742f9ab7d0c417 100644 (file)
@@ -364,26 +364,29 @@ int talloc_unlink(const void *context, void *ptr)
 /*
   add a name to an existing pointer - va_list version
 */
-static void talloc_set_name_v(const void *ptr, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0);
+static const char *talloc_set_name_v(const void *ptr, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0);
 
-static void talloc_set_name_v(const void *ptr, const char *fmt, va_list ap)
+static const char *talloc_set_name_v(const void *ptr, const char *fmt, va_list ap)
 {
        struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr);
        tc->name = talloc_vasprintf(ptr, fmt, ap);
        if (tc->name) {
                talloc_set_name_const(tc->name, ".name");
        }
+       return tc->name;
 }
 
 /*
   add a name to an existing pointer
 */
-void talloc_set_name(const void *ptr, const char *fmt, ...)
+const char *talloc_set_name(const void *ptr, const char *fmt, ...)
 {
+       const char *name;
        va_list ap;
        va_start(ap, fmt);
-       talloc_set_name_v(ptr, fmt, ap);
+       name = talloc_set_name_v(ptr, fmt, ap);
        va_end(ap);
+       return name;
 }
 
 /*
@@ -405,14 +408,20 @@ void *talloc_named(const void *context, size_t size, const char *fmt, ...)
 {
        va_list ap;
        void *ptr;
+       const char *name;
 
        ptr = _talloc(context, size);
        if (ptr == NULL) return NULL;
 
        va_start(ap, fmt);
-       talloc_set_name_v(ptr, fmt, ap);
+       name = talloc_set_name_v(ptr, fmt, ap);
        va_end(ap);
 
+       if (name == NULL) {
+               talloc_free(ptr);
+               return NULL;
+       }
+
        return ptr;
 }
 
@@ -474,14 +483,20 @@ void *talloc_init(const char *fmt, ...)
 {
        va_list ap;
        void *ptr;
+       const char *name;
 
        ptr = _talloc(NULL, 0);
        if (ptr == NULL) return NULL;
 
        va_start(ap, fmt);
-       talloc_set_name_v(ptr, fmt, ap);
+       name = talloc_set_name_v(ptr, fmt, ap);
        va_end(ap);
 
+       if (name == NULL) {
+               talloc_free(ptr);
+               return NULL;
+       }
+
        return ptr;
 }
 
index be2b305753790700cade7e18d4c53a54a33acc0e..d71e60cb4526dab7f0b0c00946219aeb46f84d03 100644 (file)
@@ -114,7 +114,7 @@ void _talloc_set_destructor(const void *ptr, int (*destructor)(void *));
 void talloc_increase_ref_count(const void *ptr);
 void *talloc_reference(const void *context, const void *ptr);
 int talloc_unlink(const void *context, void *ptr);
-void talloc_set_name(const void *ptr, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3);
+const char *talloc_set_name(const void *ptr, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3);
 void talloc_set_name_const(const void *ptr, const char *name);
 void *talloc_named(const void *context, size_t size, 
                   const char *fmt, ...) PRINTF_ATTRIBUTE(3,4);