Let ntvfs request transport close via ntvfs_request state
authorSam Liddicott <sam@liddicott.com>
Fri, 5 Dec 2008 09:04:55 +0000 (09:04 +0000)
committerStefan Metzmacher <metze@samba.org>
Fri, 5 Dec 2008 11:52:13 +0000 (12:52 +0100)
[I can't swear that this covers all the smb2 cases, there are some reply
functions that I can't trace properly]

Add NTVFS_ASYNC_STATE_CLOSE bit to ntvfs_request->async_states->state
so that the ntvfs layer can signify that the client transport should
be closed, most useful for proxy servies, and most likely due to a
forwarding transport having been closed.

Signed-off-by: Sam Liddicott <sam@liddicott.com>
Signed-off-by: Stefan Metzmacher <metze@samba.org>
source4/ntvfs/ntvfs.h
source4/smb_server/smb2/smb2_server.h
source4/smb_server/smb_server.h

index 0d5738d9f0bd2e350697e2184f1af35e3bd443c6..fc04d976f428ab62072a00e49450590add3bbc61 100644 (file)
@@ -226,6 +226,7 @@ struct ntvfs_context {
 /* a set of flags to control handling of request structures */
 #define NTVFS_ASYNC_STATE_ASYNC     (1<<1) /* the backend will answer this one later */
 #define NTVFS_ASYNC_STATE_MAY_ASYNC (1<<2) /* the backend is allowed to answer async */
+#define NTVFS_ASYNC_STATE_CLOSE     (1<<3) /* the backend session should be closed */
 
 /* the ntvfs_async_state structure allows backend functions to 
    delay replying to requests. To use this, the front end must
index 431add4ed910bb9843962ebcf14d6dcc63b1eca9..ba3021a3a9a2b64ec521915d98664f76823eb8e4 100644 (file)
@@ -153,6 +153,11 @@ struct smbsrv_request;
 /* check req->ntvfs->async_states->status and if not OK then send an error reply */
 #define SMB2SRV_CHECK_ASYNC_STATUS_ERR_SIMPLE do { \
        req = talloc_get_type(ntvfs->async_states->private_data, struct smb2srv_request); \
+       if (ntvfs->async_states->state & NTVFS_ASYNC_STATE_CLOSE || NT_STATUS_EQUAL(ntvfs->async_states->status, NT_STATUS_NET_WRITE_FAULT)) { \
+               smbsrv_terminate_connection(req->smb_conn, get_friendly_nt_error_msg (ntvfs->async_states->status)); \
+               talloc_free(req); \
+               return; \
+       } \
        req->status = ntvfs->async_states->status; \
        if (NT_STATUS_IS_ERR(ntvfs->async_states->status)) { \
                smb2srv_send_error(req, ntvfs->async_states->status); \
@@ -165,6 +170,11 @@ struct smbsrv_request;
 } while (0)
 #define SMB2SRV_CHECK_ASYNC_STATUS_SIMPLE do { \
        req = talloc_get_type(ntvfs->async_states->private_data, struct smb2srv_request); \
+       if (ntvfs->async_states->state & NTVFS_ASYNC_STATE_CLOSE || NT_STATUS_EQUAL(ntvfs->async_states->status, NT_STATUS_NET_WRITE_FAULT)) { \
+               smbsrv_terminate_connection(req->smb_conn, get_friendly_nt_error_msg (ntvfs->async_states->status)); \
+               talloc_free(req); \
+               return; \
+       } \
        req->status = ntvfs->async_states->status; \
        if (!NT_STATUS_IS_OK(ntvfs->async_states->status)) { \
                smb2srv_send_error(req, ntvfs->async_states->status); \
index e3e55ae040477c375f9e9e181cabbc9a9bbaaf49..227c298008e42e6fe1816facbc7054ad6a94cfe0 100644 (file)
@@ -483,6 +483,11 @@ struct loadparm_context;
 /* check req->ntvfs->async_states->status and if not OK then send an error reply */
 #define SMBSRV_CHECK_ASYNC_STATUS_ERR_SIMPLE do { \
        req = talloc_get_type(ntvfs->async_states->private_data, struct smbsrv_request); \
+       if (ntvfs->async_states->state & NTVFS_ASYNC_STATE_CLOSE || NT_STATUS_EQUAL(ntvfs->async_states->status, NT_STATUS_NET_WRITE_FAULT)) { \
+               smbsrv_terminate_connection(req->smb_conn, get_friendly_nt_error_msg (ntvfs->async_states->status)); \
+               talloc_free(req); \
+               return; \
+       } \
        if (NT_STATUS_IS_ERR(ntvfs->async_states->status)) { \
                smbsrv_send_error(req, ntvfs->async_states->status); \
                return; \
@@ -494,6 +499,11 @@ struct loadparm_context;
 } while (0)
 #define SMBSRV_CHECK_ASYNC_STATUS_SIMPLE do { \
        req = talloc_get_type(ntvfs->async_states->private_data, struct smbsrv_request); \
+       if (ntvfs->async_states->state & NTVFS_ASYNC_STATE_CLOSE || NT_STATUS_EQUAL(ntvfs->async_states->status, NT_STATUS_NET_WRITE_FAULT)) { \
+               smbsrv_terminate_connection(req->smb_conn, get_friendly_nt_error_msg (ntvfs->async_states->status)); \
+               talloc_free(req); \
+               return; \
+       } \
        if (!NT_STATUS_IS_OK(ntvfs->async_states->status)) { \
                smbsrv_send_error(req, ntvfs->async_states->status); \
                return; \
@@ -506,3 +516,5 @@ struct loadparm_context;
 
 /* zero out some reserved fields in a reply */
 #define SMBSRV_VWV_RESERVED(start, count) memset(req->out.vwv + VWV(start), 0, (count)*2)
+
+#include "smb_server/service_smb_proto.h"