summaryrefslogtreecommitdiff
path: root/pp_sort.c
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2011-10-13 20:25:39 -0700
committerFather Chrysostomos <sprout@cpan.org>2011-10-13 20:26:49 -0700
commit1aa032b25ab39eebe4a452ff935a39107a322a5b (patch)
tree589ddfca325b1179d45c5f9032d9f30bdba54fdb /pp_sort.c
parent7c1b9f38fcbfdb3a9e1766e02bcb991d1a5452d9 (diff)
downloadperl-1aa032b25ab39eebe4a452ff935a39107a322a5b.tar.gz
Stop uninit sort warnings from crashing
Commit d4c6760a made the warning in cases like this mention the sort operator: $ ./miniperl -we '()=sort { undef } 1,2' Use of uninitialized value [in sort] at -e line 1. It did so by setting PL_op during the SvIV(retval of sort block). But sv.c:S_find_uninit_var, called by report_uninit, tries to access the targets of some ops, which are in PL_curpad on threaded builds. In the case of a sort sub (rather than an inlined block), PL_curpad con- tained whatever was left over from the sort block (I presume, but have not confirmed; in any case what is in PL_curpad is bad), causing find_uninit_var to crash. This commit sets PL_curpad to null and puts a check for it in report_uninit. It did not crash in debugging threaded builds, but that was probably luck (even though I don’t believe in it).
Diffstat (limited to 'pp_sort.c')
-rw-r--r--pp_sort.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/pp_sort.c b/pp_sort.c
index 0ee42dcf38..2257d2f8c9 100644
--- a/pp_sort.c
+++ b/pp_sort.c
@@ -1765,6 +1765,7 @@ S_sortcv(pTHX_ SV *const a, SV *const b)
I32 result;
PMOP * const pm = PL_curpm;
OP * const sortop = PL_op;
+ SV **pad;
PERL_ARGS_ASSERT_SORTCV;
@@ -1776,7 +1777,9 @@ S_sortcv(pTHX_ SV *const a, SV *const b)
if (PL_stack_sp != PL_stack_base + 1)
Perl_croak(aTHX_ "Sort subroutine didn't return single value");
PL_op = sortop;
+ pad = PL_curpad; PL_curpad = 0;
result = SvIV(*PL_stack_sp);
+ PL_curpad = pad;
while (PL_scopestack_ix > oldscopeix) {
LEAVE;
}
@@ -1795,6 +1798,7 @@ S_sortcv_stacked(pTHX_ SV *const a, SV *const b)
AV * const av = GvAV(PL_defgv);
PMOP * const pm = PL_curpm;
OP * const sortop = PL_op;
+ SV **pad;
PERL_ARGS_ASSERT_SORTCV_STACKED;
@@ -1826,7 +1830,9 @@ S_sortcv_stacked(pTHX_ SV *const a, SV *const b)
if (PL_stack_sp != PL_stack_base + 1)
Perl_croak(aTHX_ "Sort subroutine didn't return single value");
PL_op = sortop;
+ pad = PL_curpad; PL_curpad = 0;
result = SvIV(*PL_stack_sp);
+ PL_curpad = pad;
while (PL_scopestack_ix > oldscopeix) {
LEAVE;
}