r21110: Fix kinit with Heimdal (Bug #4226).
authorGünther Deschner <gd@samba.org>
Thu, 1 Feb 2007 15:10:13 +0000 (15:10 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:17:38 +0000 (12:17 -0500)
Guenther

source/include/includes.h
source/libads/kerberos.c
source/libsmb/clikrb5.c

index f7edb68c16bead37b274a1448aed0be5643c4e4a..8aaaba979936452919fc6385c45a25589d362d39 100644 (file)
@@ -1176,6 +1176,8 @@ krb5_error_code nt_status_to_krb5(NTSTATUS nt_status);
 void smb_krb5_free_error(krb5_context context, krb5_error *krberror);
 krb5_error_code handle_krberror_packet(krb5_context context,
                                          krb5_data *packet);
+void krb5_get_init_creds_opt_free(krb5_get_init_creds_opt *opt);
+krb5_error_code krb5_get_init_creds_opt_alloc(krb5_context context, krb5_get_init_creds_opt **opt);
 #endif /* HAVE_KRB5 */
 
 
index d35b59f4cdbfb30d1f154ec30f13d63ffc6bb86e..3d4b8cbcf8c77c59764e97ab3ce3657befb5a0bb 100644 (file)
@@ -75,7 +75,7 @@ int kerberos_kinit_password_ext(const char *principal,
        krb5_ccache cc = NULL;
        krb5_principal me;
        krb5_creds my_creds;
-       krb5_get_init_creds_opt opt;
+       krb5_get_init_creds_opt *opt = NULL;
        smb_krb5_addresses *addr = NULL;
 
        initialize_krb5_error_table();
@@ -96,47 +96,60 @@ int kerberos_kinit_password_ext(const char *principal,
        }
        
        if ((code = smb_krb5_parse_name(ctx, principal, &me))) {
+               krb5_cc_close(ctx, cc);
                krb5_free_context(ctx); 
                return code;
        }
 
-       krb5_get_init_creds_opt_init(&opt);
-       krb5_get_init_creds_opt_set_renew_life(&opt, renewable_time);
-       krb5_get_init_creds_opt_set_forwardable(&opt, 1);
-       
-       if (request_pac) {
+       code = krb5_get_init_creds_opt_alloc(ctx, &opt);
+       if (code) {
+               krb5_cc_close(ctx, cc);
+               krb5_free_context(ctx); 
+               return code;
+       }
+
+       krb5_get_init_creds_opt_set_renew_life(opt, renewable_time);
+       krb5_get_init_creds_opt_set_forwardable(opt, True);
+
 #ifdef HAVE_KRB5_GET_INIT_CREDS_OPT_SET_PAC_REQUEST
-               code = krb5_get_init_creds_opt_set_pac_request(ctx, &opt, True);
+       if (request_pac) {
+               code = krb5_get_init_creds_opt_set_pac_request(ctx, opt, (krb5_boolean)request_pac);
                if (code) {
+                       krb5_cc_close(ctx, cc);
                        krb5_free_principal(ctx, me);
                        krb5_free_context(ctx);
                        return code;
                }
-#endif
        }
-
+#endif
        if (add_netbios_addr) {
                code = smb_krb5_gen_netbios_krb5_address(&addr);
                if (code) {
+                       krb5_cc_close(ctx, cc);
                        krb5_free_principal(ctx, me);
                        krb5_free_context(ctx);         
                        return code;    
                }
-               krb5_get_init_creds_opt_set_address_list(&opt, addr->addrs);
+               krb5_get_init_creds_opt_set_address_list(opt, addr->addrs);
        }
 
        if ((code = krb5_get_init_creds_password(ctx, &my_creds, me, CONST_DISCARD(char *,password), 
-                                                kerb_prompter, NULL, 0, NULL, &opt)))
+                                                kerb_prompter, NULL, 0, NULL, opt)))
        {
+               krb5_get_init_creds_opt_free(opt);
                smb_krb5_free_addresses(ctx, addr);
+               krb5_cc_close(ctx, cc);
                krb5_free_principal(ctx, me);
-               krb5_free_context(ctx);         
+               krb5_free_context(ctx);
                return code;
        }
-       
+
+       krb5_get_init_creds_opt_free(opt);
+
        if ((code = krb5_cc_initialize(ctx, cc, me))) {
                smb_krb5_free_addresses(ctx, addr);
                krb5_free_cred_contents(ctx, &my_creds);
+               krb5_cc_close(ctx, cc);
                krb5_free_principal(ctx, me);
                krb5_free_context(ctx);         
                return code;
index 4092b4b2b90698daf81c4e5ddae57053e2be1146..305139e1f4752b611f8909eed2f2900e52fbeb32 100644 (file)
@@ -1379,6 +1379,32 @@ done:
        return ret;
 }
 
+#ifndef HAVE_KRB5_GET_INIT_CREDS_OPT_ALLOC 
+ krb5_error_code krb5_get_init_creds_opt_alloc(krb5_context context, krb5_get_init_creds_opt **opt)
+{
+       krb5_get_init_creds_opt *my_opt;
+
+       *opt = NULL;
+
+       if ((my_opt = SMB_MALLOC(sizeof(krb5_get_init_creds_opt))) == NULL) {
+               return ENOMEM;
+       }
+
+       krb5_get_init_creds_opt_init(my_opt);
+
+       *opt =  my_opt;
+       return 0;
+}
+#endif
+
+#ifndef HAVE_KRB5_GET_INIT_CREDS_OPT_FREE 
+ void krb5_get_init_creds_opt_free(krb5_get_init_creds_opt *opt)
+{
+       SAFE_FREE(opt);
+       opt = NULL;
+}
+#endif
+
 #else /* HAVE_KRB5 */
  /* this saves a few linking headaches */
  int cli_krb5_get_ticket(const char *principal, time_t time_offset,