diff options
-rw-r--r-- | source3/configure.in | 20 | ||||
-rw-r--r-- | source3/include/includes.h | 7 | ||||
-rw-r--r-- | source3/libads/kerberos.c | 4 | ||||
-rw-r--r-- | source3/libsmb/clikrb5.c | 29 |
4 files changed, 50 insertions, 10 deletions
diff --git a/source3/configure.in b/source3/configure.in index 3e407cf5dc..6a380a1cde 100644 --- a/source3/configure.in +++ b/source3/configure.in @@ -3549,6 +3549,26 @@ if test x"$with_ads_support" != x"no"; then [Whether the krb5_ticket structure contains the kvno and enctype]) fi + AC_CACHE_CHECK(whether krb5_get_init_creds_opt_free takes a context argument, + smb_krb5_creds_opt_free_context, + [ + AC_TRY_COMPILE([ + #include <krb5.h>], + [ + krb5_context ctx; + krb5_get_init_creds_opt *opt = NULL; + krb5_get_init_creds_opt_free(ctx, opt); + ], + [smb_krb5_creds_opt_free_context=yes], + [smb_krb5_creds_opt_free_context=no] + ) + ]) + + if test x"$smb_krb5_creds_opt_free_context" = x"yes" ; then + AC_DEFINE(KRB5_CREDS_OPT_FREE_REQUIRES_CONTEXT, 1, + [Whether krb5_get_init_creds_opt_free takes a context argument]) + fi + AC_CACHE_CHECK(whether krb5_verify_checksum takes 7 arguments, smb_krb5_verify_checksum, [ AC_TRY_COMPILE([ #include <krb5.h>], diff --git a/source3/include/includes.h b/source3/include/includes.h index 3864faddb9..c71acd3866 100644 --- a/source3/include/includes.h +++ b/source3/include/includes.h @@ -1176,8 +1176,11 @@ 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); + +void smb_krb5_get_init_creds_opt_free(krb5_context context, + krb5_get_init_creds_opt *opt); +krb5_error_code smb_krb5_get_init_creds_opt_alloc(krb5_context context, + krb5_get_init_creds_opt **opt); #endif /* HAVE_KRB5 */ diff --git a/source3/libads/kerberos.c b/source3/libads/kerberos.c index 8e8297b07e..1c0e85dd55 100644 --- a/source3/libads/kerberos.c +++ b/source3/libads/kerberos.c @@ -140,7 +140,7 @@ int kerberos_kinit_password_ext(const char *principal, if ((code = krb5_get_init_creds_password(ctx, &my_creds, me, CONST_DISCARD(char *,password), kerb_prompter, NULL, 0, NULL, opt))) { - krb5_get_init_creds_opt_free(opt); + smb_krb5_get_init_creds_opt_free(ctx, opt); smb_krb5_free_addresses(ctx, addr); krb5_cc_close(ctx, cc); krb5_free_principal(ctx, me); @@ -148,7 +148,7 @@ int kerberos_kinit_password_ext(const char *principal, return code; } - krb5_get_init_creds_opt_free(opt); + smb_krb5_get_init_creds_opt_free(ctx, opt); if ((code = krb5_cc_initialize(ctx, cc, me))) { smb_krb5_free_addresses(ctx, addr); diff --git a/source3/libsmb/clikrb5.c b/source3/libsmb/clikrb5.c index f06a19b345..43dfddda47 100644 --- a/source3/libsmb/clikrb5.c +++ b/source3/libsmb/clikrb5.c @@ -1389,9 +1389,14 @@ 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_error_code smb_krb5_get_init_creds_opt_alloc(krb5_context context, + krb5_get_init_creds_opt **opt) { +#ifdef HAVE_KRB5_GET_INIT_CREDS_OPT_ALLOC + /* Heimdal or modern MIT version */ + return krb5_get_init_creds_opt_alloc(context, opt); +#else + /* Historical MIT version */ krb5_get_init_creds_opt *my_opt; *opt = NULL; @@ -1404,16 +1409,28 @@ done: *opt = my_opt; return 0; +#endif /* HAVE_KRB5_GET_INIT_CREDS_OPT_ALLOC */ } -#endif -#ifndef HAVE_KRB5_GET_INIT_CREDS_OPT_FREE - void krb5_get_init_creds_opt_free(krb5_get_init_creds_opt *opt) + void smb_krb5_get_init_creds_opt_free(krb5_context context, + krb5_get_init_creds_opt *opt) { +#ifdef HAVE_KRB5_GET_INIT_CREDS_OPT_FREE + +#ifdef KRB5_CREDS_OPT_FREE_REQUIRES_CONTEXT + /* Modern MIT version */ + krb5_get_init_creds_opt_free(context, opt); +#else + /* Heimdal version */ + krb5_get_init_creds_opt_free(opt); +#endif + +#else /* HAVE_KRB5_GET_INIT_CREDS_OPT_FREE */ + /* Historical MIT version */ SAFE_FREE(opt); opt = NULL; +#endif /* HAVE_KRB5_GET_INIT_CREDS_OPT_FREE */ } -#endif #else /* HAVE_KRB5 */ /* this saves a few linking headaches */ |