Re: [Mod-security-developers] [Vote] 2.7.5
Brought to you by:
victorhora,
zimmerletw
From: Rainer J. <rai...@ki...> - 2013-07-16 20:15:42
|
On 16.07.2013 21:05, Christian Folini wrote: > Hello Rainer, > > On Tue, Jul 16, 2013 at 01:05:08PM +0200, Rainer Jung wrote: >> Hi Christian, >> >> I think when running the unit tests via "make test" you should add >> -DMSC_TEST to CFLAGS. That flag comments all httpd calls and produces >> standalone binaries. > > Thanks for the info. True, it's mentioned in the reference guide. > It's just that I used outdated documentation. > > Here we have the culprit: > $> make CFLAGS=-DMSC_TEST test > ... > Loaded 8 tests from ./op/rx.t > 1) op "rx": passed (Pattern match "" at UNIT_TEST.) > 2) op "rx": passed > 3) op "rx": passed (Pattern match "" at UNIT_TEST.) > 4) op "rx": passed (Pattern match "abc" at UNIT_TEST.) > 5) op "rx": passed (Pattern match "def" at UNIT_TEST.) > 6) op "rx": passed (Pattern match "ghi" at UNIT_TEST.) > 7) op "rx": passed > ERROR: Failed to create rule for op "rx": Error creating rule: Error compiling pattern (offset 2): unrecognized character after (? or (?- > Test exited with signal 11. > Executed: ./msc_test "-t" "op" "-n" "rx" "-p" "(?^i:^([^=])\s*=\s*((?:abc)+(?:def|ghi){2})$)" "-D" "0" "-r" "1" > 8) op "rx": failed > Passed: 7; Failed: 1 > ... > 576/577 tests passed. > FAIL: run-unit-tests.pl > ======================================== > 1 of 1 test failed > Please report to su...@mo... > ======================================== > make[2]: *** [check-TESTS] Error 1 > make[2]: Leaving directory `/usr/src/modsecurity/ModSecurity-remotes-2.7.x/tests' > make[1]: *** [check-am] Error 2 > make[1]: Leaving directory `/usr/src/modsecurity/ModSecurity-remotes-2.7.x/tests' > make: *** [check-recursive] Error 1 I was curious why this didn't fail for me. I vaguely remember other users had reported the same problem before. So here's what I think is the explanation: The original pattern in the unit test is in op/rx.t: qr/^([^=])\s*=\s*((?:abc)+(?:def|ghi){2})$/i The pattern is read by the perl script run-unit-tests.pl. Before Perl 5.14 the qr was converted to: (?i-xsm:^([^=])\s*=\s*((?:abc)+(?:def|ghi){2})$) Starting with Perl 5.14 there's a new syntax and the pattern results in (?^i:^([^=])\s*=\s*((?:abc)+(?:def|ghi){2})$) (See e.g. http://perldoc.perl.org/perlre.html#Extended-Patterns, there look for "Starting in Perl 5.14"). Now the unit tests feed the internal representation to the compiled msc_test binary, which calls the PCRE library to handle the regexp. Unfortunately the PCRE library only accepts the old way of expressing this pattern, not the new ?^ syntax. So if you run the unit tests with a Perl before 5.14 they succeed, with a newer Perl they fail, because a Perl pre-compiled pattern might no longer be compatible with PCRE (despite what PCRE means). I didn't find a bug report for the missing ?^ syntax in the PCRE bug tracker, but "?^" is not the best token to start a search with. Regards, Rainer |