You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by mm...@apache.org on 2014/11/14 18:08:36 UTC
svn commit: r1639701 - /spamassassin/trunk/lib/Mail/SpamAssassin/Util.pm
Author: mmartinec
Date: Fri Nov 14 17:08:36 2014
New Revision: 1639701
URL: http://svn.apache.org/r1639701
Log:
optimize untaint_var for a common case, saves 90 ms during startup
Modified:
spamassassin/trunk/lib/Mail/SpamAssassin/Util.pm
Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Util.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Util.pm?rev=1639701&r1=1639700&r2=1639701&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Util.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Util.pm Fri Nov 14 17:08:36 2014
@@ -282,40 +282,43 @@ sub untaint_hostname {
#
sub untaint_var {
# my $arg = $_[0]; # avoid copying unnecessarily
- my $r = ref $_[0];
- if (!$r) {
+ if (!ref $_[0]) { # optimized by-far-the-most-common case
no re 'taint'; # override a "use re 'taint'" from outer scope
return undef if !defined $_[0];
local($1); # avoid Perl taint bug: tainted global $1 propagates taintedness
$_[0] =~ /^(.*)\z/s;
return $1;
- }
- elsif ($r eq 'ARRAY') {
- my $arg = $_[0];
- $_ = untaint_var($_) for @{$arg};
- return @{$arg} if wantarray;
- }
- elsif ($r eq 'HASH') {
- my $arg = $_[0];
- if ($arg == \%ENV) { # purge undefs from %ENV, untaint the rest
- while (my($k, $v) = each %{$arg}) {
- # It is safe to delete the item most recently returned by each()
- if (!defined $v) { delete ${$arg}{$k}; next }
- ${$arg}{untaint_var($k)} = untaint_var($v);
- }
- } else {
- while (my($k, $v) = each %{$arg}) {
- ${$arg}{untaint_var($k)} = untaint_var($v);
+ } else {
+ my $r = ref $_[0];
+ if ($r eq 'ARRAY') {
+ my $arg = $_[0];
+ $_ = untaint_var($_) for @{$arg};
+ return @{$arg} if wantarray;
+ }
+ elsif ($r eq 'HASH') {
+ my $arg = $_[0];
+ if ($arg == \%ENV) { # purge undefs from %ENV, untaint the rest
+ while (my($k, $v) = each %{$arg}) {
+ # It is safe to delete the item most recently returned by each()
+ if (!defined $v) { delete ${$arg}{$k}; next }
+ ${$arg}{untaint_var($k)} = untaint_var($v);
+ }
+ } else {
+ # hash keys are never tainted,
+ # although old version of perl had some quirks there
+ while (my($k, $v) = each %{$arg}) {
+ ${$arg}{untaint_var($k)} = untaint_var($v);
+ }
}
+ return %{$arg} if wantarray;
+ }
+ elsif ($r eq 'SCALAR' || $r eq 'REF') {
+ my $arg = $_[0];
+ ${$arg} = untaint_var(${$arg});
+ }
+ else {
+ warn "util: can't untaint a $r !\n";
}
- return %{$arg} if wantarray;
- }
- elsif ($r eq 'SCALAR' || $r eq 'REF') {
- my $arg = $_[0];
- ${$arg} = untaint_var(${$arg});
- }
- else {
- warn "util: can't untaint a $r !\n";
}
return $_[0];
}