]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 1309229 - changing product results in Insecure dependency in parameter 3 of DBI...
authorDylan William Hardison <dylan@hardison.net>
Tue, 11 Oct 2016 14:26:32 +0000 (10:26 -0400)
committerDylan William Hardison <dylan@hardison.net>
Tue, 11 Oct 2016 14:26:32 +0000 (10:26 -0400)
Bugzilla/Memcached.pm
memtaint.pl [new file with mode: 0644]

index cdadf4601450b298b384a4bbcdadc72e1ca99f2f..f7362372097a3ddc637aaf2ad371f4d60db9b2e1 100644 (file)
@@ -12,6 +12,7 @@ use strict;
 use warnings;
 
 use Bugzilla::Error;
+use Bugzilla::Util qw(trick_taint);
 use Scalar::Util qw(blessed);
 use URI::Escape;
 use Encode;
@@ -246,7 +247,51 @@ sub _get {
 
     $key = $self->_encode_key($key)
         or return;
-    return $self->{memcached}->get($key);
+    my $value = $self->{memcached}->get($key);
+    return unless defined $value;
+
+    # detaint returned values
+    # hashes and arrays are detainted just one level deep
+    if (ref($value) eq 'HASH') {
+        _detaint_hashref($value);
+    }
+    elsif (ref($value) eq 'ARRAY') {
+        foreach my $value (@$value) {
+            next unless defined $value;
+            # arrays of hashes and arrays are common
+            if (ref($value) eq 'HASH') {
+                _detaint_hashref($value);
+            }
+            elsif (ref($value) eq 'ARRAY') {
+                _detaint_arrayref($value);
+            }
+            elsif (!ref($value)) {
+                trick_taint($value);
+            }
+        }
+    }
+    elsif (!ref($value)) {
+        trick_taint($value);
+    }
+    return $value;
+}
+
+sub _detaint_hashref {
+    my ($hashref) = @_;
+    foreach my $value (values %$hashref) {
+        if (defined($value) && !ref($value)) {
+            trick_taint($value);
+        }
+    }
+}
+
+sub _detaint_arrayref {
+    my ($arrayref) = @_;
+    foreach my $value (@$arrayref) {
+        if (defined($value) && !ref($value)) {
+            trick_taint($value);
+        }
+    }
 }
 
 sub _delete {
diff --git a/memtaint.pl b/memtaint.pl
new file mode 100644 (file)
index 0000000..54072dc
--- /dev/null
@@ -0,0 +1,14 @@
+use Cache::Memcached::Fast;
+use Devel::Peek;
+
+my $mc = Cache::Memcached::Fast->new( { servers => ['127.0.0.1:11211'] });
+
+my $v=[$ENV{PATH}];
+
+Dump($v->[0]);
+
+$mc->set("taint", $v);
+
+Dump($v->[0]);
+
+Dump($mc->get("taint")->[0]);