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

Jeremy Allison jra at samba.org
Tue Oct 20 18:41:50 UTC 2020


On Tue, Oct 20, 2020 at 11:33:36AM -0700, Jeremy Allison via samba-technical 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.
> 
> 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 ?
> 
> Not sure if this should be:
> 
> 1894 #if (ALWAYS_REALLOC != 0)

Ah no, it's not that (although that is a bug
in the ALWAYS_REALLOC==1 case).

The problem is in this section:

1951         if (pool_hdr) {
1952                 struct talloc_chunk *pool_tc;
1953                 void *next_tc = tc_next_chunk(tc);
1954                 size_t old_chunk_size = TC_ALIGN16(TC_HDR_SIZE + tc->size);
1955                 size_t new_chunk_size = TC_ALIGN16(TC_HDR_SIZE + size);
1956                 size_t space_needed;
1957                 size_t space_left;
1958                 unsigned int chunk_count = pool_hdr->object_count;
1959 
1960                 pool_tc = talloc_chunk_from_pool(pool_hdr);
1961                 if (!(pool_tc->flags & TALLOC_FLAG_FREE)) {
1962                         chunk_count -= 1;
1963                 }

we don't put chunk_count back into pool_hdr->object_count
after decrementing it. Still investigating...



More information about the samba-technical mailing list