diff --git a/autofs-5.0.5-dont-connect-at-ldap-lookup-module-init.patch b/autofs-5.0.5-dont-connect-at-ldap-lookup-module-init.patch new file mode 100644 index 0000000..f2e9abf --- /dev/null +++ b/autofs-5.0.5-dont-connect-at-ldap-lookup-module-init.patch @@ -0,0 +1,196 @@ +autofs-5.0.5 - dont connect at ldap lookup module init + +From: Ian Kent + +When using LDAP as a map source and no server is available at +startup autofs will fiail to mount autofs mounts because it +cannot read the mount maps. + +For the case were the master map is available (for example as +a file map) indirect autofs mounts should still be able to +continue but the LDAP lookup module unnecessarily tryes to +connect a an LDAP server and returns a fail if it can't +connect causing the autofs mount to not complete. + +If no server is available to obtain the mount information and +an entry for a requested mount has not been seen before then +mount requests will fail. But, if an entry has previously been +seen autofs will use that while the server is unavailable. + +If an autofs indirect mount uses the browse option and no +server is available at startup the map cannot be read so no +mount point directories will be created (and the mount will +behave as though the browse option was not present). A HUP +signal can be issued to make autofs read the map and create +the map mount point directores. Or the next access to a mount +point that isn't already in the cache but in the map on the +server will trigger a map re-read. +--- + + CHANGELOG | 1 + daemon/lookup.c | 7 ++++- + modules/lookup_ldap.c | 61 +++++++++++++++++--------------------------------- + 3 files changed, 28 insertions(+), 41 deletions(-) + + +--- autofs-5.0.5.orig/CHANGELOG ++++ autofs-5.0.5/CHANGELOG +@@ -17,6 +17,7 @@ + - dont fail mount on access fail. + - fix rpc fail on large export list. + - fix memory leak on reload. ++- dont connect at ldap lookup module init. + + 03/09/2009 autofs-5.0.5 + ----------------------- +--- autofs-5.0.5.orig/daemon/lookup.c ++++ autofs-5.0.5/daemon/lookup.c +@@ -292,8 +292,13 @@ static int do_read_map(struct autofs_poi + * For maps that don't support enumeration return success + * and do whatever we must to have autofs function with an + * empty map entry cache. ++ * ++ * For indirect maps that use the browse option, when the ++ * server is unavailable continue as best we can with ++ * whatever we have in the cache, if anything. + */ +- if (status == NSS_STATUS_UNKNOWN) ++ if (status == NSS_STATUS_UNKNOWN || ++ (ap->type == LKP_INDIRECT && status == NSS_STATUS_UNAVAIL)) + return NSS_STATUS_SUCCESS; + + return status; +--- autofs-5.0.5.orig/modules/lookup_ldap.c ++++ autofs-5.0.5/modules/lookup_ldap.c +@@ -724,8 +724,12 @@ static LDAP *do_reconnect(unsigned logop + uris_mutex_lock(ctxt); + if (ctxt->dclist) + uri = strdup(ctxt->dclist->uri); +- else ++ else if (ctxt->uri) + uri = strdup(ctxt->uri->uri); ++ else { ++ uris_mutex_unlock(ctxt); ++ goto find_server; ++ } + uris_mutex_unlock(ctxt); + + if (!uri) { +@@ -757,6 +761,7 @@ static LDAP *do_reconnect(unsigned logop + autofs_sasl_dispose(ctxt); + #endif + ++find_server: + /* Current server failed connect, try the rest */ + ldap = find_server(logopt, ctxt); + if (!ldap) +@@ -1342,7 +1347,6 @@ int lookup_init(const char *mapfmt, int + { + struct lookup_context *ctxt; + char buf[MAX_ERR_BUF]; +- LDAP *ldap = NULL; + int ret; + + *context = NULL; +@@ -1416,23 +1420,6 @@ int lookup_init(const char *mapfmt, int + } + #endif + +- if (ctxt->server || !ctxt->uris) { +- ldap = connect_to_server(LOGOPT_NONE, ctxt->server, ctxt); +- if (!ldap) { +- free_context(ctxt); +- return 1; +- } +- } else { +- ldap = find_server(LOGOPT_NONE, ctxt); +- if (!ldap) { +- free_context(ctxt); +- error(LOGOPT_ANY, MODPREFIX +- "failed to find available server"); +- return 1; +- } +- } +- unbind_ldap_connection(LOGOPT_ANY, ldap, ctxt); +- + /* Open the parser, if we can. */ + ctxt->parse = open_parse(mapfmt, MODPREFIX, argc - 1, argv + 1); + if (!ctxt->parse) { +@@ -1463,6 +1450,11 @@ int lookup_read_master(struct master *ma + int scope = LDAP_SCOPE_SUBTREE; + LDAP *ldap; + ++ /* Initialize the LDAP context. */ ++ ldap = do_reconnect(logopt, ctxt); ++ if (!ldap) ++ return NSS_STATUS_UNAVAIL; ++ + class = ctxt->schema->entry_class; + entry = ctxt->schema->entry_attr; + info = ctxt->schema->value_attr; +@@ -1486,13 +1478,6 @@ int lookup_read_master(struct master *ma + return NSS_STATUS_UNAVAIL; + } + +- /* Initialize the LDAP context. */ +- ldap = do_reconnect(logopt, ctxt); +- if (!ldap) { +- free(query); +- return NSS_STATUS_UNAVAIL; +- } +- + /* Look around. */ + debug(logopt, + MODPREFIX "searching for \"%s\" under \"%s\"", query, ctxt->qdn); +@@ -2264,6 +2249,11 @@ static int read_one_map(struct autofs_po + sp.ap = ap; + sp.age = age; + ++ /* Initialize the LDAP context. */ ++ sp.ldap = do_reconnect(ap->logopt, ctxt); ++ if (!sp.ldap) ++ return NSS_STATUS_UNAVAIL; ++ + class = ctxt->schema->entry_class; + entry = ctxt->schema->entry_attr; + info = ctxt->schema->value_attr; +@@ -2289,13 +2279,6 @@ static int read_one_map(struct autofs_po + return NSS_STATUS_UNAVAIL; + } + +- /* Initialize the LDAP context. */ +- sp.ldap = do_reconnect(ap->logopt, ctxt); +- if (!sp.ldap) { +- free(sp.query); +- return NSS_STATUS_UNAVAIL; +- } +- + /* Look around. */ + debug(ap->logopt, + MODPREFIX "searching for \"%s\" under \"%s\"", sp.query, ctxt->qdn); +@@ -2401,6 +2384,11 @@ static int lookup_one(struct autofs_poin + return CHE_FAIL; + } + ++ /* Initialize the LDAP context. */ ++ ldap = do_reconnect(ap->logopt, ctxt); ++ if (!ldap) ++ return CHE_UNAVAIL; ++ + class = ctxt->schema->entry_class; + entry = ctxt->schema->entry_attr; + info = ctxt->schema->value_attr; +@@ -2479,13 +2467,6 @@ static int lookup_one(struct autofs_poin + return CHE_FAIL; + } + +- /* Initialize the LDAP context. */ +- ldap = do_reconnect(ap->logopt, ctxt); +- if (!ldap) { +- free(query); +- return CHE_UNAVAIL; +- } +- + debug(ap->logopt, + MODPREFIX "searching for \"%s\" under \"%s\"", query, ctxt->qdn); + diff --git a/autofs-5.0.5-fix-disable-timeout.patch b/autofs-5.0.5-fix-disable-timeout.patch new file mode 100644 index 0000000..5b2d999 --- /dev/null +++ b/autofs-5.0.5-fix-disable-timeout.patch @@ -0,0 +1,35 @@ +autofs-5.0.5 - fix disable timeout + +From: Ian Kent + +Using a timeout of zero should disable expires but instead causes +the alarm handler to fire constant expires. +--- + + CHANGELOG | 1 + + lib/alarm.c | 3 +++ + 2 files changed, 4 insertions(+) + + +--- autofs-5.0.5.orig/CHANGELOG ++++ autofs-5.0.5/CHANGELOG +@@ -19,6 +19,7 @@ + - fix memory leak on reload. + - dont connect at ldap lookup module init. + - fix random selection option. ++- fix disable timeout. + + 03/09/2009 autofs-5.0.5 + ----------------------- +--- autofs-5.0.5.orig/lib/alarm.c ++++ autofs-5.0.5/lib/alarm.c +@@ -67,6 +67,9 @@ int alarm_add(struct autofs_point *ap, t + unsigned int empty = 1; + int status; + ++ if (!seconds) ++ return 1; ++ + new = malloc(sizeof(struct alarm)); + if (!new) + return 0; diff --git a/autofs-5.0.5-fix-random-selection-option.patch b/autofs-5.0.5-fix-random-selection-option.patch new file mode 100644 index 0000000..7c98df1 --- /dev/null +++ b/autofs-5.0.5-fix-random-selection-option.patch @@ -0,0 +1,35 @@ +autofs-5.0.5 - fix random selection option + +From: Ian Kent + +When parsing the master map we fail to check if the random selection +option has been seen and set the random selection option unconditionally. +--- + + CHANGELOG | 1 + + lib/master_parse.y | 3 ++- + 2 files changed, 3 insertions(+), 1 deletion(-) + + +--- autofs-5.0.5.orig/CHANGELOG ++++ autofs-5.0.5/CHANGELOG +@@ -18,6 +18,7 @@ + - fix rpc fail on large export list. + - fix memory leak on reload. + - dont connect at ldap lookup module init. ++- fix random selection option. + + 03/09/2009 autofs-5.0.5 + ----------------------- +--- autofs-5.0.5.orig/lib/master_parse.y ++++ autofs-5.0.5/lib/master_parse.y +@@ -811,7 +811,8 @@ int master_parse_entry(const char *buffe + ops->timeout(ap->logopt, ap->ioctlfd, &tout); + } + } +- entry->ap->flags |= MOUNT_FLAG_RANDOM_SELECT; ++ if (random_selection) ++ entry->ap->flags |= MOUNT_FLAG_RANDOM_SELECT; + if (negative_timeout) + entry->ap->negative_timeout = negative_timeout; + diff --git a/autofs-5.0.5-fix-strdup-return-value-check.patch b/autofs-5.0.5-fix-strdup-return-value-check.patch new file mode 100644 index 0000000..9e91d7f --- /dev/null +++ b/autofs-5.0.5-fix-strdup-return-value-check.patch @@ -0,0 +1,38 @@ +autofs-5.0.5 - fix strdup() return value check + +From: Ian Kent + +Patch posted by Leonardo Chiquitto. + +Fix copy and paste error when checking strdup() return value, originally +reported by David Binderman in: + +http://bugzilla.novell.com/show_bug.cgi?id=523348 +--- + + CHANGELOG | 1 + + lib/defaults.c | 2 +- + 2 files changed, 2 insertions(+), 1 deletion(-) + + +--- autofs-5.0.5.orig/CHANGELOG ++++ autofs-5.0.5/CHANGELOG +@@ -20,6 +20,7 @@ + - dont connect at ldap lookup module init. + - fix random selection option. + - fix disable timeout. ++- fix strdup() return value check (Leonardo Chiquitto). + + 03/09/2009 autofs-5.0.5 + ----------------------- +--- autofs-5.0.5.orig/lib/defaults.c ++++ autofs-5.0.5/lib/defaults.c +@@ -65,7 +65,7 @@ static char *get_env_string(const char * + return NULL; + + res = strdup(val); +- if (!val) ++ if (!res) + return NULL; + + return res; diff --git a/autofs.spec b/autofs.spec index 60bbcb5..e7aa123 100644 --- a/autofs.spec +++ b/autofs.spec @@ -4,7 +4,7 @@ Summary: A tool for automatically mounting and unmounting filesystems Name: autofs Version: 5.0.5 -Release: 16%{?dist} +Release: 17%{?dist} Epoch: 1 License: GPLv2+ Group: System Environment/Daemons @@ -27,6 +27,10 @@ Patch14: autofs-5.0.5-check-for-path-mount-location-in-generic-module.patch Patch15: autofs-5.0.5-dont-fail-mount-on-access-fail.patch Patch16: autofs-5.0.5-fix-rpc-large-export-list.patch Patch17: autofs-5.0.5-fix-memory-leak-on-reload.patch +Patch18: autofs-5.0.5-dont-connect-at-ldap-lookup-module-init.patch +Patch19: autofs-5.0.5-fix-random-selection-option.patch +Patch20: autofs-5.0.5-fix-disable-timeout.patch +Patch21: autofs-5.0.5-fix-strdup-return-value-check.patch Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: autoconf, hesiod-devel, openldap-devel, bison, flex, libxml2-devel, cyrus-sasl-devel, openssl-devel module-init-tools util-linux nfs-utils e2fsprogs libtirpc-devel Requires: kernel >= 2.6.17 @@ -85,6 +89,10 @@ echo %{version}-%{release} > .version %patch15 -p1 %patch16 -p1 %patch17 -p1 +%patch18 -p1 +%patch19 -p1 +%patch20 -p1 +%patch21 -p1 %build #CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=/usr --libdir=%{_libdir} @@ -137,6 +145,12 @@ fi %{_libdir}/autofs/ %changelog +* Mon Feb 1 2010 Ian Kent - 1:5.0.5-17 +- dont connect at ldap lookup module init. +- fix random selection option. +- fix disable timeout. +- fix strdup() return value check. + * Tue Dec 8 2009 Ian Kent - 1:5.0.5-16 - fix memory leak on reload (bz545137).