#include "/sys/regexp.h"
#include "/inc/base.inc"
#include "/inc/gc.inc"
// tries to regmatch some big expression, which causes the PCRE engine to
// recurse tens of thousands of times. If the recursion is not limited
// properly in respect to the stack size limit of the OS, this will crash the
// driver.
// test is implemented separately because it is supposed to crash the driver
// if it is not successful.
void try_crash()
{
// use at least some of the available stack.
if (caller_stack_depth() < __MAX_RECURSION__-10) {
this_object()->try_crash();
return;
}
catch(regmatch("aaa bbb ccc"*1000000,"a{1,2}(\n|.)+cc",
RE_PCRE|RE_MULTILINE|RE_MATCH_SUBS,0);nolog);
// actually, if the driver survives, the test is successful, no matter if
// the driver was able to match it correctly (because it got plenty of
// stack space from the OS) or raised an error.
msg("Success\n");
shutdown(0);
}
void run_test()
{
msg("\nRunning test for #0000524...\n"
"----------------------------\n");
try_crash();
}
string *epilog(int eflag)
{
call_out(#'run_test,0);
return 0;
}