Replace more long-lived contexts with talloc_autofree_context().
[ira/wip.git] / source3 / libsmb / spnego.c
index 57b2d8060bd1909004bfd640f5d4b9b1034d0a98..3fa9559cfb1aab06ad90c5e72d3ae488bd0d4450 100644 (file)
@@ -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 = SMB_MALLOC_P(const char *);
+                       token->mechTypes = TALLOC_P(talloc_autofree_context(), const char *);
                        for (i = 0; !asn1->has_error &&
                                     0 < asn1_tag_remaining(asn1); i++) {
-                               char *p_oid = NULL;
+                               const char *p_oid = NULL;
                                token->mechTypes = 
-                                       SMB_REALLOC_ARRAY(token->mechTypes, const char *, i + 2);
+                                       TALLOC_REALLOC_ARRAY(NULL, token->mechTypes, const char *, i + 2);
                                if (!token->mechTypes) {
                                        asn1->has_error = True;
                                        return False;
                                }
-                               asn1_read_OID(asn1, &p_oid);
+                               asn1_read_OID(asn1, NULL, &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, &token->mechToken);
+                       asn1_read_OctetString(asn1, NULL, &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,
+                               asn1_read_OctetString(asn1, NULL,
                                                      &token->mechListMIC);
                        } else {
                                /* RFC 2478 says we have an Octet String here,
@@ -84,13 +84,13 @@ 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, &mechListMIC);
+                               asn1_read_GeneralString(asn1, NULL, &mechListMIC);
                                asn1_pop_tag(asn1);
                                asn1_pop_tag(asn1);
 
                                token->mechListMIC =
                                        data_blob(mechListMIC, strlen(mechListMIC));
-                               SAFE_FREE(mechListMIC);
+                               TALLOC_FREE(mechListMIC);
                        }
                        asn1_end_tag(asn1);
                        break;
@@ -185,19 +185,22 @@ static bool read_negTokenTarg(ASN1_DATA *asn1, negTokenTarg_t *token)
                        asn1_end_tag(asn1);
                        asn1_end_tag(asn1);
                        break;
-               case ASN1_CONTEXT(1):
+               case ASN1_CONTEXT(1): {
+                       const char *mech = NULL;
                        asn1_start_tag(asn1, ASN1_CONTEXT(1));
-                       asn1_read_OID(asn1, &token->supportedMech);
+                       asn1_read_OID(asn1, NULL, &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, &token->responseToken);
+                       asn1_read_OctetString(asn1, NULL, &token->responseToken);
                        asn1_end_tag(asn1);
                        break;
                case ASN1_CONTEXT(3):
                        asn1_start_tag(asn1, ASN1_CONTEXT(3));
-                       asn1_read_OctetString(asn1, &token->mechListMIC);
+                       asn1_read_OctetString(asn1, NULL, &token->mechListMIC);
                        asn1_end_tag(asn1);
                        break;
                default:
@@ -249,24 +252,29 @@ static bool write_negTokenTarg(ASN1_DATA *asn1, negTokenTarg_t *token)
 
 ssize_t read_spnego_data(DATA_BLOB data, SPNEGO_DATA *token)
 {
-       ASN1_DATA asn1;
+       ASN1_DATA *asn1;
        ssize_t ret = -1;
 
        ZERO_STRUCTP(token);
-       ZERO_STRUCT(asn1);
-       asn1_load(&asn1, data);
 
-       switch (asn1.data[asn1.ofs]) {
+       asn1 = asn1_init(talloc_tos());
+       if (asn1 == NULL) {
+               return -1;
+       }
+
+       asn1_load(asn1, data);
+
+       switch (asn1->data[asn1->ofs]) {
        case ASN1_APPLICATION(0):
-               asn1_start_tag(&asn1, ASN1_APPLICATION(0));
-               asn1_check_OID(&asn1, OID_SPNEGO);
-               if (read_negTokenInit(&asn1, &token->negTokenInit)) {
+               asn1_start_tag(asn1, ASN1_APPLICATION(0));
+               asn1_check_OID(asn1, OID_SPNEGO);
+               if (read_negTokenInit(asn1, &token->negTokenInit)) {
                        token->type = SPNEGO_NEG_TOKEN_INIT;
                }
-               asn1_end_tag(&asn1);
+               asn1_end_tag(asn1);
                break;
        case ASN1_CONTEXT(1):
-               if (read_negTokenTarg(&asn1, &token->negTokenTarg)) {
+               if (read_negTokenTarg(asn1, &token->negTokenTarg)) {
                        token->type = SPNEGO_NEG_TOKEN_TARG;
                }
                break;
@@ -274,39 +282,42 @@ ssize_t read_spnego_data(DATA_BLOB data, SPNEGO_DATA *token)
                break;
        }
 
-       if (!asn1.has_error) ret = asn1.ofs;
-       asn1_free(&asn1);
+       if (!asn1->has_error) ret = asn1->ofs;
+       asn1_free(asn1);
 
        return ret;
 }
 
 ssize_t write_spnego_data(DATA_BLOB *blob, SPNEGO_DATA *spnego)
 {
-       ASN1_DATA asn1;
+       ASN1_DATA *asn1;
        ssize_t ret = -1;
 
-       ZERO_STRUCT(asn1);
+       asn1 = asn1_init(talloc_tos());
+       if (asn1 == NULL) {
+               return -1;
+       }
 
        switch (spnego->type) {
        case SPNEGO_NEG_TOKEN_INIT:
-               asn1_push_tag(&asn1, ASN1_APPLICATION(0));
-               asn1_write_OID(&asn1, OID_SPNEGO);
-               write_negTokenInit(&asn1, &spnego->negTokenInit);
-               asn1_pop_tag(&asn1);
+               asn1_push_tag(asn1, ASN1_APPLICATION(0));
+               asn1_write_OID(asn1, OID_SPNEGO);
+               write_negTokenInit(asn1, &spnego->negTokenInit);
+               asn1_pop_tag(asn1);
                break;
        case SPNEGO_NEG_TOKEN_TARG:
-               write_negTokenTarg(&asn1, &spnego->negTokenTarg);
+               write_negTokenTarg(asn1, &spnego->negTokenTarg);
                break;
        default:
-               asn1.has_error = True;
+               asn1->has_error = True;
                break;
        }
 
-       if (!asn1.has_error) {
-               *blob = data_blob(asn1.data, asn1.length);
-               ret = asn1.ofs;
+       if (!asn1->has_error) {
+               *blob = data_blob(asn1->data, asn1->length);
+               ret = asn1->ofs;
        }
-       asn1_free(&asn1);
+       asn1_free(asn1);
 
        return ret;
 }
@@ -322,16 +333,16 @@ bool free_spnego_data(SPNEGO_DATA *spnego)
                if (spnego->negTokenInit.mechTypes) {
                        int i;
                        for (i = 0; spnego->negTokenInit.mechTypes[i]; i++) {
-                               free(CONST_DISCARD(char *,spnego->negTokenInit.mechTypes[i]));
+                               talloc_free(CONST_DISCARD(char *,spnego->negTokenInit.mechTypes[i]));
                        }
-                       free(spnego->negTokenInit.mechTypes);
+                       talloc_free(spnego->negTokenInit.mechTypes);
                }
                data_blob_free(&spnego->negTokenInit.mechToken);
                data_blob_free(&spnego->negTokenInit.mechListMIC);
                break;
        case SPNEGO_NEG_TOKEN_TARG:
                if (spnego->negTokenTarg.supportedMech) {
-                       free(spnego->negTokenTarg.supportedMech);
+                       talloc_free(spnego->negTokenTarg.supportedMech);
                }
                data_blob_free(&spnego->negTokenTarg.responseToken);
                data_blob_free(&spnego->negTokenTarg.mechListMIC);