diff options
author | Rusty Russell <rusty@rustcorp.com.au> | 2012-07-18 04:54:31 +0930 |
---|---|---|
committer | Rusty Russell <rusty@rustcorp.com.au> | 2012-07-18 04:54:31 +0930 |
commit | 4f331872bc783445c709e5fe4846b8687e274953 (patch) | |
tree | 01730b205abad309b3aabc6b466a1992bdefe957 /lib/talloc/talloc.c | |
parent | 8893215aaf714154c190c66bf7d1ce568118ec39 (diff) | |
download | samba-4f331872bc783445c709e5fe4846b8687e274953.tar.gz samba-4f331872bc783445c709e5fe4846b8687e274953.tar.bz2 samba-4f331872bc783445c709e5fe4846b8687e274953.zip |
talloc: don't allow a talloc_pool inside a talloc_pool.
We explicitly call free() on a pool which falls to zero, assuming it's
not inside another pool (we crash). Check on creation and explicitly
document this case.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Diffstat (limited to 'lib/talloc/talloc.c')
-rw-r--r-- | lib/talloc/talloc.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/lib/talloc/talloc.c b/lib/talloc/talloc.c index 345f212963..18ee548095 100644 --- a/lib/talloc/talloc.c +++ b/lib/talloc/talloc.c @@ -604,6 +604,13 @@ _PUBLIC_ void *talloc_pool(const void *context, size_t size) } pool_tc = (union talloc_pool_chunk *)talloc_chunk_from_ptr(result); + if (unlikely(pool_tc->hdr.c.flags & TALLOC_FLAG_POOLMEM)) { + /* We don't handle this correctly, so fail. */ + talloc_log("talloc: cannot allocate pool off another pool %s\n", + talloc_get_name(context)); + talloc_free(result); + return NULL; + } pool_tc->hdr.c.flags |= TALLOC_FLAG_POOL; pool_tc->hdr.c.pool = tc_pool_first_chunk(pool_tc); |