[SCM] Samba Shared Repository - branch v3-4-test updated

Karolin Seeger kseeger at samba.org
Tue Oct 20 04:04:37 MDT 2009


The branch, v3-4-test has been updated
       via  78ba2e1... s3-spnego: Fix Bug #6815. Windows 2008 R2 SPNEGO negTokenTarg parsing failure.
       via  a830aa2... s3-spnego: avoid NULL talloc context in read_spnego_data().
      from  e970372... WHATSNEW: Start release notes for Samba 3.4.3.

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-4-test


- Log -----------------------------------------------------------------
commit 78ba2e1b9e5a63443f4cd51d34c16bc7cc9c6941
Author: Günther Deschner <gd at samba.org>
Date:   Thu Oct 15 16:01:36 2009 +0200

    s3-spnego: Fix Bug #6815. Windows 2008 R2 SPNEGO negTokenTarg parsing failure.
    
    When parsing a SPNEGO session setup retry (falling back from KRB5 to NTLMSSP),
    we failed to parse the ASN1_ENUMERATED negResult in the negTokenTarg, thus
    failing spnego_parse_auth() completely.
    
    Guenther

commit a830aa269f44e28a2390e162adbb2e26092f179b
Author: Günther Deschner <gd at samba.org>
Date:   Thu Oct 15 16:00:57 2009 +0200

    s3-spnego: avoid NULL talloc context in read_spnego_data().
    
    Guenther

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

Summary of changes:
 source3/Makefile.in        |    2 +-
 source3/include/proto.h    |    2 +-
 source3/libsmb/clispnego.c |   35 ++++++++++++++++-------------------
 source3/libsmb/spnego.c    |   30 +++++++++++++++---------------
 source3/utils/ntlm_auth.c  |    4 ++--
 5 files changed, 35 insertions(+), 38 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/Makefile.in b/source3/Makefile.in
index 1484e11..fb45056 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -465,7 +465,7 @@ LIBCLI_LDAP_NDR_OBJ = ../libcli/ldap/ldap_ndr.o
 CLDAP_OBJ = libads/cldap.o $(LIBCLI_LDAP_MESSAGE_OBJ) $(LIBCLI_LDAP_NDR_OBJ)
 
 LIBSMB_OBJ = libsmb/clientgen.o libsmb/cliconnect.o libsmb/clifile.o \
-	     libsmb/clikrb5.o libsmb/clispnego.o ../lib/util/asn1.o \
+	     libsmb/clikrb5.o libsmb/clispnego.o libsmb/spnego.o ../lib/util/asn1.o \
 	     libsmb/clirap.o libsmb/clierror.o libsmb/climessage.o \
 	     libsmb/clireadwrite.o libsmb/clilist.o libsmb/cliprint.o \
 	     libsmb/clitrans.o libsmb/clisecdesc.o libsmb/clidgram.o \
diff --git a/source3/include/proto.h b/source3/include/proto.h
index e489224..d91dbf8 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -3293,7 +3293,7 @@ WERROR map_werror_from_unix(int error);
 
 /* The following definitions come from libsmb/spnego.c  */
 
-ssize_t read_spnego_data(DATA_BLOB data, SPNEGO_DATA *token);
+ssize_t read_spnego_data(TALLOC_CTX *mem_ctx, DATA_BLOB data, SPNEGO_DATA *token);
 ssize_t write_spnego_data(DATA_BLOB *blob, SPNEGO_DATA *spnego);
 bool free_spnego_data(SPNEGO_DATA *spnego);
 
