From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id EF3B61F61F for ; Thu, 19 Mar 2020 08:32:56 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 4/6] www: avoid `state' usage to perform allocations up-front Date: Thu, 19 Mar 2020 03:32:54 -0500 Message-Id: <20200319083256.15593-5-e@yhbt.net> In-Reply-To: <20200319083256.15593-1-e@yhbt.net> References: <20200319083256.15593-1-e@yhbt.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: We want WWW->preload to get as many immortal allocations done as possible, and the `state' feature from Perl 5.10 prevents that. --- lib/PublicInbox/SolverGit.pm | 13 +++++++------ lib/PublicInbox/ViewDiff.pm | 6 +++--- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/PublicInbox/SolverGit.pm b/lib/PublicInbox/SolverGit.pm index 34669dbe..f881e16e 100644 --- a/lib/PublicInbox/SolverGit.pm +++ b/lib/PublicInbox/SolverGit.pm @@ -34,6 +34,12 @@ my $OID_MIN = 7; # work fairly. Other PSGI servers may have trouble, though. my $MAX_PATCH = 9999; +my $LF = qr!\r?\n!; +my $ANY = qr![^\r\n]+!; +my $MODE = '100644|120000|100755'; +my $FN = qr!(?:("?[^/\n]+/[^\r\n]+)|/dev/null)!; +my %BAD_COMPONENT = ('' => 1, '.' => 1, '..' => 1); + # di = diff info / a hashref with information about a diff ($di): # { # oid_a => abbreviated pre-image oid, @@ -110,10 +116,6 @@ sub extract_diff ($$) { $s =~ s/\r\n/\n/sg; } - state $LF = qr!\r?\n!; - state $ANY = qr![^\r\n]+!; - state $MODE = '100644|120000|100755'; - state $FN = qr!(?:("?[^/\n]+/[^\r\n]+)|/dev/null)!; $s =~ m!( # $1 start header lines we save for debugging: @@ -174,8 +176,7 @@ sub extract_diff ($$) { # get rid of path-traversal attempts and junk patches: # it's junk at best, an attack attempt at worse: - state $bad_component = { map { $_ => 1 } ('', '.', '..') }; - foreach (@a, @b) { return if $bad_component->{$_} } + foreach (@a, @b) { return if $BAD_COMPONENT{$_} } $di->{path_a} = join('/', @a) if @a; $di->{path_b} = join('/', @b); diff --git a/lib/PublicInbox/ViewDiff.pm b/lib/PublicInbox/ViewDiff.pm index 0f5c0e4e..57a1b5d6 100644 --- a/lib/PublicInbox/ViewDiff.pm +++ b/lib/PublicInbox/ViewDiff.pm @@ -20,6 +20,9 @@ sub UNSAFE () { "^A-Za-z0-9\-\._~/" } my $OID_NULL = '0{7,40}'; my $OID_BLOB = '[a-f0-9]{7,40}'; +my $LF = qr!\n!; +my $ANY = qr![^\n]!; +my $FN = qr!(?:"?[^/\n]+/[^\n]+|/dev/null)!; # cf. git diff.c :: get_compact_summary my $DIFFSTAT_COMMENT = qr/\((?:new|gone|(?:(?:new|mode) [\+\-][lx]))\)/; @@ -170,9 +173,6 @@ sub diff_before_or_after ($$$) { # callers must do CRLF => LF conversion before calling this sub flush_diff ($$$) { my ($dst, $ctx, $cur) = @_; - state $LF = qr!\n!; - state $ANY = qr![^\n]!; - state $FN = qr!(?:"?[^/\n]+/[^\n]+|/dev/null)!; my @top = split(/( (?: # begin header stuff, don't capture filenames, here,