s3-spnego: avoid NULL talloc context in read_spnego_data().
authorGünther Deschner <gd@samba.org>
Thu, 15 Oct 2009 14:00:57 +0000 (16:00 +0200)
committerKarolin Seeger <kseeger@samba.org>
Tue, 20 Oct 2009 10:02:30 +0000 (12:02 +0200)
Guenther

source3/include/proto.h
source3/libsmb/spnego.c
source3/utils/ntlm_auth.c

index e489224aaa7c3bb529f49ae4017b0b269811040c..d91dbf8aa8ab5e673272b326868441a7ca847d76 100644 (file)
@@ -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);
 
index ee2c3c3d5a7ac646b8641a6a832f88004334feb8..3ef9610c69346e14236f0b7af6220585e6570d7c 100644 (file)
@@ -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;
index 7899bd0d07690c1f56fc0781bcaa2d75fed9b52d..595d79293ab85b78bff4385bec0fc111c3309238 100644 (file)
@@ -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) {