in reply to Re: Stop runaway regex
in thread Stop runaway regex

FYI:

Even w/o deferred signals I was able to create segfaults with alarm (5.10).

Just by putting simple (?{code}) into the regex to catch the alarm-signal.

Cheers Rolf

( addicted to the Perl Programming Language)

Replies are listed 'Best First'.
Re^3: Stop runaway regex
by mr_mischief (Monsignor) on May 30, 2014 at 15:24 UTC

    I was unable to get a segfault testing the exact code I posted on either 5.10.1 on CentOS or 5,16,2 on OSX. I only tested it with the strings and regex listed in the code, though.

      I hope it's fixed for newer versions, here what I tried for reproduction:

      Just taking the code from alarm and embedding (dummy) code into a long running regex

      Generally I try to avoid alarm...

      use strict; use warnings; my $start; my $diff; my $timeout; sub tst { $timeout=shift; my $str = "a"x10000; $str .= "b"; eval { local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required alarm $timeout; $str =~ /^ (( a* (?{1}) # dummy code )*)* $/x; alarm 0; }; if ($@) { die unless $@ eq "alarm\n"; # propagate unexpected errors die "timed out after $timeout sec :". time(); } else { print "normal"; } } tst($_) for 2;

      output

      Complex regular subexpression recursion limit (32766) exceeded at /hom +e/lanx/B/PL/PM/timeout_regex.pl line 18. Compilation segmentation fault at Fri May 30 17:41:48

      Cheers Rolf

      ( addicted to the Perl Programming Language)

        I also get a core dump on 5.10.1 (CentOS) with that code but not on 5.16.2 (OSX) FWIW.

        $ perl baz Complex regular subexpression recursion limit (32766) exceeded at baz +line 18. timed out after 2 sec :1401464941 at baz line 25.
        This is perl 5, version 16, subversion 2 (v5.16.2) built for darwin-th +read-multi-2level (with 3 registered patches, see perl -V for more detail)