More conversions of NULL -> talloc_autofree_context()
[ira/wip.git] / source3 / libsmb / spnego.c
index a0f5565d4f3f9fbdff12a7e74dcbb1cf2aa95cbd..528c7f400902dd3fc110cc88d945c200e7fe249d 100644 (file)
@@ -7,7 +7,7 @@
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
@@ -17,8 +17,7 @@
 
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
@@ -26,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(ASN1_DATA *asn1, negTokenInit_t *token)
 {
        ZERO_STRUCTP(token);
 
@@ -42,12 +41,19 @@ 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(char *);
+                       token->mechTypes = TALLOC_P(talloc_autofree_context(), const char *);
                        for (i = 0; !asn1->has_error &&
                                     0 < asn1_tag_remaining(asn1); i++) {
+                               const char *p_oid = NULL;
                                token->mechTypes = 
-                                       SMB_REALLOC_ARRAY(token->mechTypes, char *, i + 2);
-                               asn1_read_OID(asn1, token->mechTypes + i);
+                                       TALLOC_REALLOC_ARRAY(talloc_autofree_context(),
+                                               token->mechTypes, const char *, i + 2);
+                               if (!token->mechTypes) {
+                                       asn1->has_error = True;
+                                       return False;
+                               }
+                               asn1_read_OID(asn1, talloc_autofree_context(), &p_oid);
+                               token->mechTypes[i] = p_oid;
                        }
                        token->mechTypes[i] = NULL;
                        
@@ -64,14 +70,15 @@ 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,
+                               talloc_autofree_context(), &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, talloc_autofree_context(),
                                                      &token->mechListMIC);
                        } else {
                                /* RFC 2478 says we have an Octet String here,
@@ -79,13 +86,14 @@ 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,
+                                       talloc_autofree_context(), &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;
@@ -101,7 +109,7 @@ static BOOL read_negTokenInit(ASN1_DATA *asn1, negTokenInit_t *token)
        return !asn1->has_error;
 }
 
-static BOOL write_negTokenInit(ASN1_DATA *asn1, negTokenInit_t *token)
+static bool write_negTokenInit(ASN1_DATA *asn1, negTokenInit_t *token)
 {
        asn1_push_tag(asn1, ASN1_CONTEXT(0));
        asn1_push_tag(asn1, ASN1_SEQUENCE(0));
@@ -164,7 +172,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(ASN1_DATA *asn1, negTokenTarg_t *token)
 {
        ZERO_STRUCTP(token);
 
@@ -180,19 +188,24 @@ 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, talloc_autofree_context(), &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,
+                               talloc_autofree_context(), &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,
+                               talloc_autofree_context(), &token->mechListMIC);
                        asn1_end_tag(asn1);
                        break;
                default:
@@ -207,7 +220,7 @@ static BOOL read_negTokenTarg(ASN1_DATA *asn1, negTokenTarg_t *token)
        return !asn1->has_error;
 }
 
-static BOOL write_negTokenTarg(ASN1_DATA *asn1, negTokenTarg_t *token)
+static bool write_negTokenTarg(ASN1_DATA *asn1, negTokenTarg_t *token)
 {
        asn1_push_tag(asn1, ASN1_CONTEXT(1));
        asn1_push_tag(asn1, ASN1_SEQUENCE(0));
@@ -244,24 +257,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;
@@ -269,46 +287,49 @@ 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;
 }
 
-BOOL free_spnego_data(SPNEGO_DATA *spnego)
+bool free_spnego_data(SPNEGO_DATA *spnego)
 {
-       BOOL ret = True;
+       bool ret = True;
 
        if (!spnego) goto out;
 
@@ -317,16 +338,16 @@ BOOL free_spnego_data(SPNEGO_DATA *spnego)
                if (spnego->negTokenInit.mechTypes) {
                        int i;
                        for (i = 0; spnego->negTokenInit.mechTypes[i]; i++) {
-                               free(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);
@@ -339,4 +360,3 @@ BOOL free_spnego_data(SPNEGO_DATA *spnego)
 out:
        return ret;
 }
-