From b83ba93eaeb2dcb0bf11615591d886fda84e4162 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 21 Aug 2004 01:54:46 +0000 Subject: r1983: a completely new implementation of talloc This version does the following: 1) talloc_free(), talloc_realloc() and talloc_steal() lose their (redundent) first arguments 2) you can use _any_ talloc pointer as a talloc context to allocate more memory. This allows you to create complex data structures where the top level structure is the logical parent of the next level down, and those are the parents of the level below that. Then destroy either the lot with a single talloc_free() or destroy any sub-part with a talloc_free() of that part 3) you can name any pointer. Use talloc_named() which is just like talloc() but takes the printf style name argument as well as the parent context and the size. The whole thing ends up being a very simple piece of code, although some of the pointer walking gets hairy. So far, I'm just using the new talloc() like the old one. The next step is to actually take advantage of the new interface properly. Expect some new commits soon that simplify some common coding styles in samba4 by using the new talloc(). (This used to be commit e35bb094c52e550b3105dd1638d8d90de71d854f) --- source4/librpc/rpc/dcerpc.c | 3 +-- source4/librpc/rpc/dcerpc_smb.c | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) (limited to 'source4/librpc/rpc') diff --git a/source4/librpc/rpc/dcerpc.c b/source4/librpc/rpc/dcerpc.c index 438a9a4cf3..0e8828acbd 100644 --- a/source4/librpc/rpc/dcerpc.c +++ b/source4/librpc/rpc/dcerpc.c @@ -660,8 +660,7 @@ NTSTATUS dcerpc_request(struct dcerpc_pipe *p, length = pkt.u.response.stub_and_verifier.length; - payload.data = talloc_realloc(mem_ctx, - payload.data, + payload.data = talloc_realloc(payload.data, payload.length + length); if (!payload.data) { return NT_STATUS_NO_MEMORY; diff --git a/source4/librpc/rpc/dcerpc_smb.c b/source4/librpc/rpc/dcerpc_smb.c index 51722c8a04..d3a0a42d10 100644 --- a/source4/librpc/rpc/dcerpc_smb.c +++ b/source4/librpc/rpc/dcerpc_smb.c @@ -98,7 +98,7 @@ static NTSTATUS dcerpc_raw_recv(struct dcerpc_pipe *p, } /* make sure the payload can hold the whole fragment */ - payload.data = talloc_realloc(mem_ctx, payload.data, frag_length); + payload.data = talloc_realloc(payload.data, frag_length); if (!payload.data) { return NT_STATUS_NO_MEMORY; } @@ -203,7 +203,7 @@ static NTSTATUS smb_secondary_request(struct dcerpc_pipe *p, return status; } - blob->data = talloc_realloc(mem_ctx, blob->data, frag_length); + blob->data = talloc_realloc(blob->data, frag_length); if (!blob->data) { return NT_STATUS_NO_MEMORY; } -- cgit