2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-10 03:06:37 +00:00

fhem.pl: json2namevalue fix for bogus input (Forum #94629)

git-svn-id: https://svn.fhem.de/fhem/trunk@18013 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2018-12-20 11:47:38 +00:00
parent e333992b67
commit e1659ab007

View File

@ -4940,12 +4940,12 @@ json2nameValue($;$$)
if($s eq '\\') { if($s eq '\\') {
$esc = !$esc; $esc = !$esc;
} elsif($s eq '"' && !$esc) { } elsif($s eq '"' && !$esc) {
return (substr($t,1,$off-1), substr($t,$off+1)); return (undef,substr($t,1,$off-1), substr($t,$off+1));
} else { } else {
$esc = 0; $esc = 0;
} }
} }
return ($t, ""); return ('json2nameValue: no closing " found', "","");
} }
sub sub
@ -4955,11 +4955,12 @@ json2nameValue($;$$)
my $depth=1; my $depth=1;
my ($esc, $inquote); my ($esc, $inquote);
$inquote = 0;
for(my $off = 1; $off < length($t); $off++){ for(my $off = 1; $off < length($t); $off++){
my $s = substr($t,$off,1); my $s = substr($t,$off,1);
if($s eq $cc && !$inquote) { # close character if($s eq $cc && !$inquote) { # close character
$depth--; $depth--;
return (substr($t,1,$off-1), substr($t,$off+1)) if(!$depth); return ("", substr($t,1,$off-1), substr($t,$off+1)) if(!$depth);
} elsif($s eq $oc && !$inquote) { # open character } elsif($s eq $oc && !$inquote) { # open character
$depth++; $depth++;
@ -4974,7 +4975,7 @@ json2nameValue($;$$)
$esc = 0; $esc = 0;
} }
} }
return ($t, ""); # error return ("json2nameValue: no closing $cc found", "", "");
} }
sub sub
@ -4994,25 +4995,30 @@ json2nameValue($;$$)
eObj($$$$$$) eObj($$$$$$)
{ {
my ($ret,$map,$name,$val,$in,$prefix) = @_; my ($ret,$map,$name,$val,$in,$prefix) = @_;
my $err;
if($val =~ m/^"/) { if($val =~ m/^"/) {
($val, $in) = lStr($val); ($err, $val, $in) = lStr($val);
return ($err,undef) if($err);
$val =~ s/\\u([0-9A-F]{4})/chr(hex($1))/gsie; # toJSON reverse $val =~ s/\\u([0-9A-F]{4})/chr(hex($1))/gsie; # toJSON reverse
setVal($ret, $map, $prefix, $name, $val); setVal($ret, $map, $prefix, $name, $val);
} elsif($val =~ m/^{/) { # } } elsif($val =~ m/^{/) { # }
($val, $in) = lObj($val, '{', '}'); ($err, $val, $in) = lObj($val, '{', '}');
return ($err,undef) if($err);
my $r2 = json2nameValue($val); my $r2 = json2nameValue($val);
foreach my $k (keys %{$r2}) { foreach my $k (keys %{$r2}) {
setVal($ret, $map, $prefix, "${name}_$k", $r2->{$k}); setVal($ret, $map, $prefix, "${name}_$k", $r2->{$k});
} }
} elsif($val =~ m/^\[/) { } elsif($val =~ m/^\[/) {
($val, $in) = lObj($val, '[', ']'); ($err, $val, $in) = lObj($val, '[', ']');
return ($err,undef) if($err);
my $idx = 1; my $idx = 1;
$val =~ s/^\s*//; $val =~ s/^\s*//;
while($val) { while($val) {
$val = eObj($ret, $map, $name."_$idx", $val, $val, $prefix); ($err,$val) = eObj($ret, $map, $name."_$idx", $val, $val, $prefix);
return ($err,undef) if($err);
$val =~ s/^\s*,\s*//; $val =~ s/^\s*,\s*//;
$val =~ s/\s*$//; $val =~ s/\s*$//;
$idx++; $idx++;
@ -5034,15 +5040,21 @@ json2nameValue($;$$)
Log 1, "Error parsing >$val< for $prefix$name"; Log 1, "Error parsing >$val< for $prefix$name";
$in = ""; $in = "";
} }
return $in; return (undef, $in);
} }
$in = $1 if($in =~ m/^{(.*)}$/s); $in = $1 if($in =~ m/^{(.*)}$/s);
my $err;
while($in =~ m/^\s*"([^"]+)"\s*:\s*(.*)$/s) { while($in =~ m/^\s*"([^"]+)"\s*:\s*(.*)$/s) {
my ($name,$val) = ($1,$2); my ($name,$val) = ($1,$2);
$name =~ s/[^a-z0-9._\-\/]/_/gsi; $name =~ s/[^a-z0-9._\-\/]/_/gsi;
$in = eObj(\%ret, $map, $name, $val, $in, $prefix); ($err,$in) = eObj(\%ret, $map, $name, $val, $in, $prefix);
if($err) {
Log 4, $err;
%ret = ();
return \%ret;
}
$in =~ s/^\s*,\s*//; $in =~ s/^\s*,\s*//;
} }
return \%ret; return \%ret;