From e676fc4cda48abf2898bfc57548c5fa386f1a9b5 Mon Sep 17 00:00:00 2001 From: Ian Kent Date: Aug 21 2007 03:37:01 +0000 Subject: - don't fail on empty master map. - add support for the "%" hack for case insensitive attribute schemas. --- diff --git a/autofs-5.0.2-dont-fail-on-empty-master.patch b/autofs-5.0.2-dont-fail-on-empty-master.patch new file mode 100644 index 0000000..1919f6c --- /dev/null +++ b/autofs-5.0.2-dont-fail-on-empty-master.patch @@ -0,0 +1,13 @@ +diff --git a/lib/master.c b/lib/master.c +index 4d31959..9f24f7e 100644 +--- a/lib/master.c ++++ b/lib/master.c +@@ -803,7 +803,7 @@ int master_read_master(struct master *master, time_t age, int readall) + if (list_empty(&master->mounts)) { + master_mutex_unlock(); + error(LOGOPT_ANY, "no mounts in table"); +- return 0; ++ return 1; + } + + master_mutex_unlock(); diff --git a/autofs-5.0.2-ldap-percent-hack.patch b/autofs-5.0.2-ldap-percent-hack.patch new file mode 100644 index 0000000..e297d13 --- /dev/null +++ b/autofs-5.0.2-ldap-percent-hack.patch @@ -0,0 +1,178 @@ +diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c +index de8d515..a412797 100644 +--- a/modules/lookup_ldap.c ++++ b/modules/lookup_ldap.c +@@ -1210,50 +1210,68 @@ static int read_one_map(struct autofs_point *ap, + } + + /* +- * By definition keys must be unique within +- * each map entry ++ * By definition keys should be unique within each map entry, ++ * but as always there are exceptions. + */ + k_val = NULL; + k_len = 0; + + /* +- * Keys must be unique so, in general, there shouldn't be ++ * Keys should be unique so, in general, there shouldn't be + * more than one attribute value. We make an exception for + * wildcard entries as people may have values for '*' or + * '/' for compaibility reasons. We use the '/' as the + * wildcard in LDAP but allow '*' as well to allow for + * people using older schemas that allow '*' as a key +- * value. ++ * value. Another case where there can be multiple key ++ * values is when people have used the "%" hack to specify ++ * case matching ctriteria in a caase insensitive attribute. + */ + count = ldap_count_values_len(bvKey); +- if (count > 2) { +- error(ap->logopt, +- MODPREFIX +- "key %.*s has duplicate entries - ignoring", +- bvKey[0]->bv_len, bvKey[0]->bv_val); +- goto next; +- } else if (count == 2) { ++ if (count > 1) { + unsigned int i; + + /* Check for the "/" and "*" and use as "/" if found */ + for (i = 0; i < count; i++) { +- /* check for wildcard */ +- if (bvKey[i]->bv_len != 1) ++ bvKey[i]->bv_val[bvKey[i]->bv_len] = '\0'; ++ ++ /* ++ * If multiple entries are present they could ++ * be the result of people using the "%" hack so ++ * ignore them. ++ */ ++ if (strchr(bvKey[i]->bv_val, '%')) + continue; +- if (*bvKey[i]->bv_val != '/' && +- *bvKey[i]->bv_val != '*') +- continue; +- /* always use '/' internally */ +- *bvKey[i]->bv_val = '/'; ++ ++ /* check for wildcard */ ++ if (bvKey[i]->bv_len == 1 && ++ (*bvKey[i]->bv_val == '/' || ++ *bvKey[i]->bv_val == '*')) { ++ /* always use '/' internally */ ++ *bvKey[i]->bv_val = '/'; ++ k_val = bvKey[i]->bv_val; ++ k_len = 1; ++ break; ++ } ++ ++ /* ++ * We have a result from LDAP so this is a ++ * valid entry. Set the result to the LDAP ++ * key that isn't a wildcard and doesn't have ++ * any "%" hack values present. This should be ++ * the case insensitive match string for the ++ * nis schema, the default value. ++ */ + k_val = bvKey[i]->bv_val; +- k_len = 1; ++ k_len = bvKey[i]->bv_len; ++ + break; + } + + if (!k_val) { + error(ap->logopt, + MODPREFIX +- "key %.*s has duplicate entries - ignoring", ++ "invalid entry %.*s - ignoring", + bvKey[0]->bv_len, bvKey[0]->bv_val); + goto next; + } +@@ -1495,7 +1513,10 @@ static int lookup_one(struct autofs_point *ap, + continue; + } + +- /* By definition keys must be unique within each map entry */ ++ /* ++ * By definition keys should be unique within each map entry, ++ * but as always there are exceptions. ++ */ + k_val = NULL; + k_len = 0; + +@@ -1506,37 +1527,53 @@ static int lookup_one(struct autofs_point *ap, + * '/' for compaibility reasons. We use the '/' as the + * wildcard in LDAP but allow '*' as well to allow for + * people using older schemas that allow '*' as a key +- * value. ++ * value. Another case where there can be multiple key ++ * values is when people have used the "%" hack to specify ++ * case matching ctriteria in a caase insensitive attribute. + */ + count = ldap_count_values_len(bvKey); +- if (count > 2) { +- error(ap->logopt, +- MODPREFIX +- "key %.*s has duplicate entries - ignoring", +- bvKey[0]->bv_len, bvKey[0]->bv_val); +- goto next; +- } else if (count == 2) { ++ if (count > 1) { + unsigned int i; + + /* Check for the "/" and "*" and use as "/" if found */ + for (i = 0; i < count; i++) { +- /* check for wildcard */ +- if (bvKey[i]->bv_len != 1) +- continue; +- if (*bvKey[i]->bv_val != '/' && +- *bvKey[i]->bv_val != '*') ++ bvKey[i]->bv_val[bvKey[i]->bv_len] = '\0'; ++ ++ /* ++ * If multiple entries are present they could ++ * be the result of people using the "%" hack so ++ * ignore them. ++ */ ++ if (strchr(bvKey[i]->bv_val, '%')) + continue; +- /* always use '/' internally */ +- *bvKey[i]->bv_val = '/'; +- k_val = bvKey[i]->bv_val; +- k_len = 1; ++ ++ /* check for wildcard */ ++ if (bvKey[i]->bv_len == 1 && ++ (*bvKey[i]->bv_val == '/' || ++ *bvKey[i]->bv_val == '*')) { ++ /* always use '/' internally */ ++ *bvKey[i]->bv_val = '/'; ++ k_val = bvKey[i]->bv_val; ++ k_len = 1; ++ break; ++ } ++ ++ /* ++ * The key was matched by LDAP so this is a ++ * valid entry. Set the result key to the ++ * lookup key to provide the mixed case ++ * matching provided by the "%" hack. ++ */ ++ k_val = qKey; ++ k_len = strlen(qKey); ++ + break; + } + + if (!k_val) { + error(ap->logopt, +- MODPREFIX "key %.*s has duplicate entries", +- bvKey[0]->bv_len, bvKey[0]->bv_val); ++ MODPREFIX "no valid key found for %.*s", ++ qKey_len, qKey); + ret = CHE_FAIL; + goto next; + } diff --git a/autofs.spec b/autofs.spec index 060add8..85f5298 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.2 -Release: 10 +Release: 11 Epoch: 1 License: GPL Group: System Environment/Daemons @@ -22,6 +22,8 @@ Patch8: autofs-5.0.2-fix-dnattr-parse.patch Patch9: autofs-5.0.2-fix-nfs-version-in-get-supported-ver-and-cost.patch Patch10: autofs-5.0.2-fix-largefile-dumbness.patch Patch11: autofs-5.0.2-instance-stale-mark.patch +Patch12: autofs-5.0.2-dont-fail-on-empty-master.patch +Patch13: autofs-5.0.2-ldap-percent-hack.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 Conflicts: kernel < 2.6.17 @@ -75,6 +77,8 @@ echo %{version}-%{release} > .version %patch9 -p1 %patch10 -p1 %patch11 -p1 +%patch12 -p1 +%patch13 -p1 %build #CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=/usr --libdir=%{_libdir} @@ -127,6 +131,10 @@ fi %{_libdir}/autofs/ %changelog +* Mon Aug 21 2007 Ian Kent - 5.0.2-11 +- don't fail on empty master map. +- add support for the "%" hack for case insensitive attribute schemas. + * Mon Jul 30 2007 Ian Kent - 5.0.2-10 - mark map instances stale so they aren't "cleaned" during updates. - fix large file compile time option.