summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/lib/talloc.c30
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;
}