talloc_stack: handle more than one talloc_stackframe_pool()
authorRusty Russell <rusty@rustcorp.com.au>
Tue, 17 Jul 2012 19:25:31 +0000 (04:55 +0930)
committerRusty Russell <rusty@rustcorp.com.au>
Tue, 17 Jul 2012 19:25:31 +0000 (04:55 +0930)
The only reason we make one stackframe parent of the next is so we use
our parent's pool.  That doesn't make sense if we're a new pool, and
wouldn't work anyway.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
lib/util/talloc_stack.c

index 16e9d745d347fe340b7fd40b3e027dc358934e5a..b837843c84010159a29bfcde8c740ce1699d1095 100644 (file)
@@ -117,7 +117,7 @@ static int talloc_pop(TALLOC_CTX *frame)
 
 static TALLOC_CTX *talloc_stackframe_internal(size_t poolsize)
 {
-       TALLOC_CTX **tmp, *top, *parent;
+       TALLOC_CTX **tmp, *top;
        struct talloc_stackframe *ts =
                (struct talloc_stackframe *)SMB_THREAD_GET_TLS(global_ts);
 
@@ -135,15 +135,16 @@ static TALLOC_CTX *talloc_stackframe_internal(size_t poolsize)
                ts->talloc_stack_arraysize = ts->talloc_stacksize + 1;
         }
 
-       if (ts->talloc_stacksize == 0) {
-               parent = ts->talloc_stack;
-       } else {
-               parent = ts->talloc_stack[ts->talloc_stacksize-1];
-       }
-
        if (poolsize) {
-               top = talloc_pool(parent, poolsize);
+               top = talloc_pool(ts->talloc_stack, poolsize);
        } else {
+               TALLOC_CTX *parent;
+               /* We chain parentage, so if one is a pool we draw from it. */
+               if (ts->talloc_stacksize == 0) {
+                       parent = ts->talloc_stack;
+               } else {
+                       parent = ts->talloc_stack[ts->talloc_stacksize-1];
+               }
                top = talloc_new(parent);
        }