r21847: Fix memory leaks in error paths (and in main code path in one case...)
authorJeremy Allison <jra@samba.org>
Thu, 15 Mar 2007 21:53:53 +0000 (21:53 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:18:37 +0000 (12:18 -0500)
in sasl bind. Wonder why coverity didn't find these ?
Jeremy.
(This used to be commit 89bdd30e4b2bb9dbc2ab57c54be8c6d01cae5a26)

source3/libads/sasl.c
source3/smbd/sesssetup.c

index 812f3961f195bb900a4afe4fffa9cf7fe654381b..bdc4f2e276d79eef50da65920e6fea3f2dbc1d50 100644 (file)
@@ -311,9 +311,9 @@ static ADS_STATUS ads_sasl_gssapi_bind(ADS_STRUCT *ads)
        int gss_rc, rc;
        uint8 *p;
        uint32 max_msg_size = 0;
-       char *sname;
+       char *sname = NULL;
        ADS_STATUS status;
-       krb5_principal principal;
+       krb5_principal principal = NULL;
        krb5_context ctx = NULL;
        krb5_enctype enc_types[] = {
 #ifdef ENCTYPE_ARCFOUR_HMAC
@@ -331,24 +331,32 @@ static ADS_STATUS ads_sasl_gssapi_bind(ADS_STRUCT *ads)
        initialize_krb5_error_table();
        status = ADS_ERROR_KRB5(krb5_init_context(&ctx));
        if (!ADS_ERR_OK(status)) {
+               SAFE_FREE(sname);
                return status;
        }
        status = ADS_ERROR_KRB5(krb5_set_default_tgs_ktypes(ctx, enc_types));
        if (!ADS_ERR_OK(status)) {
+               SAFE_FREE(sname);
+               krb5_free_context(ctx); 
                return status;
        }
        status = ADS_ERROR_KRB5(smb_krb5_parse_name(ctx, sname, &principal));
        if (!ADS_ERR_OK(status)) {
+               SAFE_FREE(sname);
+               krb5_free_context(ctx); 
                return status;
        }
 
-       free(sname);
-       krb5_free_context(ctx); 
-
        input_name.value = &principal;
        input_name.length = sizeof(principal);
 
        gss_rc = gss_import_name(&minor_status, &input_name, &nt_principal, &serv_name);
+
+       /* We've finished with principal and sname now. */
+       SAFE_FREE(sname);
+       krb5_free_principal(ctx, principal);
+       krb5_free_context(ctx); 
+
        if (gss_rc) {
                return ADS_ERROR_GSS(gss_rc, minor_status);
        }
index e678d959d8230adf9ae1d15ee7b6e5298f1d5009..ff1b2821cca307711ff7dda25c46333546b7354e 100644 (file)
@@ -176,6 +176,7 @@ static BOOL make_krb5_skew_error(DATA_BLOB *pblob_out)
 
        *pblob_out = data_blob(NULL,0);
 
+       initialize_krb5_error_table();
        kerr = krb5_init_context(&context);
        if (kerr) {
                return False;