talloc: talloc_set_memlimit causes all reallocs to fail when used on pools. talloc_set_memlimit not enforced correctly on pools.

Arran Cudbard-Bell a.cudbardb at freeradius.org
Tue Oct 20 18:42:00 UTC 2020



> On Oct 20, 2020, at 1:33 PM, Jeremy Allison <jra at samba.org> wrote:
> 
> On Tue, Oct 20, 2020 at 01:03:14PM -0500, Arran Cudbard-Bell wrote:
>> 
>> Then there's another issue with object_count ending
>> up off by one, which means talloc_free_children doesn't
>> actually return memory to the pool, and that messes up
>> some of the other tests I'm adding.  Just tracking down
>> when and why this happens now.... It might have been a
>> pre-existing issue and not related to this patch, I'm just
>> seeing it because of using talloc_free_children to reset
>> the pool between some tests.

Apologies, there was a steal I didn't spot in the tests.
One of the chunks was moved out of the pool into the root ctx.

Explicitly freeing the chunk or stealing it back into the pool
means talloc_free_children works as expected.

> Oh, I think that may be here:
> 
> 1894 #if ALWAYS_REALLOC
> 1895         if (pool_hdr) {
> 1896                 new_ptr = tc_alloc_pool(tc, size + TC_HDR_SIZE, 0);
> 1897                 pool_hdr->object_count--;
> 1898 
> 
> We don't reset pool_hdr->object_count on early return
> in this codepath.
> Are you setting ALWAYS_REALLOC==1 in your tests ?

I wasn't but that does look like a valid issue.  We'd end up with
with too few chunks in the allocation failed due to a memlimit.

> Not sure if this should be:
> 
> 1894 #if (ALWAYS_REALLOC != 0)

That would be consistent with the other check at 1841.

-Arran



More information about the samba-technical mailing list