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];
 }