[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Mon Feb 23 17:02:05 MST 2015


The branch, master has been updated
       via  84d4270 nmblookup: Warn user if netbios name is too long.
       via  a782ae1 nss-wins: Do not lookup invalid netbios names
       via  a5e3a19 libsmb: Do not lookup invalid netbios names.
       via  eb05766 Revert "s3: smbd: signing. Ensure we respond correctly to an SMB2 negprot with SMB2_NEGOTIATE_SIGNING_REQUIRED."
      from  c0a463d waf: Only build the wrappers if we enable selftest

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 84d4270c8e4ec18e9f83722d6df1a07f70acaade
Author: Andreas Schneider <asn at samba.org>
Date:   Fri Jan 30 14:37:06 2015 +0100

    nmblookup: Warn user if netbios name is too long.
    
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Tue Feb 24 01:01:10 CET 2015 on sn-devel-104

commit a782ae1da463433b6f5199acd0d093583780dd20
Author: Andreas Schneider <asn at samba.org>
Date:   Fri Jan 30 14:29:26 2015 +0100

    nss-wins: Do not lookup invalid netbios names
    
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit a5e3a198d0a1c36a3798935595e4844588caba68
Author: Andreas Schneider <asn at samba.org>
Date:   Fri Jan 30 14:28:48 2015 +0100

    libsmb: Do not lookup invalid netbios names.
    
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit eb05766a8c539b1b7d8de8481686556f6bdcc6db
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Feb 23 10:15:05 2015 -0800

    Revert "s3: smbd: signing. Ensure we respond correctly to an SMB2 negprot with SMB2_NEGOTIATE_SIGNING_REQUIRED."
    
    Even though the MS-SMB2 spec says so, Windows doesn't behave
    like this.
    
    This reverts commit 1cea6e5b6f8c0e28d5ba2d296c831c4878fca304.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: "Stefan (metze) Metzmacher" <metze at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 libcli/nbt/tools/nmblookup.c  | 13 +++++++++++++
 nsswitch/wins.c               | 14 +++++++++++++-
 source3/libsmb/namequery.c    | 17 ++++++++++++++---
 source3/smbd/smb2_negprot.c   |  3 +--
 source3/smbd/smb2_sesssetup.c |  4 +---
 source3/utils/nmblookup.c     |  9 +++++++++
 6 files changed, 51 insertions(+), 9 deletions(-)


Changeset truncated at 500 lines:

diff --git a/libcli/nbt/tools/nmblookup.c b/libcli/nbt/tools/nmblookup.c
index 9b875b0..afb81c7 100644
--- a/libcli/nbt/tools/nmblookup.c
+++ b/libcli/nbt/tools/nmblookup.c
@@ -32,6 +32,10 @@
 #include "../libcli/nbt/libnbt.h"
 #include "param/param.h"
 
+#include <string.h>
+
+#define MAX_NETBIOSNAME_LEN 16
+
 /* command line options */
 static struct {
 	const char *broadcast_address;
@@ -190,6 +194,7 @@ static bool process_one(struct loadparm_context *lp_ctx, struct tevent_context *
 	struct socket_address *all_zero_addr;
 	struct nbt_name_socket *nbtsock;
 	NTSTATUS status = NT_STATUS_OK;
+	size_t nbt_len;
 	bool ret = true;
 
 	if (!options.case_sensitive) {
@@ -212,6 +217,14 @@ static bool process_one(struct loadparm_context *lp_ctx, struct tevent_context *
 		node_name = talloc_strdup(tmp_ctx, name);
 	}
 
+	nbt_len = strlen(node_name);
+	if (nbt_len > MAX_NETBIOSNAME_LEN - 1) {
+		printf("The specified netbios name [%s] is too long.\n",
+		       node_name);
+		talloc_free(tmp_ctx);
+		return false;
+	}
+
 	nbtsock = nbt_name_socket_init(tmp_ctx, ev);
 	
 	if (options.root_port) {
diff --git a/nsswitch/wins.c b/nsswitch/wins.c
index d63968b..5127ee4 100644
--- a/nsswitch/wins.c
+++ b/nsswitch/wins.c
@@ -59,10 +59,12 @@ static void nss_wins_init(void)
 
 static struct in_addr *lookup_byname_backend(const char *name, int *count)
 {
-	TALLOC_CTX *frame = talloc_stackframe();
+	TALLOC_CTX *frame;
 	struct sockaddr_storage *address = NULL;
 	struct in_addr *ret = NULL;
 	NTSTATUS status;
+	const char *p;
+	size_t nbt_len;
 	int j;
 
 	if (!initialised) {
@@ -71,6 +73,16 @@ static struct in_addr *lookup_byname_backend(const char *name, int *count)
 
 	*count = 0;
 
+	nbt_len = strlen(name);
+	if (nbt_len > MAX_NETBIOSNAME_LEN - 1) {
+		return NULL;
+	}
+	p = strchr(name, '.');
+	if (p != NULL) {
+		return NULL;
+	}
+
+	frame = talloc_stackframe();
 	/* always try with wins first */
 	status = resolve_wins(name, 0x00, talloc_tos(),
 			      &address, count);
diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
index c80e255..85af6ed 100644
--- a/source3/libsmb/namequery.c
+++ b/source3/libsmb/namequery.c
@@ -2566,6 +2566,8 @@ NTSTATUS internal_resolve_name(const char *name,
 	NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
 	int i;
 	TALLOC_CTX *frame = NULL;
+	bool do_nbt_lookup = true;
+	size_t nbt_len;
 
 	*return_iplist = NULL;
 	*return_count = 0;
@@ -2626,6 +2628,15 @@ NTSTATUS internal_resolve_name(const char *name,
 	}
 
 	/* iterate through the name resolution backends */
+	nbt_len = strlen(name);
+	if (nbt_len > MAX_NETBIOSNAME_LEN - 1) {
+		do_nbt_lookup = false;
+	} else {
+		const char *p = strchr(name, '.');
+		if (p != NULL) {
+			do_nbt_lookup = false;
+		}
+	}
 
 	frame = talloc_stackframe();
 	for (i=0; resolve_order[i]; i++) {
@@ -2656,13 +2667,13 @@ NTSTATUS internal_resolve_name(const char *name,
 			if (NT_STATUS_IS_OK(status)) {
 				goto done;
 			}
-		} else if(strequal( tok, "lmhosts")) {
+		} else if (do_nbt_lookup && strequal(tok, "lmhosts")) {
 			status = resolve_lmhosts(name, name_type,
 						 return_iplist, return_count);
 			if (NT_STATUS_IS_OK(status)) {
 				goto done;
 			}
-		} else if(strequal( tok, "wins")) {
+		} else if (do_nbt_lookup && strequal(tok, "wins")) {
 			/* don't resolve 1D via WINS */
 			struct sockaddr_storage *ss_list;
 			if (name_type != 0x1D) {
@@ -2679,7 +2690,7 @@ NTSTATUS internal_resolve_name(const char *name,
 					goto done;
 				}
 			}
-		} else if(strequal( tok, "bcast")) {
+		} else if (do_nbt_lookup && strequal(tok, "bcast")) {
 			struct sockaddr_storage *ss_list;
 			status = name_resolve_bcast(
 				name, name_type, talloc_tos(),
diff --git a/source3/smbd/smb2_negprot.c b/source3/smbd/smb2_negprot.c
index 02f6882..9a1ca9c 100644
--- a/source3/smbd/smb2_negprot.c
+++ b/source3/smbd/smb2_negprot.c
@@ -221,8 +221,7 @@ NTSTATUS smbd_smb2_request_process_negprot(struct smbd_smb2_request *req)
 	}
 
 	security_mode = SMB2_NEGOTIATE_SIGNING_ENABLED;
-	if (lp_server_signing() == SMB_SIGNING_REQUIRED ||
-			(in_security_mode & SMB2_NEGOTIATE_SIGNING_REQUIRED)) {
+	if (lp_server_signing() == SMB_SIGNING_REQUIRED) {
 		security_mode |= SMB2_NEGOTIATE_SIGNING_REQUIRED;
 	}
 
diff --git a/source3/smbd/smb2_sesssetup.c b/source3/smbd/smb2_sesssetup.c
index f918328..2f58e44 100644
--- a/source3/smbd/smb2_sesssetup.c
+++ b/source3/smbd/smb2_sesssetup.c
@@ -186,9 +186,7 @@ static NTSTATUS smbd_smb2_auth_generic_return(struct smbXsrv_session *session,
 	struct smbXsrv_connection *xconn = smb2req->xconn;
 
 	if ((in_security_mode & SMB2_NEGOTIATE_SIGNING_REQUIRED) ||
-	    lp_server_signing() == SMB_SIGNING_REQUIRED ||
-	    (xconn->smb2.server.security_mode &
-			SMB2_NEGOTIATE_SIGNING_REQUIRED)) {
+	    lp_server_signing() == SMB_SIGNING_REQUIRED) {
 		x->global->signing_required = true;
 	}
 
diff --git a/source3/utils/nmblookup.c b/source3/utils/nmblookup.c
index 78548e9..a119b3e 100644
--- a/source3/utils/nmblookup.c
+++ b/source3/utils/nmblookup.c
@@ -320,6 +320,7 @@ int main(int argc, const char *argv[])
 	while(poptPeekArg(pc)) {
 		char *p;
 		struct in_addr ip;
+		size_t nbt_len;
 
 		fstrcpy(lookup,poptGetArg(pc));
 
@@ -349,6 +350,14 @@ int main(int argc, const char *argv[])
 			sscanf(++p,"%x",&lookup_type);
 		}
 
+		nbt_len = strlen(lookup);
+		if (nbt_len > MAX_NETBIOSNAME_LEN - 1) {
+			d_printf("The specified netbios name [%s] is too long!\n",
+				 lookup);
+			continue;
+		}
+
+
 		if (!query_one(lookup, lookup_type)) {
 			rc = 1;
 			d_printf( "name_query failed to find name %s", lookup );


-- 
Samba Shared Repository


More information about the samba-cvs mailing list