summaryrefslogtreecommitdiffstats
path: root/krb5-master-mechd.patch
diff options
context:
space:
mode:
Diffstat (limited to 'krb5-master-mechd.patch')
-rw-r--r--krb5-master-mechd.patch313
1 files changed, 313 insertions, 0 deletions
diff --git a/krb5-master-mechd.patch b/krb5-master-mechd.patch
new file mode 100644
index 0000000..8982fdd
--- /dev/null
+++ b/krb5-master-mechd.patch
@@ -0,0 +1,313 @@
+commit 123c14fd8862ee8f11f6084d25958cb380655f35
+Author: Günther Deschner <gdeschner@redhat.com>
+Date: Wed Mar 5 16:21:55 2014 +0100
+
+ Remove dead code from the mechglue initialization
+
+ The stat check in gss_indicate_mechs had no consequent and would have
+ been redundant with logic in updateMechList if it did.
+
+ [ghudson@mit.edu: elaborated commit message; removed unused
+ g_mechSetTime and now-irrelevant comment]
+
+diff --git a/src/lib/gssapi/mechglue/g_initialize.c b/src/lib/gssapi/mechglue/g_initialize.c
+index 48a825e..c6904e0 100644
+--- a/src/lib/gssapi/mechglue/g_initialize.c
++++ b/src/lib/gssapi/mechglue/g_initialize.c
+@@ -91,7 +91,6 @@ static gss_mech_info g_mechListTail = NULL;
+ static k5_mutex_t g_mechListLock = K5_MUTEX_PARTIAL_INITIALIZER;
+ static time_t g_confFileModTime = (time_t)0;
+
+-static time_t g_mechSetTime = (time_t)0;
+ static gss_OID_set_desc g_mechSet = { 0, NULL };
+ static k5_mutex_t g_mechSetLock = K5_MUTEX_PARTIAL_INITIALIZER;
+
+@@ -213,8 +212,6 @@ gss_indicate_mechs(minorStatus, mechSet_out)
+ OM_uint32 *minorStatus;
+ gss_OID_set *mechSet_out;
+ {
+- char *fileName;
+- struct stat fileInfo;
+ OM_uint32 status;
+
+ /* Initialize outputs. */
+@@ -233,16 +230,6 @@ gss_OID_set *mechSet_out;
+ if (*minorStatus != 0)
+ return (GSS_S_FAILURE);
+
+- fileName = MECH_CONF;
+-
+- /*
+- * If we have already computed the mechanisms supported and if it
+- * is still valid; make a copy and return to caller,
+- * otherwise build it first.
+- */
+- if ((stat(fileName, &fileInfo) == 0 &&
+- fileInfo.st_mtime > g_mechSetTime)) {
+- } /* if g_mechSet is out of date or not initialized */
+ if (build_mechSet())
+ return GSS_S_FAILURE;
+
+@@ -289,20 +276,6 @@ build_mechSet(void)
+ */
+ k5_mutex_lock(&g_mechListLock);
+
+-#if 0
+- /*
+- * this checks for the case when we need to re-construct the
+- * g_mechSet structure, but the mechanism list is upto date
+- * (because it has been read by someone calling
+- * gssint_get_mechanism)
+- */
+- if (fileInfo.st_mtime > g_confFileModTime)
+- {
+- g_confFileModTime = fileInfo.st_mtime;
+- loadConfigFile(fileName);
+- }
+-#endif
+-
+ updateMechList();
+
+ /*
+
+commit 05cbef80d53f49d30a5d0563501226dc173734d4
+Author: Günther Deschner <gdeschner@redhat.com>
+Date: Wed Mar 5 15:25:43 2014 +0100
+
+ Load mechglue config files from /etc/gss/mech.d
+
+ In addition to loading /etc/gss/mech, glob for *.conf files in
+ /etc/gss/mech.d. Load only config files which have changed since the
+ highest mtime we saw in the previous scan. Scan at most once per
+ second to avoid excessive numbers of filesystem syscalls for busy
+ GSSAPI applications.
+
+ [ghudson@mit.edu: rewrote commit message; style changes; added
+ once-per-second throttle on glob/stat calls]
+
+ ticket: 7882 (new)
+
+diff --git a/src/lib/gssapi/mechglue/g_initialize.c b/src/lib/gssapi/mechglue/g_initialize.c
+index c6904e0..f0acf1a 100644
+--- a/src/lib/gssapi/mechglue/g_initialize.c
++++ b/src/lib/gssapi/mechglue/g_initialize.c
+@@ -41,6 +41,7 @@
+ #include <string.h>
+ #include <ctype.h>
+ #include <errno.h>
++#include <glob.h>
+
+ #define M_DEFAULT "default"
+
+@@ -58,6 +59,7 @@
+ #ifndef MECH_CONF
+ #define MECH_CONF "/etc/gss/mech"
+ #endif
++#define MECH_CONF_PATTERN MECH_CONF ".d/*.conf"
+
+ /* Local functions */
+ static void addConfigEntry(const char *oidStr, const char *oid,
+@@ -90,6 +92,7 @@ static gss_mech_info g_mechList = NULL;
+ static gss_mech_info g_mechListTail = NULL;
+ static k5_mutex_t g_mechListLock = K5_MUTEX_PARTIAL_INITIALIZER;
+ static time_t g_confFileModTime = (time_t)0;
++static time_t g_confLastCall = (time_t)0;
+
+ static gss_OID_set_desc g_mechSet = { 0, NULL };
+ static k5_mutex_t g_mechSetLock = K5_MUTEX_PARTIAL_INITIALIZER;
+@@ -383,6 +386,56 @@ const gss_OID oid;
+ return (modOptions);
+ } /* gssint_get_modOptions */
+
++/* Return the mtime of filename or its eventual symlink target (if it is a
++ * symlink), whichever is larger. Return (time_t)-1 if lstat or stat fails. */
++static time_t
++check_link_mtime(const char *filename, time_t *mtime_out)
++{
++ struct stat st1, st2;
++
++ if (lstat(filename, &st1) != 0)
++ return (time_t)-1;
++ if (!S_ISLNK(st1.st_mode))
++ return st1.st_mtime;
++ if (stat(filename, &st2) != 0)
++ return (time_t)-1;
++ return (st1.st_mtime > st2.st_mtime) ? st1.st_mtime : st2.st_mtime;
++}
++
++/* Try to load any config files which have changed since the last call. Config
++ * files are MECH_CONF and any files matching MECH_CONF_PATTERN. */
++static void
++loadConfigFiles()
++{
++ glob_t globbuf;
++ time_t highest_mtime = 0, mtime, now;
++ char **pathptr;
++
++ /* Don't glob and stat more than once per second. */
++ if (time(&now) == (time_t)-1 || now == g_confLastCall)
++ return;
++ g_confLastCall = now;
++
++ globbuf.gl_offs = 1;
++ if (glob(MECH_CONF_PATTERN, GLOB_DOOFFS, NULL, &globbuf) != 0)
++ return;
++ globbuf.gl_pathv[0] = MECH_CONF;
++
++ for (pathptr = globbuf.gl_pathv; *pathptr != NULL; pathptr++) {
++ mtime = check_link_mtime(*pathptr, &mtime);
++ if (mtime == (time_t)-1)
++ continue;
++ if (mtime > highest_mtime)
++ highest_mtime = mtime;
++ if (mtime > g_confFileModTime)
++ loadConfigFile(*pathptr);
++ }
++ g_confFileModTime = highest_mtime;
++
++ globbuf.gl_pathv[0] = NULL;
++ globfree(&globbuf);
++}
++
+ /*
+ * determines if the mechList needs to be updated from file
+ * and performs the update.
+@@ -401,17 +454,7 @@ updateMechList(void)
+ loadConfigFromRegistry(HKEY_CURRENT_USER, MECH_KEY);
+ loadConfigFromRegistry(HKEY_LOCAL_MACHINE, MECH_KEY);
+ #else /* _WIN32 */
+- char *fileName;
+- struct stat fileInfo;
+-
+- fileName = MECH_CONF;
+-
+- /* check if mechList needs updating */
+- if (stat(fileName, &fileInfo) != 0 ||
+- g_confFileModTime >= fileInfo.st_mtime)
+- return;
+- g_confFileModTime = fileInfo.st_mtime;
+- loadConfigFile(fileName);
++ loadConfigFiles();
+ #endif /* !_WIN32 */
+
+ /* Load any unloaded interposer mechanisms immediately, to make sure we
+
+commit ac98187641f6943ae571606c0b6a97f236f9b60c
+Author: Greg Hudson <ghudson@mit.edu>
+Date: Wed May 28 23:51:49 2014 -0400
+
+ Read /etc/gss/mech if no mech.d/*.conf found
+
+ Always read /etc/gss/mech, even if globbing /etc/gss/mech.d/*.conf
+ doesn't work. Doing this using GLOB_DOOFFS proved error-prone, so use
+ a simpler approach: factor out the per-pathname handling into a helper
+ function load_if_changed, call it with MECH_CONF before the glob, then
+ pass each glob result through the helper.
+
+ ticket: 7925
+
+diff --git a/src/lib/gssapi/mechglue/g_initialize.c b/src/lib/gssapi/mechglue/g_initialize.c
+index f0acf1a..8bce14c 100644
+--- a/src/lib/gssapi/mechglue/g_initialize.c
++++ b/src/lib/gssapi/mechglue/g_initialize.c
+@@ -402,38 +402,45 @@ check_link_mtime(const char *filename, time_t *mtime_out)
+ return (st1.st_mtime > st2.st_mtime) ? st1.st_mtime : st2.st_mtime;
+ }
+
++/* Load pathname if it is newer than last. Update *highest to the maximum of
++ * its current value and pathname's mod time. */
++static void
++load_if_changed(const char *pathname, time_t last, time_t *highest)
++{
++ time_t mtime;
++
++ mtime = check_link_mtime(pathname, &mtime);
++ if (mtime == (time_t)-1)
++ return;
++ if (mtime > *highest)
++ *highest = mtime;
++ if (mtime > last)
++ loadConfigFile(pathname);
++}
++
+ /* Try to load any config files which have changed since the last call. Config
+ * files are MECH_CONF and any files matching MECH_CONF_PATTERN. */
+ static void
+ loadConfigFiles()
+ {
+ glob_t globbuf;
+- time_t highest_mtime = 0, mtime, now;
+- char **pathptr;
++ time_t highest = 0, now;
++ char **path;
+
+ /* Don't glob and stat more than once per second. */
+ if (time(&now) == (time_t)-1 || now == g_confLastCall)
+ return;
+ g_confLastCall = now;
+
+- globbuf.gl_offs = 1;
+- if (glob(MECH_CONF_PATTERN, GLOB_DOOFFS, NULL, &globbuf) != 0)
+- return;
+- globbuf.gl_pathv[0] = MECH_CONF;
++ load_if_changed(MECH_CONF, g_confFileModTime, &highest);
+
+- for (pathptr = globbuf.gl_pathv; *pathptr != NULL; pathptr++) {
+- mtime = check_link_mtime(*pathptr, &mtime);
+- if (mtime == (time_t)-1)
+- continue;
+- if (mtime > highest_mtime)
+- highest_mtime = mtime;
+- if (mtime > g_confFileModTime)
+- loadConfigFile(*pathptr);
++ if (glob(MECH_CONF_PATTERN, 0, NULL, &globbuf) == 0) {
++ for (path = globbuf.gl_pathv; *path != NULL; path++)
++ load_if_changed(*path, g_confFileModTime, &highest);
++ globfree(&globbuf);
+ }
+- g_confFileModTime = highest_mtime;
+
+- globbuf.gl_pathv[0] = NULL;
+- globfree(&globbuf);
++ g_confFileModTime = highest;
+ }
+
+ /*
+
+commit 41d38531043b99e8daa334f2b6ddf376adf1e878
+Author: Sam Hartman <hartmans@debian.org>
+Date: Wed Jun 4 12:06:27 2014 -0400
+
+ Do not loop on add_cred_from and other new methods
+
+ Several new GSS-API methods were added but GSSAPI_ADD_METHOD was
+ called to add them rather than GSSAPI_ADD_METHOD_NOLOOP. This means
+ that the implementation from the GSS-API mechglue would be used if the
+ mechanism had no implementation. As a result, the mechglue will call
+ into itself exhausting the call stack in an endless loop when one of
+ these methods is called.
+
+ ticket: 7926
+ target_version: 1.12.2
+ tags: pullup
+
+diff --git a/src/lib/gssapi/mechglue/g_initialize.c b/src/lib/gssapi/mechglue/g_initialize.c
+index 8bce14c..b0eb40a 100644
+--- a/src/lib/gssapi/mechglue/g_initialize.c
++++ b/src/lib/gssapi/mechglue/g_initialize.c
+@@ -703,11 +703,11 @@ build_dynamicMech(void *dl, const gss_OID mech_type)
+ GSS_ADD_DYNAMIC_METHOD_NOLOOP(dl, mech, gss_inquire_mech_for_saslname);
+ /* RFC 5587 */
+ GSS_ADD_DYNAMIC_METHOD_NOLOOP(dl, mech, gss_inquire_attrs_for_mech);
+- GSS_ADD_DYNAMIC_METHOD(dl, mech, gss_acquire_cred_from);
+- GSS_ADD_DYNAMIC_METHOD(dl, mech, gss_store_cred_into);
++ GSS_ADD_DYNAMIC_METHOD_NOLOOP(dl, mech, gss_acquire_cred_from);
++ GSS_ADD_DYNAMIC_METHOD_NOLOOP(dl, mech, gss_store_cred_into);
+ GSS_ADD_DYNAMIC_METHOD(dl, mech, gssspi_acquire_cred_with_password);
+- GSS_ADD_DYNAMIC_METHOD(dl, mech, gss_export_cred);
+- GSS_ADD_DYNAMIC_METHOD(dl, mech, gss_import_cred);
++ GSS_ADD_DYNAMIC_METHOD_NOLOOP(dl, mech, gss_export_cred);
++ GSS_ADD_DYNAMIC_METHOD_NOLOOP(dl, mech, gss_import_cred);
+ GSS_ADD_DYNAMIC_METHOD(dl, mech, gssspi_import_sec_context_by_mech);
+ GSS_ADD_DYNAMIC_METHOD(dl, mech, gssspi_import_name_by_mech);
+ GSS_ADD_DYNAMIC_METHOD(dl, mech, gssspi_import_cred_by_mech);