diff options
author | Stefan Metzmacher <metze@samba.org> | 2005-06-30 19:24:29 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:19:00 -0500 |
commit | 5afa0a2d62de1be027190190d97e4c46201c977b (patch) | |
tree | 606417e3fcc9e7bb1b3d1ba27db2b14812c748ed | |
parent | 8a300c9248cc956d2aaed59e89efc2535a9f60f5 (diff) | |
download | samba-5afa0a2d62de1be027190190d97e4c46201c977b.tar.gz samba-5afa0a2d62de1be027190190d97e4c46201c977b.tar.bz2 samba-5afa0a2d62de1be027190190d97e4c46201c977b.zip |
r8023: use a pointer to a DATA_BLOB for each reply,
that will allow the write_fn callback of dcesrv_output()
to reference the memory with a valid TALLOC pointer
metze
(This used to be commit d0574d407f426f5c001e943dee5c03d24f4fb21c)
-rw-r--r-- | source4/rpc_server/dcerpc_server.c | 79 | ||||
-rw-r--r-- | source4/rpc_server/dcerpc_server.h | 2 |
2 files changed, 40 insertions, 41 deletions
diff --git a/source4/rpc_server/dcerpc_server.c b/source4/rpc_server/dcerpc_server.c index 15da8c6964..3976173824 100644 --- a/source4/rpc_server/dcerpc_server.c +++ b/source4/rpc_server/dcerpc_server.c @@ -399,16 +399,15 @@ static NTSTATUS dcesrv_fault(struct dcesrv_call_state *call, uint32_t fault_code pkt.u.fault.status = fault_code; rep = talloc(call, struct dcesrv_call_reply); - if (!rep) { - return NT_STATUS_NO_MEMORY; - } + NT_STATUS_HAVE_NO_MEMORY(rep); - status = ncacn_push_auth(&rep->data, call, &pkt, NULL); - if (!NT_STATUS_IS_OK(status)) { - return status; - } + rep->data = talloc(call, DATA_BLOB); + NT_STATUS_HAVE_NO_MEMORY(rep->data); + + status = ncacn_push_auth(rep->data, call, &pkt, NULL); + NT_STATUS_NOT_OK_RETURN(status); - dcerpc_set_frag_length(&rep->data, rep->data.length); + dcerpc_set_frag_length(rep->data, rep->data->length); DLIST_ADD_END(call->replies, rep, struct dcesrv_call_reply *); DLIST_ADD_END(call->conn->call_list, call, struct dcesrv_call_state *); @@ -436,16 +435,15 @@ static NTSTATUS dcesrv_bind_nak(struct dcesrv_call_state *call, uint32_t reason) pkt.u.bind_nak.num_versions = 0; rep = talloc(call, struct dcesrv_call_reply); - if (!rep) { - return NT_STATUS_NO_MEMORY; - } + NT_STATUS_HAVE_NO_MEMORY(rep); - status = ncacn_push_auth(&rep->data, call, &pkt, NULL); - if (!NT_STATUS_IS_OK(status)) { - return status; - } + rep->data = talloc(call, DATA_BLOB); + NT_STATUS_HAVE_NO_MEMORY(rep->data); + + status = ncacn_push_auth(rep->data, call, &pkt, NULL); + NT_STATUS_NOT_OK_RETURN(status); - dcerpc_set_frag_length(&rep->data, rep->data.length); + dcerpc_set_frag_length(rep->data, rep->data->length); DLIST_ADD_END(call->replies, rep, struct dcesrv_call_reply *); DLIST_ADD_END(call->conn->call_list, call, struct dcesrv_call_state *); @@ -571,17 +569,16 @@ static NTSTATUS dcesrv_bind(struct dcesrv_call_state *call) } rep = talloc(call, struct dcesrv_call_reply); - if (!rep) { - return NT_STATUS_NO_MEMORY; - } + NT_STATUS_HAVE_NO_MEMORY(rep); - status = ncacn_push_auth(&rep->data, call, &pkt, - call->conn->auth_state.auth_info); - if (!NT_STATUS_IS_OK(status)) { - return status; - } + rep->data = talloc(call, DATA_BLOB); + NT_STATUS_HAVE_NO_MEMORY(rep->data); + + status = ncacn_push_auth(rep->data, call, &pkt, + call->conn->auth_state.auth_info); + NT_STATUS_NOT_OK_RETURN(status); - dcerpc_set_frag_length(&rep->data, rep->data.length); + dcerpc_set_frag_length(rep->data, rep->data->length); DLIST_ADD_END(call->replies, rep, struct dcesrv_call_reply *); DLIST_ADD_END(call->conn->call_list, call, struct dcesrv_call_state *); @@ -713,17 +710,16 @@ static NTSTATUS dcesrv_alter(struct dcesrv_call_state *call) } rep = talloc(call, struct dcesrv_call_reply); - if (!rep) { - return NT_STATUS_NO_MEMORY; - } + NT_STATUS_HAVE_NO_MEMORY(rep); - status = ncacn_push_auth(&rep->data, call, &pkt, - call->conn->auth_state.auth_info); - if (!NT_STATUS_IS_OK(status)) { - return status; - } + rep->data = talloc(call, DATA_BLOB); + NT_STATUS_HAVE_NO_MEMORY(rep->data); + + status = ncacn_push_auth(rep->data, call, &pkt, + call->conn->auth_state.auth_info); + NT_STATUS_IS_OK_RETURN(status); - dcerpc_set_frag_length(&rep->data, rep->data.length); + dcerpc_set_frag_length(rep->data, rep->data->length); DLIST_ADD_END(call->replies, rep, struct dcesrv_call_reply *); DLIST_ADD_END(call->conn->call_list, call, struct dcesrv_call_state *); @@ -844,6 +840,9 @@ NTSTATUS dcesrv_reply(struct dcesrv_call_state *call) rep = talloc(call, struct dcesrv_call_reply); NT_STATUS_HAVE_NO_MEMORY(rep); + rep->data = talloc(call, DATA_BLOB); + NT_STATUS_HAVE_NO_MEMORY(rep->data); + length = stub.length; if (length + DCERPC_RESPONSE_LENGTH > call->conn->cli_max_recv_frag) { /* the 32 is to cope with signing data */ @@ -869,11 +868,11 @@ NTSTATUS dcesrv_reply(struct dcesrv_call_state *call) pkt.u.response.stub_and_verifier.data = stub.data; pkt.u.response.stub_and_verifier.length = length; - if (!dcesrv_auth_response(call, &rep->data, &pkt)) { + if (!dcesrv_auth_response(call, rep->data, &pkt)) { return dcesrv_fault(call, DCERPC_FAULT_OTHER); } - dcerpc_set_frag_length(&rep->data, rep->data.length); + dcerpc_set_frag_length(rep->data, rep->data->length); DLIST_ADD_END(call->replies, rep, struct dcesrv_call_reply *); @@ -1127,13 +1126,13 @@ NTSTATUS dcesrv_output(struct dcesrv_connection *dce_conn, } rep = call->replies; - status = write_fn(private_data, &rep->data, &nwritten); + status = write_fn(private_data, rep->data, &nwritten); NT_STATUS_IS_ERR_RETURN(status); - rep->data.length -= nwritten; - rep->data.data += nwritten; + rep->data->length -= nwritten; + rep->data->data += nwritten; - if (rep->data.length == 0) { + if (rep->data->length == 0) { /* we're done with this section of the call */ DLIST_REMOVE(call->replies, rep); } diff --git a/source4/rpc_server/dcerpc_server.h b/source4/rpc_server/dcerpc_server.h index 3c4888784d..ac1b7892ce 100644 --- a/source4/rpc_server/dcerpc_server.h +++ b/source4/rpc_server/dcerpc_server.h @@ -104,7 +104,7 @@ struct dcesrv_call_state { struct dcesrv_call_reply { struct dcesrv_call_reply *next, *prev; - DATA_BLOB data; + DATA_BLOB *data; } *replies; /* this is used by the boilerplate code to generate DCERPC faults */ |