krb5 commit: Make plugin auto-registration work on Windows

Greg Hudson ghudson at mit.edu
Tue Jun 12 15:17:24 EDT 2018


https://github.com/krb5/krb5/commit/bae5aae9a6e937e4eaa995e6a0d68b398199d841
commit bae5aae9a6e937e4eaa995e6a0d68b398199d841
Author: Greg Hudson <ghudson at mit.edu>
Date:   Wed May 16 11:02:20 2018 -0700

    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)

 doc/admin/conf_files/krb5_conf.rst |    3 ++-
 src/include/osconf.hin             |   11 +++++++++++
 src/lib/krb5/krb/init_ctx.c        |    9 ++++++---
 src/lib/krb5/krb/plugin.c          |    8 ++++++--
 4 files changed, 25 insertions(+), 6 deletions(-)

diff --git a/doc/admin/conf_files/krb5_conf.rst b/doc/admin/conf_files/krb5_conf.rst
index ce54549..3d44c56 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 98a4674..4b6f91b 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 4246c5d..bd8ba24 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 31aaf66..5761de0 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;


More information about the cvs-krb5 mailing list