This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Data::Dumper - avoid leak on croak
authorDavid Mitchell <davem@iabyn.com>
Wed, 3 Apr 2019 12:23:24 +0000 (13:23 +0100)
committerDavid Mitchell <davem@iabyn.com>
Wed, 3 Apr 2019 12:23:24 +0000 (13:23 +0100)
commit6d65cb5d847ac93680949c4fa02111808207fbdc
tree93508f4c2aa85252ea80c691f425d198344b4e8b
parent06cbc317229e882f379e75eb3adf7cf9c071febd
Data::Dumper - avoid leak on croak

v5.21.3-742-g19be3be696 added a facility to Dumper.xs to croak if the
recursion level became too deep (1000 by default).

The trouble with this is that various parts of DD_dump() allocate
temporary SVs and buffers, which will leak if DD_dump() unceremoniously
just croaks().

This currently manifests as dist/Data-Dumper/t/recurse.t failing under
Address Sanitiser.

This commit makes the depth checking code just set a sticky 'too deep'
boolean flag, and
a) on entry, DD_dump() just returns immediately if the flag is set;
b) the flag is checked by the top-level called of DD_dump() and croaks
if set.

So the net effect is to defer croaking until the dump is complete,
and avoid any further recursion once the flag is set.

This is a bit of a quick fix. More long-term solutions would be to
convert DD_dump() to be iterative rather than recursive, and/or make
sure all temporary SVs and buffers are suitably anchored somewhere so
that they get cleaned up on croak.
dist/Data-Dumper/Dumper.pm
dist/Data-Dumper/Dumper.xs