From: Dietmar Maurer Date: Wed, 19 Sep 2018 04:43:12 +0000 (+0200) Subject: Fix #1925: untaint rbd JSON output X-Git-Url: https://git.proxmox.com/?p=pve-storage.git;a=commitdiff_plain;h=005717108544cda96cd5c0d15368a406cdb685f8 Fix #1925: untaint rbd JSON output Reviewed-by: Thomas Lamprecht Tested-by: Stoiko Ivanov Reviewed-by: Stoiko Ivanov Signed-off-by: Dietmar Maurer --- diff --git a/PVE/Storage/RBDPlugin.pm b/PVE/Storage/RBDPlugin.pm index ee373d6..0acfb2d 100644 --- a/PVE/Storage/RBDPlugin.pm +++ b/PVE/Storage/RBDPlugin.pm @@ -166,7 +166,14 @@ sub rbd_ls { die $err if $err && $err !~ m/doesn't contain rbd images/ ; - my $result = $raw ne '' ? JSON::decode_json($raw) : []; + my $result; + if ($raw eq '') { + $result = []; + } elsif ($raw =~ m/^(\[.*\])$/s) { # untaint + $result = JSON::decode_json($1); + } else { + die "got unexpected data from rbd ls: '$raw'\n"; + } my $list = {}; @@ -206,7 +213,14 @@ sub rbd_volume_info { run_rbd_command($cmd, errmsg => "rbd error", errfunc => sub {}, outfunc => $parser); - my $volume = $raw ne '' ? JSON::decode_json($raw) : {}; + my $volume; + if ($raw eq '') { + $volume = {}; + } elsif ($raw =~ m/^(\{.*\})$/s) { # untaint + $volume = JSON::decode_json($1); + } else { + die "got unexpected data from rbd info: '$raw'\n"; + } $volume->{parent} = $get_parent_image_name->($volume->{parent}); $volume->{protected} = defined($volume->{protected}) && $volume->{protected} eq "true" ? 1 : undef; @@ -325,7 +339,9 @@ my $find_free_diskname = sub { my $parser = sub { my $line = shift; - push @$disk_list, $line; + if ($line = m/^(.*)$/) { # untaint + push @$disk_list, $1; + } }; eval {