From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.2 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, T_SCC_BODY_TEXT_LINE shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 3B5491F405 for ; Wed, 7 Feb 2024 21:26:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=80x24.org; s=selector1; t=1707341163; bh=zVK32LfHDSxLMwI7+9iTCNzc7j/GbLVVRE75+UZ9PPU=; h=From:To:Subject:Date:From; b=Jo0HIzoECQnWeIVtzYTAthT6ZKeRO2bXif1VvH2sZ4MGNA6mlqkuvOWiwu9Q+1A54 h8TAG4/dP7fmLIYiScjhLOzquTXaHGgQzVl5oRyqSlQ9dlyK70Jj+bsQogceF0AazU I7cL1YiIsgjGB47X22It2PiB9uLPtrnO5zkB8mF8= From: Eric Wong To: spew@80x24.org Subject: [PATCH] eml: avoid anonymous __WARN__ sub for encode/decode Date: Wed, 7 Feb 2024 21:26:03 +0000 Message-ID: <20240207212603.1291037-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: Repeatedly creating and allocating an anonymous sub is an expensive operation and a potential source of leaks in older Perl. Instead, `local'-ize a global and use a permanent sub to workaround the old Encode 2.87..3.12 leak. --- lib/PublicInbox/Eml.pm | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/lib/PublicInbox/Eml.pm b/lib/PublicInbox/Eml.pm index 24060ec8..56aec1e5 100644 --- a/lib/PublicInbox/Eml.pm +++ b/lib/PublicInbox/Eml.pm @@ -334,6 +334,11 @@ sub body_set { undef; } +# workaround https://rt.cpan.org/Public/Bug/Display.html?id=139622 +# Encode 2.87..3.12 leaks on croak, so we defer and croak ourselves +our @enc_warn; +my $enc_warn = sub { push @enc_warn, @_ }; + sub body_str_set { my ($self, $str) = @_; my $cs = ct($self)->{attributes}->{charset} // @@ -341,10 +346,10 @@ sub body_str_set { my $enc = find_encoding($cs) // croak "unknown encoding `$cs'"; my $tmp; { - my @w; - local $SIG{__WARN__} = sub { push @w, @_ }; + local @enc_warn; + local $SIG{__WARN__} = $enc_warn; $tmp = $enc->encode($str, Encode::FB_WARN); - croak(@w) if @w; + croak(@enc_warn) if @enc_warn; }; body_set($self, \$tmp); } @@ -471,11 +476,10 @@ sub body_str { }; my $enc = find_encoding($cs) or croak "unknown encoding `$cs'"; my $tmp = body($self); - # workaround https://rt.cpan.org/Public/Bug/Display.html?id=139622 - my @w; - local $SIG{__WARN__} = sub { push @w, @_ }; + local @enc_warn; + local $SIG{__WARN__} = $enc_warn; my $ret = $enc->decode($tmp, Encode::FB_WARN); - croak(@w) if @w; + croak(@enc_warn) if @enc_warn; $ret; }