talloc()

Luke Kenneth Casson Leighton lkcl at samba.org
Tue Jan 4 08:34:11 GMT 2000


andrew, it would be _extremely_ good if you could write one of these.  the
problem with memory allocation in dce/rpc is this:

make a function call requesting an info level.
[marshall request.. ship it... unmasrhall]
function call locally mallocs memory to service the request.
[marshall response... ship it (large) ... unmarshall].
the unmarshall at the receiving end locally mallocs memory to
provide the request.

how do you free these bits of memory?

NT has NetApiBufferFree() on a per-pipe basis this is implemented to free
up lcocal memory.

remote malloc'd memory is easier to deal with, however local malloc'd
memory is a different matter.  the unmarshalling at receiving end code is
responsible for doing the mallocs, so the caller has _no_ idea how to
properly handle frees.

if you can create a talloc(MEMORY_STORE *store, size_t size),and provide
MEMORY_STORE *init_talloc(), free_talloc(MEMORY_STORE *store) as
base-level functions, then i can use it to trash locally-malloced memory
on a per-function call basis, without having to worry about memory leaks
and per-msrpc-function-call specific freeing routines.

thx,

luke

On Tue, 4 Jan 2000, Andrew Tridgell wrote:

> We have a bit of a problem with memory allocation in Samba. It is best
> shown by the following tcpdump capture that I just got:
> 
> 18:51:46.249115 192.168.114.1.3697 > 192.168.114.255.netbios-ns:
> >>> NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST
> TrnID=0x5F9D
> OpCode=0
> NmFlags=0x11
> Rcode=0
> QueryCount=1
> AnswerCount=0
> AuthorityCount=0
> AddressRecCount=0
> QuestionRecords:
> Name=/USR/LOCAL/SAMB NameType=0x1C (Unknown)
> QuestionType=0x20
> QuestionClass=0x1
> 
> notice the name? That comes from our domain client code in
> password.c. There is a call like this:
> 
> 	if (!get_dc_list(lp_workgroup(), &ip_list, &count))
> 		return False;
> 
> the lp_workgroup() call grabs a static string from a ring buffer of 10
> strings (see lp_string() in param/loadparm.c). This is done to prevent
> all the mess of alloc/free calls every time we use a lp_*() string
> function, but the technique is coming back to bite us. What happens in
> this case is there are more than 10 lp_*() string calls deep inside
> that get_dc_list() call and that results in the lp_workgroup() string
> getting overwritten, so we end up sending the name query to the
> lp_lockdir() string!
> 
> the real problem is the lack of a good temporary memory allocater/free
> system in Samba. We can't use alloca() as it ain't portable enough.
> 
> before i build a new memory allocation (pool) system for Samba, can
> someone point me at a good one? Note that I'm not interested in just a
> malloc library, those are trivial to write and don't meet our needs
> anyway. What we need is something that allows us to allocate temporary
> memory and free it in one fell swoop in the main event loop. I can
> probably write one in a day or so, but if there is a good one out
> there then please point it out so I can save some time.
> 
> of course, the simple fix is ot up the number of static strings, but
> for Samba 3.0 I'm trying to fix the really fundamental design flaws,
> not exacerbate them :)
> 
> Cheers, Tridge
> 



More information about the samba-technical mailing list