Blame SOURCES/autofs-5.0.9-amd-lookup-fix-old-conf-handling.patch

4d476f
autofs-5.0.9 - amd lookup fix old conf handling
4d476f
4d476f
From: Ian Kent <ikent@redhat.com>
4d476f
4d476f
When the configuration changed to using lower case option names
4d476f
old configuration files with upper case names stopped working.
4d476f
4d476f
This is because, for configuration option lookup the hash of
4d476f
the option string always needs to be the same case, which was
4d476f
overlooked at the time.
4d476f
4d476f
Also fix a couple of other things, possible incorect return
4d476f
from conf_update() what adding a new entry and change to using
4d476f
isblank() instead of checking for a space only.
4d476f
---
4d476f
 lib/defaults.c |   27 +++++++++++++++++++++------
4d476f
 1 file changed, 21 insertions(+), 6 deletions(-)
4d476f
4d476f
diff --git a/lib/defaults.c b/lib/defaults.c
4d476f
index 3fa2216..7043dfc 100644
4d476f
--- a/lib/defaults.c
4d476f
+++ b/lib/defaults.c
4d476f
@@ -43,6 +43,7 @@
4d476f
 #define OLD_CONFIG_FILE			AUTOFS_CONF_DIR "/autofs"
4d476f
 #define MAX_LINE_LEN			256
4d476f
 #define MAX_SECTION_NAME		MAX_LINE_LEN
4d476f
+#define MAX_CFG_NAME_LEN		31
4d476f
 
4d476f
 #define NAME_MASTER_MAP			"master_map_name"
4d476f
 
4d476f
@@ -661,7 +662,7 @@ static int conf_update(const char *section,
4d476f
 	ret = CFG_FAIL;
4d476f
 	co = conf_lookup(section, key);
4d476f
 	if (!co)
4d476f
-		ret = conf_add(section, key, value, flags);
4d476f
+		return conf_add(section, key, value, flags);
4d476f
 	else {
4d476f
 		char *val = NULL, *tmp = NULL;
4d476f
 		/* Environment overrides file value */
4d476f
@@ -691,15 +692,29 @@ error:
4d476f
 	return ret;
4d476f
 }
4d476f
 
4d476f
+static u_int32_t get_hash(const char *key, unsigned int size)
4d476f
+{
4d476f
+	const char *pkey = key;
4d476f
+	char lkey[MAX_CFG_NAME_LEN];
4d476f
+	char *plkey = &lkey[0];
4d476f
+
4d476f
+	while (*pkey)
4d476f
+		*plkey++ = tolower(*pkey++);
4d476f
+	*plkey = '\0';
4d476f
+	return hash(lkey, size);
4d476f
+}
4d476f
+
4d476f
 static struct conf_option *conf_lookup(const char *section, const char *key)
4d476f
 {
4d476f
 	struct conf_option *co;
4d476f
+	u_int32_t key_hash;
4d476f
 	unsigned int size = CFG_TABLE_SIZE;
4d476f
 
4d476f
 	if (!key || !section)
4d476f
 		return NULL;
4d476f
 
4d476f
-	for (co = config->hash[hash(key, size)]; co != NULL; co = co->next) {
4d476f
+	key_hash = get_hash(key, size);
4d476f
+	for (co = config->hash[key_hash]; co != NULL; co = co->next) {
4d476f
 		if (strcasecmp(section, co->section))
4d476f
 			continue;
4d476f
 		if (!strcasecmp(key, co->name))
4d476f
@@ -772,7 +787,7 @@ static int parse_line(char *line, char **sec, char **res, char **value)
4d476f
 	if (*key == '#' || (*key != '[' && !isalpha(*key)))
4d476f
 		return 0;
4d476f
 
4d476f
-	while (*key && *key == ' ')
4d476f
+	while (*key && isblank(*key))
4d476f
 		key++;
4d476f
 
4d476f
 	if (!*key)
4d476f
@@ -780,13 +795,13 @@ static int parse_line(char *line, char **sec, char **res, char **value)
4d476f
 
4d476f
 	if (*key == '[') {
4d476f
 		char *tmp;
4d476f
-		while (*key && (*key == '[' || *key == ' '))
4d476f
+		while (*key && (*key == '[' || isblank(*key)))
4d476f
 			key++;
4d476f
 		tmp = strchr(key, ']');
4d476f
 		if (!tmp)
4d476f
 			return 0;
4d476f
 		*tmp = ' ';
4d476f
-		while (*tmp && *tmp == ' ') {
4d476f
+		while (*tmp && isblank(*tmp)) {
4d476f
 			*tmp = '\0';
4d476f
 			tmp--;
4d476f
 		}
4d476f
@@ -803,7 +818,7 @@ static int parse_line(char *line, char **sec, char **res, char **value)
4d476f
 
4d476f
 	*val++ = '\0';
4d476f
 
4d476f
-	while (*(--tmp) == ' ')
4d476f
+	while (isblank(*(--tmp)))
4d476f
 		*tmp = '\0';
4d476f
 
4d476f
 	while (*val && (*val == '"' || isblank(*val)))