From: Greg Hudson Date: Wed, 16 May 2018 18:02:20 +0000 (-0700) Subject: Make plugin auto-registration work on Windows X-Git-Tag: krb5-1.17-beta1~107 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bae5aae9a6e937e4eaa995e6a0d68b398199d841;p=thirdparty%2Fkrb5.git Make plugin auto-registration work on Windows Make plugin_base_dir subject to parameter expansion, and set its default to %{LIBDIR}\plugins on Windows (%{LIBDIR} expands to the directory where the krb5 DLL lives). For auto-registered modules, assume that we will build 32-bit and 64-bit DLLs and name them "modname32.dll" and "modname64.dll". In k5_plugin_register_dyn(), use k5_path_join() instead of assuming the path separator is "/". ticket: 8685 (new) --- diff --git a/doc/admin/conf_files/krb5_conf.rst b/doc/admin/conf_files/krb5_conf.rst index ce545492d2..3d44c56027 100644 --- a/doc/admin/conf_files/krb5_conf.rst +++ b/doc/admin/conf_files/krb5_conf.rst @@ -328,7 +328,8 @@ The libdefaults section may contain any of the following relations: **plugin_base_dir** If set, determines the base directory where krb5 plugins are located. The default value is the ``krb5/plugins`` subdirectory - of the krb5 library directory. + of the krb5 library directory. This relation is subject to + parameter expansion (see below) in release 1.17 and later. **preferred_preauth_types** This allows you to set the preferred preauthentication types which diff --git a/src/include/osconf.hin b/src/include/osconf.hin index 98a467454b..4b6f91b8f9 100644 --- a/src/include/osconf.hin +++ b/src/include/osconf.hin @@ -55,8 +55,19 @@ #endif #endif /* _WINDOWS */ +#ifdef _WIN32 +#define DEFAULT_PLUGIN_BASE_DIR "%{LIBDIR}\\plugins" +#else #define DEFAULT_PLUGIN_BASE_DIR "@LIBDIR/krb5/plugins" +#endif + +#if defined(_WIN64) +#define PLUGIN_EXT "64.dll" +#elif defined(_WIN32) +#define PLUGIN_EXT "32.dll" +#else #define PLUGIN_EXT "@DYNOBJEXT" +#endif #define KDC_DIR "@LOCALSTATEDIR/krb5kdc" #define KDC_RUN_DIR "@RUNSTATEDIR/krb5kdc" diff --git a/src/lib/krb5/krb/init_ctx.c b/src/lib/krb5/krb/init_ctx.c index 4246c5dd27..bd8ba2467b 100644 --- a/src/lib/krb5/krb/init_ctx.c +++ b/src/lib/krb5/krb/init_ctx.c @@ -145,6 +145,7 @@ krb5_init_context_profile(profile_t profile, krb5_flags flags, } seed_data; krb5_data seed; int tmp; + char *plugin_dir = NULL; /* Verify some assumptions. If the assumptions hold and the compiler is optimizing, this should result in no code being @@ -261,8 +262,9 @@ krb5_init_context_profile(profile_t profile, krb5_flags flags, retval = profile_get_string(ctx->profile, KRB5_CONF_LIBDEFAULTS, KRB5_CONF_PLUGIN_BASE_DIR, 0, - DEFAULT_PLUGIN_BASE_DIR, - &ctx->plugin_base_dir); + DEFAULT_PLUGIN_BASE_DIR, &plugin_dir); + if (!retval) + retval = k5_expand_path_tokens(ctx, plugin_dir, &ctx->plugin_base_dir); if (retval) { TRACE_PROFILE_ERR(ctx, KRB5_CONF_PLUGIN_BASE_DIR, KRB5_CONF_LIBDEFAULTS, retval); @@ -288,9 +290,10 @@ krb5_init_context_profile(profile_t profile, krb5_flags flags, (void)profile_get_string(ctx->profile, KRB5_CONF_LIBDEFAULTS, KRB5_CONF_ERR_FMT, NULL, NULL, &ctx->err_fmt); *context_out = ctx; - return 0; + ctx = NULL; cleanup: + profile_release_string(plugin_dir); krb5_free_context(ctx); return retval; } diff --git a/src/lib/krb5/krb/plugin.c b/src/lib/krb5/krb/plugin.c index 31aaf661d9..5761de0094 100644 --- a/src/lib/krb5/krb/plugin.c +++ b/src/lib/krb5/krb/plugin.c @@ -473,14 +473,18 @@ k5_plugin_register_dyn(krb5_context context, int interface_id, { krb5_error_code ret; struct plugin_interface *interface = get_interface(context, interface_id); - char *path; + char *fname, *path; /* Disallow registering plugins after load. */ if (interface == NULL || interface->configured) return EINVAL; - if (asprintf(&path, "%s/%s%s", modsubdir, modname, PLUGIN_EXT) < 0) + if (asprintf(&fname, "%s%s", modname, PLUGIN_EXT) < 0) return ENOMEM; + ret = k5_path_join(modsubdir, fname, &path); + free(fname); + if (ret) + return ret; ret = register_module(context, interface, modname, path, NULL); free(path); return ret;