This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fix double free with const overload after errors
authorFather Chrysostomos <sprout@cpan.org>
Thu, 5 Feb 2015 06:11:06 +0000 (22:11 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Thu, 5 Feb 2015 17:15:16 +0000 (09:15 -0800)
commit67c71cbbd62a75ff2b913421806f6ea0f0b33558
treee48b2d8f3a50e1d84c1eeef007d8e07c3e38a51f
parentd9a13252ba5aad7b3eaaff069b56472cfb651a40
Fix double free with const overload after errors

The PL_lex_stuff variable in the parser struct is reference-counted.
Yet, in toke.c:S_sublex_start we pass the value to S_tokeq, which may
pass it to S_new_constant, which takes ownership of the reference
count (possibly freeing or mortalising the SV), and then relinquishes
its ownership of the returned SV (incrementing the reference count if
it is the same SV passed to it).  If S_new_constant croaks, then it
will have mortalised the SV passed to it while PL_lex_stuff still
points to it.

This example makes S_new_constant croak indirectly, by causing its
yyerror call to croak because of the number of errors:

$ perl5.20.1 -e 'BEGIN { $^H|=0x8000} undef(1,2); undef(1,2); undef(1,2); undef(1,2); undef(1,2); undef(1,2); undef(1,2); undef(1,2); undef(1,2); "a"'
Too many arguments for undef operator at -e line 1, near "2)"
Too many arguments for undef operator at -e line 1, near "2)"
Too many arguments for undef operator at -e line 1, near "2)"
Too many arguments for undef operator at -e line 1, near "2)"
Too many arguments for undef operator at -e line 1, near "2)"
Too many arguments for undef operator at -e line 1, near "2)"
Too many arguments for undef operator at -e line 1, near "2)"
Too many arguments for undef operator at -e line 1, near "2)"
Too many arguments for undef operator at -e line 1, near "2)"
Constant(q) unknown at -e line 1, near ";"a""
-e has too many errors.
Attempt to free unreferenced scalar: SV 0x7fb49882fae8 at -e line 1.
t/lib/croak/toke
toke.c