r8023: use a pointer to a DATA_BLOB for each reply,
authorStefan Metzmacher <metze@samba.org>
Thu, 30 Jun 2005 19:24:29 +0000 (19:24 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:19:00 +0000 (13:19 -0500)
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)

source4/rpc_server/dcerpc_server.c
source4/rpc_server/dcerpc_server.h

index 15da8c6964620240a0052aa5b761dde967254645..39761738242f1ee7437aa0aa470096dd09e6badf 100644 (file)
@@ -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);
        }
index 3c4888784d471d60d0c2ba4b065b390a0f34181b..ac1b7892ce73e9fcf7ed480ee434e998dd44b395 100644 (file)
@@ -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 */