]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
Add DCERPC flag to call unbind hooks without destroying the connection itself upon...
authorJulien Kerihuel <j.kerihuel@openchange.org>
Mon, 6 Apr 2015 09:26:58 +0000 (11:26 +0200)
committerKarolin Seeger <kseeger@samba.org>
Tue, 28 Apr 2015 02:30:13 +0000 (04:30 +0200)
BUG: https://bugzilla.samba.org/show_bug.cgi?id=11226

Reviewed-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Jelmer Vernooij <jelmer@samba.org>
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Tue Apr 14 20:39:34 CEST 2015 on sn-devel-104

(cherry picked from commit fd90d270c7e97a639f42a96b674a674d1b51aa0d)

Autobuild-User(v4-1-test): Karolin Seeger <kseeger@samba.org>
Autobuild-Date(v4-1-test): Tue Apr 28 04:30:13 CEST 2015 on sn-devel-104

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

index 39de1b2b87c3f987f19f8fbc13480101a1657a4f..8c0a1015fa228cccb6ce160601afd0ba32dbbbd6 100644 (file)
@@ -500,6 +500,7 @@ static int dcesrv_connection_context_destructor(struct dcesrv_connection_context
 
        if (c->iface && c->iface->unbind) {
                c->iface->unbind(c, c->iface);
+               c->iface = NULL;
        }
 
        return 0;
@@ -622,6 +623,10 @@ static NTSTATUS dcesrv_bind(struct dcesrv_call_state *call)
                extra_flags |= DCERPC_PFC_FLAG_CONC_MPX;
        }
 
+       if (call->state_flags & DCESRV_CALL_STATE_FLAG_PROCESS_PENDING_CALL) {
+               call->context->conn->state_flags |= DCESRV_CALL_STATE_FLAG_PROCESS_PENDING_CALL;
+       }
+
        /* handle any authentication that is being requested */
        if (!dcesrv_auth_bind(call)) {
                talloc_free(call->context);
@@ -841,6 +846,10 @@ static NTSTATUS dcesrv_alter(struct dcesrv_call_state *call)
                }
        }
 
+       if (call->state_flags & DCESRV_CALL_STATE_FLAG_PROCESS_PENDING_CALL) {
+               call->context->conn->state_flags |= DCESRV_CALL_STATE_FLAG_PROCESS_PENDING_CALL;
+       }
+
        /* setup a alter_resp */
        dcesrv_init_hdr(&pkt, lpcfg_rpc_big_endian(call->conn->dce_ctx->lp_ctx));
        pkt.auth_length = 0;
@@ -1320,6 +1329,18 @@ static void dcesrv_cleanup_broken_connections(struct dcesrv_context *dce_ctx)
                cur = next;
                next = cur->next;
 
+               if (cur->state_flags & DCESRV_CALL_STATE_FLAG_PROCESS_PENDING_CALL) {
+                       struct dcesrv_connection_context *context_cur, *context_next;
+
+                       context_next = cur->contexts;
+                       while (context_next != NULL) {
+                               context_cur = context_next;
+                               context_next = context_cur->next;
+
+                               dcesrv_connection_context_destructor(context_cur);
+                       }
+               }
+
                dcesrv_terminate_connection(cur, cur->terminate);
        }
 }
index e2c9898909400825a0cb526738474045150bb094..bf8799a35925c3939eeb0ae46afaf860b5915c8c 100644 (file)
@@ -103,6 +103,7 @@ struct dcesrv_call_state {
 #define DCESRV_CALL_STATE_FLAG_MAY_ASYNC (1<<1)
 #define DCESRV_CALL_STATE_FLAG_HEADER_SIGNING (1<<2)
 #define DCESRV_CALL_STATE_FLAG_MULTIPLEXED (1<<3)
+#define DCESRV_CALL_STATE_FLAG_PROCESS_PENDING_CALL (1<<4)
        uint32_t state_flags;
 
        /* the time the request arrived in the server */