summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2011-01-28 13:07:08 -0800
committerJeremy Allison <jra@samba.org>2011-01-28 22:53:18 +0100
commitf2900a8b04ce09c9566c10607553bd9b6065bffa (patch)
tree25e3f3d9b14f6b58dd0eacff70e171afcc3365f0
parentfc16baaf91f21addb42d41d60a1d0453c00843b2 (diff)
downloadsamba-f2900a8b04ce09c9566c10607553bd9b6065bffa.tar.gz
samba-f2900a8b04ce09c9566c10607553bd9b6065bffa.tar.bz2
samba-f2900a8b04ce09c9566c10607553bd9b6065bffa.zip
We need to reply to SMB2_GETINFO_FILE with a class of SMB2_FILE_STANDARD_INFO on an IPC$ share.
Otherwise a Win7 client issues this request twice (2xroundtrips) if we return NOT_SUPPORTED. We do the same for SMB1 in call_trans2qpipeinfo() Jeremy. Autobuild-User: Jeremy Allison <jra@samba.org> Autobuild-Date: Fri Jan 28 22:53:18 CET 2011 on sn-devel-104
-rw-r--r--source3/smbd/smb2_getinfo.c33
1 files changed, 32 insertions, 1 deletions
diff --git a/source3/smbd/smb2_getinfo.c b/source3/smbd/smb2_getinfo.c
index e6bf893ac2..5f5cd02fe7 100644
--- a/source3/smbd/smb2_getinfo.c
+++ b/source3/smbd/smb2_getinfo.c
@@ -199,6 +199,36 @@ struct smbd_smb2_getinfo_state {
DATA_BLOB out_output_buffer;
};
+static void smb2_ipc_getinfo(struct tevent_req *req,
+ struct smbd_smb2_getinfo_state *state,
+ struct tevent_context *ev,
+ uint8_t in_info_type,
+ uint8_t in_file_info_class)
+{
+ /* We want to reply to SMB2_GETINFO_FILE
+ with a class of SMB2_FILE_STANDARD_INFO as
+ otherwise a Win7 client issues this request
+ twice (2xroundtrips) if we return NOT_SUPPORTED.
+ NB. We do the same for SMB1 in call_trans2qpipeinfo() */
+
+ if (in_info_type == 0x01 && /* SMB2_GETINFO_FILE */
+ in_file_info_class == 0x05) { /* SMB2_FILE_STANDARD_INFO */
+ state->out_output_buffer = data_blob_talloc(state,
+ NULL, 24);
+ if (tevent_req_nomem(state->out_output_buffer.data, req)) {
+ return;
+ }
+
+ memset(state->out_output_buffer.data,0,24);
+ SOFF_T(state->out_output_buffer.data,0,4096LL);
+ SIVAL(state->out_output_buffer.data,16,1);
+ SIVAL(state->out_output_buffer.data,20,1);
+ tevent_req_done(req);
+ } else {
+ tevent_req_nterror(req, NT_STATUS_NOT_SUPPORTED);
+ }
+}
+
static struct tevent_req *smbd_smb2_getinfo_send(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
struct smbd_smb2_request *smb2req,
@@ -249,7 +279,8 @@ static struct tevent_req *smbd_smb2_getinfo_send(TALLOC_CTX *mem_ctx,
}
if (IS_IPC(conn)) {
- tevent_req_nterror(req, NT_STATUS_NOT_SUPPORTED);
+ smb2_ipc_getinfo(req, state, ev,
+ in_info_type, in_file_info_class);
return tevent_req_post(req, ev);
}