Skip to content

Stack overflow in CPCTPlus::collect_repairs() #629

@bendrissou

Description

@bendrissou

Hi,

lrpar’s CPCT+ recovery code can crash with a stack overflow when enumerating repair sequences in CPCTPlus::collect_repairs(). The overflow happens in the recursive helper traverse() in cpctplus.rs, which walks the Cactus<RepairMerge<_>> parent chain recursively and also recursively explores merge branches.

With pathological input (example attached), the repair structure can become deep and/or highly branched enough to exhaust the thread stack and abort the process.

Input:
test.php

php.y

php.y.txt

php.l

php.l.txt

Execution output:

# ./php_repair test.php

thread 'main' (28119) has overflowed its stack
fatal runtime error: stack overflow, aborting
Aborted

GDB backtrace output:

Program received signal SIGSEGV, Segmentation fault.
__GI___clock_gettime (clock_id=1, tp=0xfffff5d53010) at ../sysdeps/unix/sysv/linux/clock_gettime.c:38
38      ../sysdeps/unix/sysv/linux/clock_gettime.c: No such file or directory.
(gdb) bt
#0  __GI___clock_gettime (clock_id=1, tp=0xfffff5d53010)
    at ../sysdeps/unix/sysv/linux/clock_gettime.c:38
#1  0x0000aaaac6d9c404 in std::sys::pal::unix::time::Timespec::now ()
    at library/std/src/sys/pal/unix/time.rs:131
#2  0x0000aaaac6cf03a8 in lrpar::cpctplus::CPCTPlus<StorageT,LexerTypesT,ActionT,ParamT>::collect_repairs::traverse (finish_by=..., rm=0xfffff5d531e0) at /home/grmtools/lrpar/src/lib/cpctplus.rs:396
#3  0x0000aaaac6cf05bc in lrpar::cpctplus::CPCTPlus<StorageT,LexerTypesT,ActionT,ParamT>::collect_repairs::traverse (finish_by=..., rm=0xfffff5d53300) at /home/grmtools/lrpar/src/lib/cpctplus.rs:402
#4  0x0000aaaac6cf05bc in lrpar::cpctplus::CPCTPlus<StorageT,LexerTypesT,ActionT,ParamT>::collect_repairs::traverse (finish_by=..., rm=0xfffff5d53420) at /home/grmtools/lrpar/src/lib/cpctplus.rs:402
#5  0x0000aaaac6cf05bc in lrpar::cpctplus::CPCTPlus<StorageT,LexerTypesT,ActionT,ParamT>::collect_repairs::traverse (finish_by=..., rm=0xfffff5d53540) at /home/grmtools/lrpar/src/lib/cpctplus.rs:402
#6  0x0000aaaac6cf05bc in lrpar::cpctplus::CPCTPlus<StorageT,LexerTypesT,ActionT,ParamT>::collect_repairs::traverse (finish_by=..., rm=0xfffff5d53660) at /home/grmtools/lrpar/src/lib/cpctplus.rs:402
#7  0x0000aaaac6cf05bc in lrpar::cpctplus::CPCTPlus<StorageT,LexerTypesT,ActionT,ParamT>::collect_repairs::traverse (finish_by=..., rm=0xfffff5d53780) at /home/grmtools/lrpar/src/lib/cpctplus.rs:402
#8  0x0000aaaac6cf05bc in lrpar::cpctplus::CPCTPlus<StorageT,LexerTypesT,ActionT,ParamT>::collect_repairs::traverse (finish_by=..., rm=0xfffff5d538a0) at /home/grmtools/lrpar/src/lib/cpctplus.rs:402
#9  0x0000aaaac6cf05bc in lrpar::cpctplus::CPCTPlus<StorageT,LexerTypesT,ActionT,ParamT>::collect_repairs::traverse (finish_by=..., rm=0xfffff5d539c0) at /home/grmtools/lrpar/src/lib/cpctplus.rs:402
#10 0x0000aaaac6cf05bc in lrpar::cpctplus::CPCTPlus<StorageT,LexerTypesT,ActionT,ParamT>::collect_repairs::traverse (finish_by=..., rm=0xfffff5d53ae0) at /home/grmtools/lrpar/src/lib/cpctplus.rs:402
#11 0x0000aaaac6cf05bc in lrpar::cpctplus::CPCTPlus<StorageT,LexerTypesT,ActionT,ParamT>::collect_repairs::traverse (finish_by=..., rm=0xfffff5d53c00) at /home/grmtools/lrpar/src/lib/cpctplus.rs:402
#12 0x0000aaaac6cf05bc in lrpar::cpctplus::CPCTPlus<StorageT,LexerTypesT,ActionT,ParamT>::collect_repairs::traverse (finish_by=..., rm=0xfffff5d53d20) at /home/grmtools/lrpar/src/lib/cpctplus.rs:402

commit: bbb0343

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions