changeset 2975:c59fd95ad3ee HEAD

Auth cache key was built wrong if any modifiers were used for %vars. Added var_get_key() function which skips over any modifiers and returns the actual key.
author Timo Sirainen <tss@iki.fi>
date Wed, 15 Dec 2004 21:31:06 +0200
parents 8ef9f3d640e0
children 96a4ab34c8f1
files src/auth/auth-cache.c src/lib/var-expand.c src/lib/var-expand.h
diffstat 3 files changed, 33 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/auth/auth-cache.c	Wed Dec 15 21:24:11 2004 +0200
+++ b/src/auth/auth-cache.c	Wed Dec 15 21:31:06 2004 +0200
@@ -31,6 +31,7 @@
 {
 	string_t *str;
 	char key_seen[256];
+	uint8_t key;
 
 	memset(key_seen, 0, sizeof(key_seen));
 
@@ -38,14 +39,15 @@
 	for (; *query != '\0'; query++) {
 		if (*query == '%' && query[1] != '\0') {
 			query++;
-			if (*query != '%' && !key_seen[(uint8_t)*query]) {
+                        key = var_get_key(query);
+			if (key != '\0' && key != '%' && !key_seen[key]) {
 				if (str_len(str) != 0)
 					str_append_c(str, '\t');
 				str_append_c(str, '%');
-				str_append_c(str, *query);
+				str_append_c(str, key);
 
 				/* @UNSAFE */
-                                key_seen[(uint8_t)*query] = 1;
+                                key_seen[key] = 1;
 			}
 		}
 	}
--- a/src/lib/var-expand.c	Wed Dec 15 21:24:11 2004 +0200
+++ b/src/lib/var-expand.c	Wed Dec 15 21:31:06 2004 +0200
@@ -90,3 +90,27 @@
 		}
 	}
 }
+
+char var_get_key(const char *str)
+{
+	const struct var_expand_modifier *m;
+
+	/* [<offset>.]<width>[<modifier>]<variable> */
+	while (*str >= '0' && *str <= '9')
+		str++;
+
+	if (*str == '.') {
+		str++;
+		while (*str >= '0' && *str <= '9')
+			str++;
+	}
+
+	for (m = modifiers; m->key != '\0'; m++) {
+		if (m->key == *str) {
+			str++;
+			break;
+		}
+	}
+
+	return *str;
+}
--- a/src/lib/var-expand.h	Wed Dec 15 21:24:11 2004 +0200
+++ b/src/lib/var-expand.h	Wed Dec 15 21:31:06 2004 +0200
@@ -11,4 +11,8 @@
 void var_expand(string_t *dest, const char *str,
 		const struct var_expand_table *table);
 
+/* Returns the actual key character for given string, ie. skip any modifiers
+   that are before it. The string should be the data after the '%' character. */
+char var_get_key(const char *str);
+
 #endif