diff --git a/source3/libsmb/clispnego.c b/source3/libsmb/clispnego.c
index fb95d71..b531c39 100644
--- a/source3/libsmb/clispnego.c
+++ b/source3/libsmb/clispnego.c
@@ -494,31 +494,28 @@ DATA_BLOB spnego_gen_auth(DATA_BLOB blob)
 */
 bool spnego_parse_auth(DATA_BLOB blob, DATA_BLOB *auth)
 {
-	ASN1_DATA *data;
+	SPNEGO_DATA token;
+	ssize_t len;
 
-	data = asn1_init(talloc_tos());
-	if (data == NULL) {
+	len = read_spnego_data(talloc_tos(), blob, &token);
+	if (len == -1) {
+		DEBUG(3,("spnego_parse_auth: read_spnego_data failed\n"));
 		return false;
 	}
 
-	asn1_load(data, blob);
-	asn1_start_tag(data, ASN1_CONTEXT(1));
-	asn1_start_tag(data, ASN1_SEQUENCE(0));
-	asn1_start_tag(data, ASN1_CONTEXT(2));
-	asn1_read_OctetString(data, NULL, auth);
-	asn1_end_tag(data);
-	asn1_end_tag(data);
-	asn1_end_tag(data);
-
-	if (data->has_error) {
-		DEBUG(3,("spnego_parse_auth failed at %d\n", (int)data->ofs));
-		data_blob_free(auth);
-		asn1_free(data);
-		return False;
+	if (token.type != SPNEGO_NEG_TOKEN_TARG) {
+		DEBUG(3,("spnego_parse_auth: wrong token type: %d\n",
+			token.type));
+		free_spnego_data(&token);
+		return false;
 	}
 
-	asn1_free(data);
-	return True;
+	*auth = data_blob_talloc(talloc_tos(),
+				 token.negTokenTarg.responseToken.data,
+				 token.negTokenTarg.responseToken.length);
+	free_spnego_data(&token);
+
+	return true;
 }
 
 /*
diff --git a/source3/libsmb/spnego.c b/source3/libsmb/spnego.c
index ee2c3c3..3ef9610 100644
--- a/source3/libsmb/spnego.c
+++ b/source3/libsmb/spnego.c
@@ -25,7 +25,7 @@
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_AUTH
 
-static bool read_negTokenInit(ASN1_DATA *asn1, negTokenInit_t *token)
+static bool read_negTokenInit(TALLOC_CTX *mem_ctx, ASN1_DATA *asn1, negTokenInit_t *token)
 {
 	ZERO_STRUCTP(token);
 
@@ -41,17 +41,17 @@ static bool read_negTokenInit(ASN1_DATA *asn1, negTokenInit_t *token)
 			asn1_start_tag(asn1, ASN1_CONTEXT(0));
 			asn1_start_tag(asn1, ASN1_SEQUENCE(0));
 
-			token->mechTypes = TALLOC_P(NULL, const char *);
+			token->mechTypes = TALLOC_P(mem_ctx, const char *);
 			for (i = 0; !asn1->has_error &&
 				     0 < asn1_tag_remaining(asn1); i++) {
 				const char *p_oid = NULL;
 				token->mechTypes = 
-					TALLOC_REALLOC_ARRAY(NULL, token->mechTypes, const char *, i + 2);
+					TALLOC_REALLOC_ARRAY(mem_ctx, token->mechTypes, const char *, i + 2);
 				if (!token->mechTypes) {
 					asn1->has_error = True;
 					return False;
 				}
-				asn1_read_OID(asn1, NULL, &p_oid);
+				asn1_read_OID(asn1, mem_ctx, &p_oid);
 				token->mechTypes[i] = p_oid;
 			}
 			token->mechTypes[i] = NULL;
@@ -69,14 +69,14 @@ static bool read_negTokenInit(ASN1_DATA *asn1, negTokenInit_t *token)
                 /* Read mechToken */
 		case ASN1_CONTEXT(2):
 			asn1_start_tag(asn1, ASN1_CONTEXT(2));
-			asn1_read_OctetString(asn1, NULL, &token->mechToken);
+			asn1_read_OctetString(asn1, mem_ctx, &token->mechToken);
 			asn1_end_tag(asn1);
 			break;
 		/* Read mecListMIC */
 		case ASN1_CONTEXT(3):
 			asn1_start_tag(asn1, ASN1_CONTEXT(3));
 			if (asn1->data[asn1->ofs] == ASN1_OCTET_STRING) {
-				asn1_read_OctetString(asn1, NULL,
+				asn1_read_OctetString(asn1, mem_ctx,
 						      &token->mechListMIC);
 			} else {
 				/* RFC 2478 says we have an Octet String here,
@@ -84,7 +84,7 @@ static bool read_negTokenInit(ASN1_DATA *asn1, negTokenInit_t *token)
 				char *mechListMIC;
 				asn1_push_tag(asn1, ASN1_SEQUENCE(0));
 				asn1_push_tag(asn1, ASN1_CONTEXT(0));
-				asn1_read_GeneralString(asn1, NULL, &mechListMIC);
+				asn1_read_GeneralString(asn1, mem_ctx, &mechListMIC);
 				asn1_pop_tag(asn1);
 				asn1_pop_tag(asn1);
 
@@ -169,7 +169,7 @@ static bool write_negTokenInit(ASN1_DATA *asn1, negTokenInit_t *token)
 	return !asn1->has_error;
 }
 
-static bool read_negTokenTarg(ASN1_DATA *asn1, negTokenTarg_t *token)
+static bool read_negTokenTarg(TALLOC_CTX *mem_ctx, ASN1_DATA *asn1, negTokenTarg_t *token)
 {
 	ZERO_STRUCTP(token);
 
@@ -188,19 +188,19 @@ static bool read_negTokenTarg(ASN1_DATA *asn1, negTokenTarg_t *token)
 		case ASN1_CONTEXT(1): {
 			const char *mech = NULL;
 			asn1_start_tag(asn1, ASN1_CONTEXT(1));
-			asn1_read_OID(asn1, NULL, &mech);
+			asn1_read_OID(asn1, mem_ctx, &mech);
 			asn1_end_tag(asn1);
 			token->supportedMech = CONST_DISCARD(char *, mech);
 			}
 			break;
 		case ASN1_CONTEXT(2):
 			asn1_start_tag(asn1, ASN1_CONTEXT(2));
-			asn1_read_OctetString(asn1, NULL, &token->responseToken);
+			asn1_read_OctetString(asn1, mem_ctx, &token->responseToken);
 			asn1_end_tag(asn1);
 			break;
 		case ASN1_CONTEXT(3):
 			asn1_start_tag(asn1, ASN1_CONTEXT(3));
-			asn1_read_OctetString(asn1, NULL, &token->mechListMIC);
+			asn1_read_OctetString(asn1, mem_ctx, &token->mechListMIC);
 			asn1_end_tag(asn1);
 			break;
 		default:
@@ -250,14 +250,14 @@ static bool write_negTokenTarg(ASN1_DATA *asn1, negTokenTarg_t *token)
 	return !asn1->has_error;
 }
 
-ssize_t read_spnego_data(DATA_BLOB data, SPNEGO_DATA *token)
+ssize_t read_spnego_data(TALLOC_CTX *mem_ctx, DATA_BLOB data, SPNEGO_DATA *token)
 {
 	ASN1_DATA *asn1;
 	ssize_t ret = -1;
 
 	ZERO_STRUCTP(token);
 
-	asn1 = asn1_init(talloc_tos());
+	asn1 = asn1_init(mem_ctx);
 	if (asn1 == NULL) {
 		return -1;
 	}
@@ -268,13 +268,13 @@ ssize_t read_spnego_data(DATA_BLOB data, SPNEGO_DATA *token)
 	case ASN1_APPLICATION(0):
 		asn1_start_tag(asn1, ASN1_APPLICATION(0));
 		asn1_check_OID(asn1, OID_SPNEGO);
-		if (read_negTokenInit(asn1, &token->negTokenInit)) {
+		if (read_negTokenInit(mem_ctx, asn1, &token->negTokenInit)) {
 			token->type = SPNEGO_NEG_TOKEN_INIT;
 		}
 		asn1_end_tag(asn1);
 		break;
 	case ASN1_CONTEXT(1):
-		if (read_negTokenTarg(asn1, &token->negTokenTarg)) {
+		if (read_negTokenTarg(mem_ctx, asn1, &token->negTokenTarg)) {
 			token->type = SPNEGO_NEG_TOKEN_TARG;
 		}
 		break;
diff --git a/source3/utils/ntlm_auth.c b/source3/utils/ntlm_auth.c
index 7899bd0..595d792 100644
--- a/source3/utils/ntlm_auth.c
+++ b/source3/utils/ntlm_auth.c
@@ -1165,7 +1165,7 @@ static void manage_gss_spnego_request(struct ntlm_auth_state *state,
 	}
 
 	token = base64_decode_data_blob(buf + 3);
-	len = read_spnego_data(token, &request);
+	len = read_spnego_data(talloc_tos(), token, &request);
 	data_blob_free(&token);
 
 	if (len == -1) {
@@ -1646,7 +1646,7 @@ static void manage_gss_spnego_client_request(struct ntlm_auth_state *state,
 	/* So we got a server challenge to generate a SPNEGO
            client-to-server request... */
 
-	len = read_spnego_data(request, &spnego);
+	len = read_spnego_data(talloc_tos(), request, &spnego);
 	data_blob_free(&request);
 
 	if (len == -1) {


-- 
Samba Shared Repository


More information about the samba-cvs mailing list