This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
fix leak in Perl_vload_module()
authorDavid Mitchell <davem@iabyn.com>
Thu, 4 Apr 2019 13:38:50 +0000 (14:38 +0100)
committerDavid Mitchell <davem@iabyn.com>
Thu, 4 Apr 2019 13:38:50 +0000 (14:38 +0100)
commit281cff281e54d71fbedd8c314fe56ae9b58bee67
treed6c297ce6fd3e3703dc00ef2f2e507c97125af39
parent05d49a9a9b7c8a3b3a1d1b4f1ce46db05b04dcbc
fix leak in Perl_vload_module()

This function allocates a few ops, then calls Perl_utilize().
If the latter function croaks early on, those ops will be leaked,
because they won't yet have been linked into the optree.

In particular, newUNOP(OP_REQUIRE, ...) can die if passed a non-valid
module name.

This can be fixed by moving the start_subparse() call to the start of
Perl_vload_module(), before any op allocations. start_subparse() creates
a new PL_compcv, and so any ops allocated afterwards will come from that
CV's slab rather than being directly malloc()ed. On death, the CV will
be freed and its op slab will be scanned and any ops found there freed.

The leak was showing up in ext/XS-APItest/t/load-module.t under ASan.
op.c