svn commit: samba r21110 - in branches: SAMBA_3_0/source/include SAMBA_3_0/source/libads SAMBA_3_0/source/libsmb SAMBA_3_0_24/source SAMBA_3_0_24/source/include SAMBA_3_0_24/source/libads SAMBA_3_0_24/source/libsmb

gd at samba.org gd at samba.org
Thu Feb 1 15:10:14 GMT 2007


Author: gd
Date: 2007-02-01 15:10:13 +0000 (Thu, 01 Feb 2007)
New Revision: 21110

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=21110

Log:
Fix kinit with Heimdal (Bug #4226).

Guenther

Modified:
   branches/SAMBA_3_0/source/include/includes.h
   branches/SAMBA_3_0/source/libads/kerberos.c
   branches/SAMBA_3_0/source/libsmb/clikrb5.c
   branches/SAMBA_3_0_24/source/configure.in
   branches/SAMBA_3_0_24/source/include/includes.h
   branches/SAMBA_3_0_24/source/libads/kerberos.c
   branches/SAMBA_3_0_24/source/libsmb/clikrb5.c


Changeset:
Modified: branches/SAMBA_3_0/source/include/includes.h
===================================================================
--- branches/SAMBA_3_0/source/include/includes.h	2007-02-01 14:31:10 UTC (rev 21109)
+++ branches/SAMBA_3_0/source/include/includes.h	2007-02-01 15:10:13 UTC (rev 21110)
@@ -1176,6 +1176,8 @@
 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 */
 
 

Modified: branches/SAMBA_3_0/source/libads/kerberos.c
===================================================================
--- branches/SAMBA_3_0/source/libads/kerberos.c	2007-02-01 14:31:10 UTC (rev 21109)
+++ branches/SAMBA_3_0/source/libads/kerberos.c	2007-02-01 15:10:13 UTC (rev 21110)
@@ -75,7 +75,7 @@
 	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 @@
 	}
 	
 	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);
-	
+	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
 	if (request_pac) {
-#ifdef HAVE_KRB5_GET_INIT_CREDS_OPT_SET_PAC_REQUEST
-		code = krb5_get_init_creds_opt_set_pac_request(ctx, &opt, True);
+		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
-	}
-
 	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;

Modified: branches/SAMBA_3_0/source/libsmb/clikrb5.c
===================================================================
--- branches/SAMBA_3_0/source/libsmb/clikrb5.c	2007-02-01 14:31:10 UTC (rev 21109)
+++ branches/SAMBA_3_0/source/libsmb/clikrb5.c	2007-02-01 15:10:13 UTC (rev 21110)
@@ -1379,6 +1379,32 @@
 	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, 

Modified: branches/SAMBA_3_0_24/source/configure.in
===================================================================
--- branches/SAMBA_3_0_24/source/configure.in	2007-02-01 14:31:10 UTC (rev 21109)
+++ branches/SAMBA_3_0_24/source/configure.in	2007-02-01 15:10:13 UTC (rev 21110)
@@ -3480,6 +3480,8 @@
   AC_CHECK_FUNC_EXT(krb5_get_kdc_cred, $KRB5_LIBS)
   AC_CHECK_FUNC_EXT(krb5_free_error_contents, $KRB5_LIBS)
   AC_CHECK_FUNC_EXT(initialize_krb5_error_table, $KRB5_LIBS)
+  AC_CHECK_FUNC_EXT(krb5_get_init_creds_opt_alloc, $KRB5_LIBS)
+  AC_CHECK_FUNC_EXT(krb5_get_init_creds_opt_free, $KRB5_LIBS)
 
   LIBS="$KRB5_LIBS $LIBS"
 

Modified: branches/SAMBA_3_0_24/source/include/includes.h
===================================================================
--- branches/SAMBA_3_0_24/source/include/includes.h	2007-02-01 14:31:10 UTC (rev 21109)
+++ branches/SAMBA_3_0_24/source/include/includes.h	2007-02-01 15:10:13 UTC (rev 21110)
@@ -1176,6 +1176,8 @@
 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 */
 
 

Modified: branches/SAMBA_3_0_24/source/libads/kerberos.c
===================================================================
--- branches/SAMBA_3_0_24/source/libads/kerberos.c	2007-02-01 14:31:10 UTC (rev 21109)
+++ branches/SAMBA_3_0_24/source/libads/kerberos.c	2007-02-01 15:10:13 UTC (rev 21110)
@@ -75,7 +75,7 @@
 	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 @@
 	}
 	
 	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);
-	
+	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
 	if (request_pac) {
-#ifdef HAVE_KRB5_GET_INIT_CREDS_OPT_SET_PAC_REQUEST
-		code = krb5_get_init_creds_opt_set_pac_request(ctx, &opt, True);
+		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
-	}
-
 	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;

Modified: branches/SAMBA_3_0_24/source/libsmb/clikrb5.c
===================================================================
--- branches/SAMBA_3_0_24/source/libsmb/clikrb5.c	2007-02-01 14:31:10 UTC (rev 21109)
+++ branches/SAMBA_3_0_24/source/libsmb/clikrb5.c	2007-02-01 15:10:13 UTC (rev 21110)
@@ -1379,6 +1379,32 @@
 	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, 



More information about the samba-cvs mailing list