[SCM] Samba Shared Repository - branch v4-2-test updated
Karolin Seeger
kseeger at samba.org
Mon Mar 14 14:27:04 UTC 2016
The branch, v4-2-test has been updated
via ffccce5 s3:smbd: add negprot remote arch detection for OSX
via bd11d39 s3:smbd: rework negprot remote arch detection
from 0108e51 VERSION: Bump version up to 4.2.10...
https://git.samba.org/?p=samba.git;a=shortlog;h=v4-2-test
- Log -----------------------------------------------------------------
commit ffccce57263390a74f56bda6fd03b3ee33ae9d89
Author: Justin Maggard <jmaggard10 at gmail.com>
Date: Wed Mar 2 10:19:56 2016 -0800
s3:smbd: add negprot remote arch detection for OSX
Remote arch detection for OSX clients has been broken for some time, since
both Samba and OSX started supporting SMB2. Fix it by adding modern OSX
client detection support to the negprot remote arch detection routine.
Signed-off-by: Justin Maggard <jmaggard10 at gmail.com>
Reviewed-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <rb at sernet.de>
Autobuild-User(master): Jeremy Allison <jra at samba.org>
Autobuild-Date(master): Thu Mar 3 09:03:53 CET 2016 on sn-devel-144
(cherry picked from commit d7ca174744001fabdc32e1c334dad347bb985756)
Autobuild-User(v4-2-test): Karolin Seeger <kseeger at samba.org>
Autobuild-Date(v4-2-test): Mon Mar 14 15:26:25 CET 2016 on sn-devel-104
commit bd11d39472116133bc2c943630c9eeca0746865f
Author: Justin Maggard <jmaggard10 at gmail.com>
Date: Wed Mar 2 10:18:34 2016 -0800
s3:smbd: rework negprot remote arch detection
Negprot remote arch detection is very cryptic. Rework it so it's easier
to understand, and therefore more extensible, following the protocol table
in inline comments. This also allows us to remove some hacks.
Signed-off-by: Justin Maggard <jmaggard10 at gmail.com>
Reviewed-by: Ralph Boehme <rb at sernet.de>
Reviewed-by: Jeremy Allison <jra at samba.org>
(cherry picked from commit b69b96fc14128f50a906b4f5b34934efbc94afbc)
-----------------------------------------------------------------------
Summary of changes:
libcli/smb/smb_constants.h | 1 -
source3/smbd/negprot.c | 152 ++++++++++++++++++++++++++------------------
source3/smbd/smb2_negprot.c | 9 ++-
3 files changed, 98 insertions(+), 64 deletions(-)
Changeset truncated at 500 lines:
diff --git a/libcli/smb/smb_constants.h b/libcli/smb/smb_constants.h
index 9b57078..6058876 100644
--- a/libcli/smb/smb_constants.h
+++ b/libcli/smb/smb_constants.h
@@ -307,7 +307,6 @@ enum csc_policy {
#define FLAGS2_READ_PERMIT_EXECUTE 0x2000
#define FLAGS2_32_BIT_ERROR_CODES 0x4000
#define FLAGS2_UNICODE_STRINGS 0x8000
-#define FLAGS2_WIN2K_SIGNATURE 0xC852 /* Hack alert ! For now... JRA. */
/* FileAttributes (search attributes) field */
#define FILE_ATTRIBUTE_READONLY 0x0001L
diff --git a/source3/smbd/negprot.c b/source3/smbd/negprot.c
index e6a9bde..2ea7445 100644
--- a/source3/smbd/negprot.c
+++ b/source3/smbd/negprot.c
@@ -443,41 +443,67 @@ protocol [XENIX CORE]
protocol [LANMAN1.0]
protocol [LM1.2X002]
protocol [LANMAN2.1]
+
+OSX:
+protocol [NT LM 0.12]
+protocol [SMB 2.002]
+protocol [SMB 2.???]
*/
/*
* Modified to recognize the architecture of the remote machine better.
*
* This appears to be the matrix of which protocol is used by which
- * MS product.
- Protocol WfWg Win95 WinNT Win2K OS/2 Vista
- PC NETWORK PROGRAM 1.0 1 1 1 1 1 1
- XENIX CORE 2 2
- MICROSOFT NETWORKS 3.0 2 2
- DOS LM1.2X002 3 3
- MICROSOFT NETWORKS 1.03 3
- DOS LANMAN2.1 4 4
- LANMAN1.0 4 2 3 2
- Windows for Workgroups 3.1a 5 5 5 3 3
- LM1.2X002 6 4 4 4
- LANMAN2.1 7 5 5 5
- NT LM 0.12 6 8 6 6
- SMB 2.001 7
+ * product.
+ Protocol WfWg Win95 WinNT Win2K OS/2 Vista OSX
+ PC NETWORK PROGRAM 1.0 1 1 1 1 1 1
+ XENIX CORE 2 2
+ MICROSOFT NETWORKS 3.0 2 2
+ DOS LM1.2X002 3 3
+ MICROSOFT NETWORKS 1.03 3
+ DOS LANMAN2.1 4 4
+ LANMAN1.0 4 2 3 2
+ Windows for Workgroups 3.1a 5 5 5 3 3
+ LM1.2X002 6 4 4 4
+ LANMAN2.1 7 5 5 5
+ NT LM 0.12 6 8 6 6 6 1
+ SMB 2.001 7
+ SMB 2.002 2
+ SMB 2.??? 3
*
* tim at fsg.com 09/29/95
* Win2K added by matty 17/7/99
*/
-#define ARCH_WFWG 0x3 /* This is a fudge because WfWg is like Win95 */
-#define ARCH_WIN95 0x2
-#define ARCH_WINNT 0x4
-#define ARCH_WIN2K 0xC /* Win2K is like NT */
-#define ARCH_OS2 0x14 /* Again OS/2 is like NT */
-#define ARCH_SAMBA 0x20
-#define ARCH_CIFSFS 0x40
-#define ARCH_VISTA 0x8C /* Vista is like XP/2K */
-
-#define ARCH_ALL 0x7F
+#define PROT_PC_NETWORK_PROGRAM_1_0 0x0001
+#define PROT_XENIX_CORE 0x0002
+#define PROT_MICROSOFT_NETWORKS_3_0 0x0004
+#define PROT_DOS_LM1_2X002 0x0008
+#define PROT_MICROSOFT_NETWORKS_1_03 0x0010
+#define PROT_DOS_LANMAN2_1 0x0020
+#define PROT_LANMAN1_0 0x0040
+#define PROT_WFWG 0x0080
+#define PROT_LM1_2X002 0x0100
+#define PROT_LANMAN2_1 0x0200
+#define PROT_NT_LM_0_12 0x0400
+#define PROT_SMB_2_001 0x0800
+#define PROT_SMB_2_002 0x1000
+#define PROT_SMB_2_FF 0x2000
+#define PROT_SAMBA 0x4000
+#define PROT_POSIX_2 0x8000
+
+#define ARCH_WFWG ( PROT_PC_NETWORK_PROGRAM_1_0 | PROT_MICROSOFT_NETWORKS_3_0 | \
+ PROT_DOS_LM1_2X002 | PROT_DOS_LANMAN2_1 | PROT_WFWG )
+#define ARCH_WIN95 ( ARCH_WFWG | PROT_NT_LM_0_12 )
+#define ARCH_WINNT ( PROT_PC_NETWORK_PROGRAM_1_0 | PROT_XENIX_CORE | \
+ PROT_MICROSOFT_NETWORKS_1_03 | PROT_LANMAN1_0 | PROT_WFWG | \
+ PROT_LM1_2X002 | PROT_LANMAN2_1 | PROT_NT_LM_0_12 )
+#define ARCH_WIN2K ( ARCH_WINNT & ~(PROT_XENIX_CORE | PROT_MICROSOFT_NETWORKS_1_03) )
+#define ARCH_OS2 ( ARCH_WINNT & ~(PROT_MICROSOFT_NETWORKS_1_03 | PROT_WFWG) )
+#define ARCH_VISTA ( ARCH_WIN2K | PROT_SMB_2_001 )
+#define ARCH_SAMBA ( PROT_SAMBA )
+#define ARCH_CIFSFS ( PROT_POSIX_2 )
+#define ARCH_OSX ( PROT_NT_LM_0_12 | PROT_SMB_2_002 | PROT_SMB_2_FF )
/* List of supported protocols, most desired first */
static const struct {
@@ -511,7 +537,7 @@ void reply_negprot(struct smb_request *req)
int chosen_level = -1;
int protocol;
const char *p;
- int arch = ARCH_ALL;
+ int protocols = 0;
int num_cliprotos;
char **cliprotos;
int i;
@@ -579,41 +605,46 @@ void reply_negprot(struct smb_request *req)
}
for (i=0; i<num_cliprotos; i++) {
- if (strcsequal(cliprotos[i], "Windows for Workgroups 3.1a"))
- arch &= ( ARCH_WFWG | ARCH_WIN95 | ARCH_WINNT
- | ARCH_WIN2K );
- else if (strcsequal(cliprotos[i], "DOS LM1.2X002"))
- arch &= ( ARCH_WFWG | ARCH_WIN95 );
- else if (strcsequal(cliprotos[i], "DOS LANMAN2.1"))
- arch &= ( ARCH_WFWG | ARCH_WIN95 );
- else if (strcsequal(cliprotos[i], "NT LM 0.12"))
- arch &= ( ARCH_WIN95 | ARCH_WINNT | ARCH_WIN2K
- | ARCH_CIFSFS);
- else if (strcsequal(cliprotos[i], "SMB 2.001"))
- arch = ARCH_VISTA;
- else if (strcsequal(cliprotos[i], "LANMAN2.1"))
- arch &= ( ARCH_WINNT | ARCH_WIN2K | ARCH_OS2 );
- else if (strcsequal(cliprotos[i], "LM1.2X002"))
- arch &= ( ARCH_WINNT | ARCH_WIN2K | ARCH_OS2 );
- else if (strcsequal(cliprotos[i], "MICROSOFT NETWORKS 1.03"))
- arch &= ARCH_WINNT;
- else if (strcsequal(cliprotos[i], "XENIX CORE"))
- arch &= ( ARCH_WINNT | ARCH_OS2 );
- else if (strcsequal(cliprotos[i], "Samba")) {
- arch = ARCH_SAMBA;
+ if (strcsequal(cliprotos[i], "Windows for Workgroups 3.1a")) {
+ protocols |= PROT_WFWG;
+ } else if (strcsequal(cliprotos[i], "DOS LM1.2X002")) {
+ protocols |= PROT_DOS_LM1_2X002;
+ } else if (strcsequal(cliprotos[i], "DOS LANMAN2.1")) {
+ protocols |= PROT_DOS_LANMAN2_1;
+ } else if (strcsequal(cliprotos[i], "LANMAN1.0")) {
+ protocols |= PROT_LANMAN1_0;
+ } else if (strcsequal(cliprotos[i], "NT LM 0.12")) {
+ protocols |= PROT_NT_LM_0_12;
+ } else if (strcsequal(cliprotos[i], "SMB 2.001")) {
+ protocols |= PROT_SMB_2_001;
+ } else if (strcsequal(cliprotos[i], "SMB 2.002")) {
+ protocols |= PROT_SMB_2_002;
+ } else if (strcsequal(cliprotos[i], "SMB 2.???")) {
+ protocols |= PROT_SMB_2_FF;
+ } else if (strcsequal(cliprotos[i], "LANMAN2.1")) {
+ protocols |= PROT_LANMAN2_1;
+ } else if (strcsequal(cliprotos[i], "LM1.2X002")) {
+ protocols |= PROT_LM1_2X002;
+ } else if (strcsequal(cliprotos[i], "MICROSOFT NETWORKS 1.03")) {
+ protocols |= PROT_MICROSOFT_NETWORKS_1_03;
+ } else if (strcsequal(cliprotos[i], "MICROSOFT NETWORKS 3.0")) {
+ protocols |= PROT_MICROSOFT_NETWORKS_3_0;
+ } else if (strcsequal(cliprotos[i], "PC NETWORK PROGRAM 1.0")) {
+ protocols |= PROT_PC_NETWORK_PROGRAM_1_0;
+ } else if (strcsequal(cliprotos[i], "XENIX CORE")) {
+ protocols |= PROT_XENIX_CORE;
+ } else if (strcsequal(cliprotos[i], "Samba")) {
+ protocols = PROT_SAMBA;
break;
} else if (strcsequal(cliprotos[i], "POSIX 2")) {
- arch = ARCH_CIFSFS;
+ protocols = PROT_POSIX_2;
break;
}
}
- /* CIFSFS can send one arch only, NT LM 0.12. */
- if (i == 1 && (arch & ARCH_CIFSFS)) {
- arch = ARCH_CIFSFS;
- }
-
- switch ( arch ) {
+ switch ( protocols ) {
+ /* Old CIFSFS can send one arch only, NT LM 0.12. */
+ case PROT_NT_LM_0_12:
case ARCH_CIFSFS:
set_remote_arch(RA_CIFSFS);
break;
@@ -627,16 +658,10 @@ void reply_negprot(struct smb_request *req)
set_remote_arch(RA_WIN95);
break;
case ARCH_WINNT:
- if(req->flags2 == FLAGS2_WIN2K_SIGNATURE)
- set_remote_arch(RA_WIN2K);
- else
- set_remote_arch(RA_WINNT);
+ set_remote_arch(RA_WINNT);
break;
case ARCH_WIN2K:
- /* Vista may have been set in the negprot so don't
- override it here */
- if ( get_remote_arch() != RA_VISTA )
- set_remote_arch(RA_WIN2K);
+ set_remote_arch(RA_WIN2K);
break;
case ARCH_VISTA:
set_remote_arch(RA_VISTA);
@@ -644,6 +669,9 @@ void reply_negprot(struct smb_request *req)
case ARCH_OS2:
set_remote_arch(RA_OS2);
break;
+ case ARCH_OSX:
+ set_remote_arch(RA_OSX);
+ break;
default:
set_remote_arch(RA_UNKNOWN);
break;
diff --git a/source3/smbd/smb2_negprot.c b/source3/smbd/smb2_negprot.c
index 1f7f1a9..eb238d3 100644
--- a/source3/smbd/smb2_negprot.c
+++ b/source3/smbd/smb2_negprot.c
@@ -200,8 +200,15 @@ NTSTATUS smbd_smb2_request_process_negprot(struct smbd_smb2_request *req)
return smbd_smb2_request_error(req, NT_STATUS_NOT_SUPPORTED);
}
- if (get_remote_arch() != RA_SAMBA) {
+ switch (get_remote_arch()) {
+ case RA_VISTA:
+ case RA_SAMBA:
+ case RA_CIFSFS:
+ case RA_OSX:
+ break;
+ default:
set_remote_arch(RA_VISTA);
+ break;
}
fstr_sprintf(remote_proto, "SMB%X_%02X",
--
Samba Shared Repository
More information about the samba-cvs
mailing list