[Varnish] #1557: regsuball() doesn't honor lookahead assertion on repeated strings

Varnish varnish-bugs at varnish-cache.org
Thu Jul 24 16:43:53 CEST 2014


#1557: regsuball() doesn't honor lookahead assertion on repeated strings
--------------------------------------+----------------------
 Reporter:  varnish@…                 |       Type:  defect
   Status:  new                       |   Priority:  normal
Milestone:                            |  Component:  varnishd
  Version:  trunk                     |   Severity:  normal
 Keywords:  lookahead pcre regsuball  |
--------------------------------------+----------------------
 Hi Varnish-Team,

 the function regsuball doesn't honor lookahead assertion in a regular
 expression correctly, if a regex matches against sequenced or repeated
 strings.

 Example:
 If you strip some query strings and match for different query strings in
 one regex and the query strings are sequenced one after another, not all
 strings matches:

 {{{
 sub vcl_backend_response {
     set bereq.url = "/?id=23&name=foo&age=42";
     set beresp.http.foo = regsuball(bereq.url,
 "(?<=[&\?])(id|name|age)=[^&]+(?:&|$)", "");
 }
 }}}

 The expected result should be:
 {{{
 EXPECT resp.http.foo == "/?"
 }}}

 Result is:

 {{{
 resp.http.foo /?name=foo&
 }}}

 This error occures in bin/varnishd/cache/cache_vrt_re.c, in function
 VRT_regsub. The matched substring is some kind of cutted off instead of
 setting the offset for the ongoing pcre_exec runs. So the pcre engine
 could never test for lookahead assertion, since the former string isn't
 there anymore. This results in a misbehavior and a not correctly executed
 match.

 Best regards,

 Martin

-- 
Ticket URL: <https://www.varnish-cache.org/trac/ticket/1557>
Varnish <https://varnish-cache.org/>
The Varnish HTTP Accelerator



More information about the varnish-bugs mailing list