diff options
Diffstat (limited to 'source3/lib')
-rw-r--r-- | source3/lib/talloc.c | 30 |
1 files changed, 11 insertions, 19 deletions
diff --git a/source3/lib/talloc.c b/source3/lib/talloc.c index 05f4351aaf..7bfabdd88d 100644 --- a/source3/lib/talloc.c +++ b/source3/lib/talloc.c @@ -169,30 +169,22 @@ char *talloc_strdup(TALLOC_CTX *t, char *p) /* allocate a bit of memory from the specified pool */ char *talloc_asprintf(TALLOC_CTX *t, const char *fmt, ...) { - struct talloc_chunk *tc; va_list ap; - char *str; - size_t ret; - - tc = malloc(sizeof(*tc)); - if (!tc) - return NULL; + int len; + char *ret; + /* work out how long it will be */ va_start(ap, fmt); - ret = vasprintf(&str, fmt, ap); + len = vsnprintf(NULL, 0, fmt, ap); va_end(ap); - if (ret <= 0) - { - SAFE_FREE(tc); - return NULL; - } + + ret = talloc(t, len); + if (!ret) return NULL; - tc->ptr = str; - tc->size = ret + 1; - tc->next = t->list; - t->list = tc; - t->total_alloc_size += tc->size; + va_start(ap, fmt); + vsnprintf(ret, len, fmt, ap); + va_end(ap); - return str; + return ret; } |