# HG changeset patch # User Timo Sirainen # Date 1103139066 -7200 # Node ID c59fd95ad3ee6fead4129a880fa2223609b8f188 # Parent 8ef9f3d640e0a4a0cdaeae9ef09a17402ab2a606 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. diff -r 8ef9f3d640e0 -r c59fd95ad3ee src/auth/auth-cache.c --- 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; } } } diff -r 8ef9f3d640e0 -r c59fd95ad3ee src/lib/var-expand.c --- 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; + + /* [.][] */ + 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; +} diff -r 8ef9f3d640e0 -r c59fd95ad3ee src/lib/var-expand.h --- 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