Make preauth_module_dir override, rather than supplement, the
authorGreg Hudson <ghudson@mit.edu>
Thu, 7 Jan 2010 17:26:58 +0000 (17:26 +0000)
committerGreg Hudson <ghudson@mit.edu>
Thu, 7 Jan 2010 17:26:58 +0000 (17:26 +0000)
built-in path list, to avoid problems with running the same preauth
module twice.

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@23602 dc483132-0cff-0310-8789-dd5450dbe970

src/kdc/kdc_preauth.c
src/lib/krb5/krb/preauth2.c

index 18052cf4e1e979cafd00fef7170396224d0fc7e4..c5dfb1f9bd6f7c0abb765a1f7e2edf43f5583f7b 100644 (file)
@@ -391,45 +391,22 @@ static struct plugin_dir_handle preauth_plugins;
 
 /* Open plugin directories for preauth modules. */
 static krb5_error_code
-open_preauth_plugin_dirs(krb5_context kcontext)
+open_preauth_plugin_dirs(krb5_context ctx)
 {
     static const char *path[] = {
         KRB5_CONF_LIBDEFAULTS, KRB5_CONF_PREAUTH_MODULE_DIR, NULL,
     };
     char **profpath = NULL;
-    const char **plugindirs = NULL;
-    size_t nprofdirs, nobjdirs;
-    krb5_error_code retval;
-
-    /* Fetch the list of paths specified in the profile, if any. */
-    retval = profile_get_values(kcontext->profile, path, &profpath);
-    if (retval != 0 && retval != PROF_NO_RELATION)
-        return retval;
-
-    /* Count the number of profile dirs. */
-    nprofdirs = 0;
-    if (profpath) {
-        while (profpath[nprofdirs] != NULL)
-            nprofdirs++;
-    }
-
-    nobjdirs = sizeof(objdirs) / sizeof(*objdirs);
-    plugindirs = k5alloc((nprofdirs + nobjdirs) * sizeof(char *), &retval);
-    if (retval != 0)
-        goto cleanup;
-
-    /* Concatenate the profile and hardcoded directory lists. */
-    if (profpath)
-        memcpy(plugindirs, profpath, nprofdirs * sizeof(char *));
-    memcpy(plugindirs + nprofdirs, objdirs, nobjdirs * sizeof(char *));
-
-    retval = krb5int_open_plugin_dirs(plugindirs, NULL, &preauth_plugins,
-                                      &kcontext->err);
-
-cleanup:
+    const char **dirs;
+    krb5_error_code ret;
+
+    ret = profile_get_values(ctx->profile, path, &profpath);
+    if (ret != 0 && ret != PROF_NO_RELATION)
+        return ret;
+    dirs = (profpath != NULL) ? (const char **) profpath : objdirs;
+    ret = krb5int_open_plugin_dirs(dirs, NULL, &preauth_plugins, &ctx->err);
     profile_free_list(profpath);
-    free(plugindirs);
-    return retval;
+    return ret;
 }
 
 krb5_error_code
index d1d2827deacf2899b12d87ea9fd51d11e305b3ab..cf99a29b1dcdfec11e0c59854d9e0c0013dcdc3d 100644 (file)
@@ -72,46 +72,23 @@ typedef struct _pa_types_t {
 
 /* Open plugin directories for preauth modules. */
 static krb5_error_code
-open_preauth_plugin_dirs(krb5_context kcontext)
+open_preauth_plugin_dirs(krb5_context ctx)
 {
     static const char *path[] = {
         KRB5_CONF_LIBDEFAULTS, KRB5_CONF_PREAUTH_MODULE_DIR, NULL,
     };
     char **profpath = NULL;
-    const char **plugindirs = NULL;
-    size_t nprofdirs, nobjdirs;
-    krb5_error_code retval;
-
-    /* Fetch the list of paths specified in the profile, if any. */
-    retval = profile_get_values(kcontext->profile, path, &profpath);
-    if (retval != 0 && retval != PROF_NO_RELATION)
-        return retval;
-
-    /* Count the number of profile dirs. */
-    nprofdirs = 0;
-    if (profpath) {
-        while (profpath[nprofdirs] != NULL)
-            nprofdirs++;
-    }
-
-    nobjdirs = sizeof(objdirs) / sizeof(*objdirs);
-    plugindirs = k5alloc((nprofdirs + nobjdirs) * sizeof(char *), &retval);
-    if (retval != 0)
-        goto cleanup;
-
-    /* Concatenate the profile and hardcoded directory lists. */
-    if (profpath)
-        memcpy(plugindirs, profpath, nprofdirs * sizeof(char *));
-    memcpy(plugindirs + nprofdirs, objdirs, nobjdirs * sizeof(char *));
-
-    retval = krb5int_open_plugin_dirs(plugindirs, NULL,
-                                      &kcontext->preauth_plugins,
-                                      &kcontext->err);
+    const char **dirs;
+    krb5_error_code ret;
 
-cleanup:
+    ret = profile_get_values(ctx->profile, path, &profpath);
+    if (ret != 0 && ret != PROF_NO_RELATION)
+        return ret;
+    dirs = (profpath != NULL) ? (const char **) profpath : objdirs;
+    ret = krb5int_open_plugin_dirs(dirs, NULL, &ctx->preauth_plugins,
+                                   &ctx->err);
     profile_free_list(profpath);
-    free(plugindirs);
-    return retval;
+    return ret;
 }
 
 /* Create the per-krb5_context context. This means loading the modules