Commit 47eae6cd authored by Geoff Simmons's avatar Geoff Simmons

Fix a bug in match().

The search may have matched a string that is actually a prefix of
the subject string, if a longer string with the same prefix is also
in the set.

This "happens" to give correct results for match(), but which()
would return the wrong value.

The fix uses strcmp() instead of memcmp(), but that is also
vectorized, where the C library uses vector instructions.
parent 840a781b
...@@ -69,6 +69,7 @@ AC_CHECK_FUNCS([strdup]) ...@@ -69,6 +69,7 @@ AC_CHECK_FUNCS([strdup])
AC_CHECK_FUNCS([memset]) AC_CHECK_FUNCS([memset])
AC_CHECK_FUNCS([select]) AC_CHECK_FUNCS([select])
AC_CHECK_FUNCS([strerror]) AC_CHECK_FUNCS([strerror])
AC_CHECK_FUNCS([getline])
AC_CHECK_HEADERS([limits.h]) AC_CHECK_HEADERS([limits.h])
AC_C_INLINE AC_C_INLINE
AC_C_RESTRICT AC_C_RESTRICT
...@@ -111,5 +112,6 @@ fi ...@@ -111,5 +112,6 @@ fi
AC_CONFIG_FILES([ AC_CONFIG_FILES([
Makefile Makefile
src/Makefile src/Makefile
src/tests/bench/Makefile
]) ])
AC_OUTPUT AC_OUTPUT
...@@ -250,7 +250,7 @@ PT_Lookup(const struct pt_y * const restrict root, ...@@ -250,7 +250,7 @@ PT_Lookup(const struct pt_y * const restrict root,
l = y->off + y->len; l = y->off + y->len;
if (l > len) if (l > len)
return UINT_MAX; return UINT_MAX;
if (l == len && memcmp(subject, strings[y->idx], len) == 0) if (l == len && strcmp(subject, strings[y->idx]) == 0)
return y->idx; return y->idx;
b = (y->bitmask & subject[l]) != 0; b = (y->bitmask & subject[l]) != 0;
assert(b < 2); assert(b < 2);
......
...@@ -50,6 +50,40 @@ client c1 { ...@@ -50,6 +50,40 @@ client c1 {
expect resp.http.Match-Raboof == "false" expect resp.http.Match-Raboof == "false"
} -run } -run
varnish v1 -vcl {
import ${vmod_selector};
backend b { .host = "${bad_ip}"; }
sub vcl_init {
new t = selector.set();
t.add("études");
t.add("étude's");
t.add("étude");
}
sub vcl_recv {
return (synth(200));
}
sub vcl_synth {
set resp.http.Match-Etude = t.match("étude");
set resp.http.Which-Etude = t.which();
set resp.http.Match-Etudes = t.match("études");
set resp.http.Which-Etudes = t.which();
set resp.body = t.debug();
return (deliver);
}
}
client c1 {
txreq
rxresp
expect resp.http.Match-Etude == "true"
expect resp.http.Which-Etude == 3
expect resp.http.Match-Etudes == "true"
expect resp.http.Which-Etudes == 1
} -run
varnish v1 -vcl { varnish v1 -vcl {
import ${vmod_selector}; import ${vmod_selector};
import std; import std;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment