r22528: remember that the connection was marked dead and don't
authorStefan Metzmacher <metze@samba.org>
Fri, 27 Apr 2007 05:45:53 +0000 (05:45 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:51:38 +0000 (14:51 -0500)
allow sending packet over the broken connection,
as we would segfault...

metze
(This used to be commit 738b2c74117bdbef3b314c37f01f2f73b7a80685)

source4/librpc/rpc/dcerpc_smb.c
source4/librpc/rpc/dcerpc_smb2.c

index 5100eb60f2f62d15f6c0ae61ee14ba698aea6088..3f35eae8f1e981d0713755bab26ea8e8afcc0bb1 100644 (file)
@@ -31,6 +31,7 @@ struct smb_private {
        uint16_t fnum;
        struct smbcli_tree *tree;
        const char *server_name;
+       bool dead;
 };
 
 
@@ -39,6 +40,14 @@ struct smb_private {
 */
 static void pipe_dead(struct dcerpc_connection *c, NTSTATUS status)
 {
+       struct smb_private *smb = c->transport.private;
+
+       smb->dead = true;
+
+       if (smb->dead) {
+               return;
+       }
+
        if (NT_STATUS_EQUAL(NT_STATUS_UNSUCCESSFUL, status)) {
                status = NT_STATUS_UNEXPECTED_NETWORK_ERROR;
        }
@@ -189,6 +198,12 @@ static NTSTATUS send_read_request_continue(struct dcerpc_connection *c, DATA_BLO
 */
 static NTSTATUS send_read_request(struct dcerpc_connection *c)
 {
+       struct smb_private *smb = c->transport.private;
+
+       if (smb->dead) {
+               return NT_STATUS_CONNECTION_DISCONNECTED;
+       }
+
        return send_read_request_continue(c, NULL);
 }
 
@@ -302,6 +317,10 @@ static NTSTATUS smb_send_request(struct dcerpc_connection *c, DATA_BLOB *blob, B
        union smb_write io;
        struct smbcli_request *req;
 
+       if (smb->dead) {
+               return NT_STATUS_CONNECTION_DISCONNECTED;
+       }
+
        if (trigger_read) {
                return smb_send_trans_request(c, blob);
        }
@@ -505,6 +524,8 @@ static void pipe_open_recv(struct smbcli_request *req)
        smb->server_name= strupper_talloc(smb,
                          state->tree->session->transport->called.name);
        if (composite_nomem(smb->server_name, ctx)) return;
+       smb->dead       = false;
+
        c->transport.private = smb;
 
        composite_done(ctx);
index 385cb00919667ab37ca939d2e17b16c6b4f2d89a..15605c21da462ff942a87e0da4791db7635beb20 100644 (file)
@@ -33,6 +33,7 @@ struct smb2_private {
        struct smb2_handle handle;
        struct smb2_tree *tree;
        const char *server_name;
+       bool dead;
 };
 
 
@@ -41,6 +42,14 @@ struct smb2_private {
 */
 static void pipe_dead(struct dcerpc_connection *c, NTSTATUS status)
 {
+       struct smb2_private *smb = c->transport.private;
+
+       smb->dead = true;
+
+       if (smb->dead) {
+               return;
+       }
+
        if (NT_STATUS_EQUAL(NT_STATUS_UNSUCCESSFUL, status)) {
                status = NT_STATUS_UNEXPECTED_NETWORK_ERROR;
        }
@@ -183,6 +192,12 @@ static NTSTATUS send_read_request_continue(struct dcerpc_connection *c, DATA_BLO
 */
 static NTSTATUS send_read_request(struct dcerpc_connection *c)
 {
+       struct smb2_private *smb = c->transport.private;
+
+       if (smb->dead) {
+               return NT_STATUS_CONNECTION_DISCONNECTED;
+       }
+
        return send_read_request_continue(c, NULL);
 }
 
@@ -287,6 +302,10 @@ static NTSTATUS smb2_send_request(struct dcerpc_connection *c, DATA_BLOB *blob,
        struct smb2_write io;
        struct smb2_request *req;
 
+       if (smb->dead) {
+               return NT_STATUS_CONNECTION_DISCONNECTED;
+       }
+
        if (trigger_read) {
                return smb2_send_trans_request(c, blob);
        }
@@ -461,6 +480,7 @@ static void pipe_open_recv(struct smb2_request *req)
        smb->server_name= strupper_talloc(smb, 
                                          tree->session->transport->socket->hostname);
        if (composite_nomem(smb->server_name, ctx)) return;
+       smb->dead       = false;
 
        c->transport.private = smb;