This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
fix GvSV refcounting in sort
authorZefram <zefram@fysh.org>
Tue, 12 Dec 2017 09:47:41 +0000 (09:47 +0000)
committerZefram <zefram@fysh.org>
Tue, 12 Dec 2017 09:53:32 +0000 (09:53 +0000)
commit16ada235c332e017667585e1a5a00ce43a31c529
tree746383a2364185484906fefefa457d8879b7f84c
parent6cc23b5aabb7c0128c3c2bff71584f07f965efb4
fix GvSV refcounting in sort

Where a sort operation passes the comparands to a comparison block in $a
and $b, it wasn't taking account of the fact that the GvSV slots in *a
and *b are refcounted.  It would write the comparands into those slots
without altering any reference counts, and end by restoring the values
those slots had to start with.  This was all fine so long as nothing
else touched those slots during the process.  But code running during
the comparison is free to write to them by "*a = \1", which does frob
the reference counts.

Fix it by switching sort to manipulate GvSV in a refcount-preserving
manner, compatible with all other operations on those slots.  Fixes
[perl #92264].
pp_sort.c
t/op/sort.t