summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2002-12-14 00:57:45 +0000
committerJeremy Allison <jra@samba.org>2002-12-14 00:57:45 +0000
commit73b5be5de6aeaf97c5c3599cc80d3c24b655132e (patch)
tree510dc40738c586ae72c8b1364c5500587238dfac
parentf201af19250895b278568df91aad58cea247e543 (diff)
downloadsamba-73b5be5de6aeaf97c5c3599cc80d3c24b655132e.tar.gz
samba-73b5be5de6aeaf97c5c3599cc80d3c24b655132e.tar.bz2
samba-73b5be5de6aeaf97c5c3599cc80d3c24b655132e.zip
The name pointer in the talloc context must not be a talloced entry as
calling talloc_destroy_pool(as we do sometimes) will destroy it. Jeremy. (This used to be commit bcd22a9039b0fb3697ebc4377898cc7ecfd853cc)
-rw-r--r--source3/lib/talloc.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/source3/lib/talloc.c b/source3/lib/talloc.c
index 0f293e1725..5fffe58f9f 100644
--- a/source3/lib/talloc.c
+++ b/source3/lib/talloc.c
@@ -138,6 +138,7 @@ TALLOC_CTX *talloc_init(void)
* Create a new talloc context, with a name specifying its purpose.
* Please call this in preference to talloc_init().
**/
+
TALLOC_CTX *talloc_init_named(char const *fmt, ...)
{
TALLOC_CTX *t;
@@ -145,9 +146,18 @@ TALLOC_CTX *talloc_init(void)
t = talloc_init();
if (t && fmt) {
+ /*
+ * t->name must not be talloced.
+ * as destroying the pool would destroy it. JRA.
+ */
+ t->name = NULL;
va_start(ap, fmt);
- t->name = talloc_vasprintf(t, fmt, ap);
+ vasprintf(&t->name, fmt, ap);
va_end(ap);
+ if (!t->name) {
+ talloc_destroy(t);
+ t = NULL;
+ }
}
return t;
@@ -234,6 +244,7 @@ void talloc_destroy(TALLOC_CTX *t)
talloc_destroy_pool(t);
talloc_disenroll(t);
+ SAFE_FREE(t->name);
memset(t, 0, sizeof(TALLOC_CTX));
SAFE_FREE(t);
}
@@ -411,7 +422,7 @@ char *talloc_describe_all(TALLOC_CTX *rt)
if (it->name)
fstrcpy(what, it->name);
else
- slprintf(what, sizeof what, "@%p", it);
+ slprintf(what, sizeof(what), "@%p", it);
s = talloc_asprintf_append(rt, s, "%-40s %8u %8u\n",
what,