poke hole into the underlaying mach code, allow NULL krb5_context

This commit is contained in:
Love Hornquist Astrand
2009-11-22 12:33:53 -08:00
parent 46e0941e7d
commit 7aba6f94bd

View File

@@ -3,6 +3,8 @@
* (Royal Institute of Technology, Stockholm, Sweden). * (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved. * All rights reserved.
* *
* Portions Copyright (c) 2009 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
@@ -37,8 +39,13 @@
#include <dlfcn.h> #include <dlfcn.h>
#endif #endif
#ifndef KCM_IS_API_CACHE
static HEIMDAL_MUTEX acc_mutex = HEIMDAL_MUTEX_INITIALIZER; static HEIMDAL_MUTEX acc_mutex = HEIMDAL_MUTEX_INITIALIZER;
static cc_initialize_func init_func; static cc_initialize_func init_func;
static void (*set_target_uid)(uid_t);
static void (*clear_target)(void);
#ifdef HAVE_DLOPEN #ifdef HAVE_DLOPEN
static void *cc_handle; static void *cc_handle;
#endif #endif
@@ -82,18 +89,20 @@ translate_cc_error(krb5_context context, cc_int32 error)
static krb5_error_code static krb5_error_code
init_ccapi(krb5_context context) init_ccapi(krb5_context context)
{ {
const char *lib; const char *lib = NULL;
HEIMDAL_MUTEX_lock(&acc_mutex); HEIMDAL_MUTEX_lock(&acc_mutex);
if (init_func) { if (init_func) {
HEIMDAL_MUTEX_unlock(&acc_mutex); HEIMDAL_MUTEX_unlock(&acc_mutex);
krb5_clear_error_message(context); if (context)
krb5_clear_error_message(context);
return 0; return 0;
} }
lib = krb5_config_get_string(context, NULL, if (context)
"libdefaults", "ccapi_library", lib = krb5_config_get_string(context, NULL,
NULL); "libdefaults", "ccapi_library",
NULL);
if (lib == NULL) { if (lib == NULL) {
#ifdef __APPLE__ #ifdef __APPLE__
lib = "/System/Library/Frameworks/Kerberos.framework/Kerberos"; lib = "/System/Library/Frameworks/Kerberos.framework/Kerberos";
@@ -106,23 +115,30 @@ init_ccapi(krb5_context context)
#ifndef RTLD_LAZY #ifndef RTLD_LAZY
#define RTLD_LAZY 0 #define RTLD_LAZY 0
#endif
#ifndef RTLD_LOCAL
#define RTLD_LOCAL 0
#endif #endif
cc_handle = dlopen(lib, RTLD_LAZY); cc_handle = dlopen(lib, RTLD_LAZY|RTLD_LOCAL);
if (cc_handle == NULL) { if (cc_handle == NULL) {
HEIMDAL_MUTEX_unlock(&acc_mutex); HEIMDAL_MUTEX_unlock(&acc_mutex);
krb5_set_error_message(context, KRB5_CC_NOSUPP, if (context)
N_("Failed to load API cache module %s", "file"), krb5_set_error_message(context, KRB5_CC_NOSUPP,
lib); N_("Failed to load API cache module %s", "file"),
lib);
return KRB5_CC_NOSUPP; return KRB5_CC_NOSUPP;
} }
init_func = (cc_initialize_func)dlsym(cc_handle, "cc_initialize"); init_func = (cc_initialize_func)dlsym(cc_handle, "cc_initialize");
set_target_uid = dlsym(cc_handle, "krb5_ipc_client_set_target_uid");
clear_target = dlsym(cc_handle, "krb5_ipc_client_clear_target");
HEIMDAL_MUTEX_unlock(&acc_mutex); HEIMDAL_MUTEX_unlock(&acc_mutex);
if (init_func == NULL) { if (init_func == NULL) {
krb5_set_error_message(context, KRB5_CC_NOSUPP, if (context)
N_("Failed to find cc_initialize" krb5_set_error_message(context, KRB5_CC_NOSUPP,
"in %s: %s", "file, error"), lib, dlerror()); N_("Failed to find cc_initialize"
"in %s: %s", "file, error"), lib, dlerror());
dlclose(cc_handle); dlclose(cc_handle);
return KRB5_CC_NOSUPP; return KRB5_CC_NOSUPP;
} }
@@ -130,12 +146,27 @@ init_ccapi(krb5_context context)
return 0; return 0;
#else #else
HEIMDAL_MUTEX_unlock(&acc_mutex); HEIMDAL_MUTEX_unlock(&acc_mutex);
krb5_set_error_message(context, KRB5_CC_NOSUPP, if (context)
N_("no support for shared object", "")); krb5_set_error_message(context, KRB5_CC_NOSUPP,
N_("no support for shared object", ""));
return KRB5_CC_NOSUPP; return KRB5_CC_NOSUPP;
#endif #endif
} }
void
_heim_krb5_ipc_client_set_target_uid(uid_t uid)
{
init_ccapi(NULL);
(*set_target_uid)(uid);
}
void
_heim_krb5_ipc_client_clear_target(void)
{
init_ccapi(NULL);
(*clear_target)();
}
static krb5_error_code static krb5_error_code
make_cred_from_ccred(krb5_context context, make_cred_from_ccred(krb5_context context,
const cc_credentials_v5_t *incred, const cc_credentials_v5_t *incred,
@@ -1068,3 +1099,5 @@ KRB5_LIB_VARIABLE const krb5_cc_ops krb5_acc_ops = {
acc_set_default, acc_set_default,
acc_lastchange acc_lastchange
}; };
#endif