diff options
Diffstat (limited to 'recipes/perl/perl-5.10.1/crash-on-undefined-destroy.diff')
-rw-r--r-- | recipes/perl/perl-5.10.1/crash-on-undefined-destroy.diff | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/recipes/perl/perl-5.10.1/crash-on-undefined-destroy.diff b/recipes/perl/perl-5.10.1/crash-on-undefined-destroy.diff new file mode 100644 index 0000000000..6991140cd1 --- /dev/null +++ b/recipes/perl/perl-5.10.1/crash-on-undefined-destroy.diff @@ -0,0 +1,58 @@ +From: Niko Tyni <ntyni@debian.org> +Subject: Fix a NULL pointer dereference when looking for a DESTROY method +Bug-Debian: http://bugs.debian.org/564074 +Bug: http://rt.perl.org/rt3/Public/Bug/Display.html?id=71952 +Origin: upstream, http://perl5.git.perl.org/perl.git/commit/1f15e670edb515b744e9021b4a42a7955da83093 + +The empty DESTROY method optimization introduced by upstream commit +fbb3ee5af3d would crash the interpreter if a DESTROY method was declared +but not actually defined. + + +--- + sv.c | 3 ++- + t/op/method.t | 11 ++++++++++- + 2 files changed, 12 insertions(+), 2 deletions(-) + +diff --git a/sv.c b/sv.c +index d2fcb0c..ec1ac82 100644 +--- a/sv.c ++++ b/sv.c +@@ -5419,7 +5419,8 @@ Perl_sv_clear(pTHX_ register SV *sv) + if (destructor + /* Don't bother calling an empty destructor */ + && (CvISXSUB(destructor) +- || CvSTART(destructor)->op_next->op_type != OP_LEAVESUB)) ++ || (CvSTART(destructor) ++ && (CvSTART(destructor)->op_next->op_type != OP_LEAVESUB)))) + { + SV* const tmpref = newRV(sv); + SvREADONLY_on(tmpref); /* DESTROY() could be naughty */ +diff --git a/t/op/method.t b/t/op/method.t +index 46c4642..8e91c48 100755 +--- a/t/op/method.t ++++ b/t/op/method.t +@@ -10,7 +10,7 @@ BEGIN { + require "test.pl"; + } + +-print "1..78\n"; ++print "1..79\n"; + + @A::ISA = 'B'; + @B::ISA = 'C'; +@@ -293,3 +293,12 @@ EOT + "check if UNIVERSAL::AUTOLOAD works", + ); + } ++{ ++ fresh_perl_is(<<'EOT', ++sub M::DESTROY; bless {}, "M" ; print "survived\n"; ++EOT ++ "survived", ++ {}, ++ "no crash with a declared but missing DESTROY method" ++ ); ++} +-- +tg: (daf8b46..) fixes/crash-on-undefined-destroy (depends on: upstream) |