Skip to content

Segfault in Perl_re_op_compile at regcomp.c:8488 #17775

Closed
@dur-randir

Description

@dur-randir

This is a bug report for perl from sergey.aleynikov@gmail.com,
generated with the help of perlbug 1.41 running under perl 5.31.10.

[Please describe your issue here]

While fuzzing perl v5.31.9-70-g0c96aa4b7b built with afl and run
under libdislocator, I found the following program

0=~/(?[(?^:(?[[0]])(?0))0])/

to cause a segfault. GDB stack trace is:

0x0000555555636622 in Perl_re_op_compile (patternp=0x0, pat_count=1, expr=0x555555981bd0,
    eng=0x55555594ad20 <PL_core_reg_engine>, old_re=0x0, is_bare_re=0x0, orig_rx_flags=0, pm_flags=0) at regcomp.c:8488
8488	        ARG2L_SET( scan, RExC_open_parens[ARG(scan)] - REGNODE_OFFSET(scan));
(gdb) bt
#0  0x0000555555636622 in Perl_re_op_compile (patternp=0x0, pat_count=1, expr=0x555555981bd0,
    eng=0x55555594ad20 <PL_core_reg_engine>, old_re=0x0, is_bare_re=0x0, orig_rx_flags=0, pm_flags=0) at regcomp.c:8488
#1  0x00005555555b2fb2 in Perl_pmruntime (o=0x555555981c08, expr=0x555555981bd0, repl=0x0, flags=1, floor=0) at op.c:8359
#2  0x00005555556185a4 in Perl_yyparse (gramtype=258) at perly.y:1293
#3  0x00005555555d0207 in S_parse_body (env=0x0, xsinit=0x5555555a01df <xs_init>) at perl.c:2574
#4  0x00005555555cf0cb in perl_parse (my_perl=0x555555955260, xsinit=0x5555555a01df <xs_init>, argc=3, argv=0x7fffffffe1a8,
    env=0x0) at perl.c:1869
#5  0x00005555555a011d in main (argc=3, argv=0x7fffffffe1a8, env=0x7fffffffe1c8) at perlmain.c:132

This is a regression in blead, bisect points to d8d1ded is the first bad commit

commit d8d1dede53afc4f33cf63203b0992459fe964dc3
Author: Karl Williamson <khw@cpan.org>
Date:   Mon Feb 17 12:07:07 2020 -0700

    Improve handling of nested qr/(?[...])/

    A set operations expression can contain a previously-compiled one
    interpolated in.  Prior to this commit, some heuristics were employed
    to verify it actually was such a thing, and not a sort of look-alike
    that wasn't necessarily valid.  The heuristics actually forbade legal
    ones.  I don't know of any illegal ones that were let through, but it is
    certainly possible.  Also, the error/warning messages referred to the
    heuristics, and were unhelpful at best.

    The technique used instead in this commit is to return a regop only used
    by this feature for any nested compilations.  This guarantees that the
    caller can determine if the result is valid, and what that result is
    without having to do any heuristics or inspecting any flags.  The
    error/warning messages are changed to reflect this, and I believe are
    now helpful.

    This fixes the bugs in #16779
    https://github.com/Perl/perl5/issues/16779#issuecomment-563987618
[Please do not change anything below this line]
Flags:
category=core
severity=medium
Site configuration information for perl 5.31.10:

Configured by root at Fri Mar 13 17:15:02 MSK 2020.

Summary of my perl5 (revision 5 version 31 subversion 10) configuration:
Commit id: 0c96aa4
Platform:
osname=linux
osvers=4.19.0-8-amd64
archname=x86_64-linux
uname='linux dorothy 4.19.0-8-amd64 #1 smp debian 4.19.98-1 (2020-01-26) x86_64 gnulinux '
config_args='-de -Dusedevel -Doptimize=-O2'
hint=recommended
useposix=true
d_sigaction=define
useithreads=undef
usemultiplicity=undef
use64bitint=define
use64bitall=define
uselongdouble=undef
usemymalloc=n
default_inc_excludes_dot=define
bincompat5005=undef
Compiler:
cc='cc'
ccflags ='-fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2'
optimize='-O2'
cppflags='-fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include'
ccversion=''
gccversion='8.3.0'
gccosandvers=''
intsize=4
longsize=8
ptrsize=8
doublesize=8
byteorder=12345678
doublekind=3
d_longlong=define
longlongsize=8
d_longdbl=define
longdblsize=16
longdblkind=3
ivtype='long'
ivsize=8
nvtype='double'
nvsize=8
Off_t='off_t'
lseeksize=8
alignbytes=8
prototype=define
Linker and Libraries:
ld='cc'
ldflags =' -fstack-protector-strong -L/usr/local/lib'
libpth=/usr/local/lib /usr/lib/gcc/x86_64-linux-gnu/8/include-fixed /usr/include/x86_64-linux-gnu /usr/lib /lib/x86_64-linux-gnu /lib/../lib /usr/lib/x86_64-linux-gnu /usr/lib/../lib /lib
libs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc
perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc
libc=libc-2.28.so
so=so
useshrplib=false
libperl=libperl.a
gnulibc_version='2.28'
Dynamic Linking:
dlsrc=dl_dlopen.xs
dlext=so
d_dlsymun=undef
ccdlflags='-Wl,-E'
cccdlflags='-fPIC'
lddlflags='-shared -O2 -L/usr/local/lib -fstack-protector-strong'

@inc for perl 5.31.10:
lib
/usr/local/lib/perl5/site_perl/5.31.10/x86_64-linux
/usr/local/lib/perl5/site_perl/5.31.10
/usr/local/lib/perl5/5.31.10/x86_64-linux
/usr/local/lib/perl5/5.31.10

Environment for perl 5.31.10:
HOME=/home/afl
LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE=en_US.UTF-8
LC_TIME=C
LD_LIBRARY_PATH (unset)
LOGDIR (unset)
PATH=/home/afl/perlbrew/bin:/home/afl/perlbrew/perls/perl-5.30.0-dbg/bin:/opt/local/bin:/usr/texbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PERLBREW_HOME=/home/afl/.perlbrew
PERLBREW_MANPATH=/home/afl/perlbrew/perls/perl-5.30.0-dbg/man
PERLBREW_PATH=/home/afl/perlbrew/bin:/home/afl/perlbrew/perls/perl-5.30.0-dbg/bin
PERLBREW_PERL=perl-5.30.0-dbg
PERLBREW_ROOT=/home/afl/perlbrew
PERLBREW_SHELLRC_VERSION=0.88
PERLBREW_VERSION=0.88
PERL_BADLANG (unset)

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions