The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use HTML::Mason::Tests;

my $tests = make_tests();
$tests->run;

sub make_tests
{
    my $group = HTML::Mason::Tests->tests_class->new( name => 'stack_corruption',
                                                      description => 'tests for stack corruption',
                                                    );


    # The key to this test is that it first calls a component that in
    # turn has a comp-with-content call. That comp-with-content call
    # then calls $m->content (this is important).
    #
    # After that, _further_ component calls reveal stack corruption.
    $group->add_support( path => '/support/comp',
                         component => <<'EOF',
<&| .subcomp1 &>
<& .subcomp2 &>
</&>

<%def .subcomp1>
% $m->content;
</%def>

<%def .subcomp2>
content
</%def>
EOF
                       );

    $group->add_support( path => '/support/comp2',
                         component => <<'EOF',

EOF
                       );

    $group->add_test( name => 'stack_corruption',
                      description => 'test for stack corruption with comp-with-content call',
                      component => <<'EOF',
<& support/comp &>

<& support/comp2 &>

<& .callers &>

<%def .callers>
Stack at this point:
% for my $f ( $m->callers ) {
<% defined $f ? $f->path : 'undef' %>
% }
</%def>
EOF
                      expect => qr{/stack_corruption/stack_corruption:.callers\n(?!undef)},
                    );

    return $group;
}