Mercurial > dovecot > original-hg > dovecot-1.2
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