From fad4ffc89337277f3d5ed32b66986730e891558a Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 17 Oct 2014 12:11:50 +0200 Subject: [PATCH] BUG/MEDIUM: backend: fix URI hash when a query string is present Commit 98634f0 ("MEDIUM: backend: Enhance hash-type directive with an algorithm options") cleaned up the hashing code by using a centralized function. A bug appeared in get_server_uh() which is the URI hashing function. Prior to the patch, the function would stop hashing on the question mark, or on the trailing slash of a maximum directory count. Consecutive to the patch, this last character is included into the hash computation. This means that : GET /0 GET /0? Are not hashed similarly. The following configuration reproduces it : mode http balance uri server s1 0.0.0.0:1234 redir /s1 server s2 0.0.0.0:1234 redir /s2 Many thanks to Vedran Furac for reporting this issue. The fix must be backported to 1.5. --- src/backend.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/backend.c b/src/backend.c index a96b767323..6fe03f9517 100644 --- a/src/backend.c +++ b/src/backend.c @@ -200,7 +200,7 @@ struct server *get_server_uh(struct proxy *px, char *uri, int uri_len) start = end = uri; while (uri_len--) { - c = *end++; + c = *end; if (c == '/') { slashes++; if (slashes == px->uri_dirs_depth1) /* depth+1 */ @@ -208,6 +208,7 @@ struct server *get_server_uh(struct proxy *px, char *uri, int uri_len) } else if (c == '?' && !px->uri_whole) break; + end++; } hash = gen_hash(px, start, (end - start)); -- 2.47.3