1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-03 13:47:25 +03:00

talloc_stack: Call talloc destructors while frame is still around

This fixes "samba-tool ntacl set -d10"

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>

Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Sat Jun 23 04:56:44 CEST 2018 on sn-devel-144
This commit is contained in:
Volker Lendecke 2018-06-22 16:25:10 +02:00 committed by Jeremy Allison
parent f75e8f58cd
commit 05b54cc259

View File

@ -94,6 +94,7 @@ static int talloc_pop(TALLOC_CTX *frame)
{
struct talloc_stackframe *ts =
(struct talloc_stackframe *)SMB_THREAD_GET_TLS(global_ts);
size_t blocks;
int i;
/* Catch lazy frame-freeing. */
@ -107,6 +108,34 @@ static int talloc_pop(TALLOC_CTX *frame)
#endif
}
for (i=0; i<10; i++) {
/*
* We have to free our children first, calling all
* destructors. If a destructor hanging deeply off
* "frame" uses talloc_tos() itself while freeing the
* toplevel frame, we panic because that nested
* talloc_tos() in the destructor does not find a
* stackframe anymore.
*
* Do it in a loop up to 10 times as the destructors
* might use more of talloc_tos().
*/
talloc_free_children(frame);
blocks = talloc_total_blocks(frame);
if (blocks == 1) {
break;
}
}
if (blocks != 1) {
DBG_WARNING("Left %zu blocks after %i "
"talloc_free_children(frame) calls\n",
blocks, i);
}
for (i=ts->talloc_stacksize-1; i>0; i--) {
if (frame == ts->talloc_stack[i]) {
break;