From 035da6d1b0c436b85add48bc22120aa814c9cab9 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Sun, 2 Jan 2011 19:31:23 +0100 Subject: [PATCH] [BUG] stick-table: correctly terminate string keys during lookups If a key to be looked up is extracted from data without being padded and if it matches the beginning of another stored key, it is not found in subsequent lookups because it does not end with a zero. This bug was discovered and diagnosed by David Cournapeau. --- src/stick_table.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/stick_table.c b/src/stick_table.c index 7c9ad8da0..40b2bff07 100644 --- a/src/stick_table.c +++ b/src/stick_table.c @@ -560,7 +560,13 @@ struct stktable_key *stktable_fetch_key(struct stktable *t, struct proxy *px, st if (!static_table_key.key) return NULL; - if ((static_table_key.key_len < t->key_size) && (t->type != STKTABLE_TYPE_STRING)) { + if (t->type == STKTABLE_TYPE_STRING) { + /* The string MUST be terminated by a '\0' after the key_len bytes */ + if (static_table_key.key_len > t->key_size - 1) + static_table_key.key_len = t->key_size - 1; + ((char *)static_table_key.key)[static_table_key.key_len] = 0; + } + else if (static_table_key.key_len < t->key_size) { /* need padding with null */ /* assume static_table_key.key_len is less than sizeof(static_table_key.data.buf)