Configurations registered as UTF-8 will be decoded after reading to Perl's internal string format and thus may contain wide characters. The Digest::SHA::sha1_hex() function croaks on wide characters, so encode again before calling the function.
Signed-off-by: Fiona Ebner <[email protected]> --- Changes in v4: * rather than searching for wide characters, tell parse_config() directly whether the file was registered as UTF-8 src/PVE/SectionConfig.pm | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/PVE/SectionConfig.pm b/src/PVE/SectionConfig.pm index 84ff81a..9ff91ee 100644 --- a/src/PVE/SectionConfig.pm +++ b/src/PVE/SectionConfig.pm @@ -103,6 +103,7 @@ use warnings; use Carp; use Digest::SHA; +use Encode qw(encode); use PVE::Exception qw(raise_param_exc); use PVE::JSONSchema qw(get_standard_option); @@ -1103,10 +1104,10 @@ sub get_property_schema { =head3 $base->parse_config(...) -=head3 $base->parse_config($filename, $raw [, $allow_unknown ]) +=head3 $base->parse_config($filename, $raw [, $allow_unknown [, $options ]]) - $config = PVE::Example::BasePlugin->parse_config($filename, $raw, $allow_unknown) - $config = $class->parse_config($filename, $raw, $allow_unknown) + $config = PVE::Example::BasePlugin->parse_config($filename, $raw, $allow_unknown, $options) + $config = $class->parse_config($filename, $raw, $allow_unknown, $options) Parses the contents of a file as C<L<PVE::SectionConfig>>, returning the parsed data annotated with additional information (see below). @@ -1127,6 +1128,18 @@ The raw content of C<$filename>. Whether to allow parsing unknown I<types>. +=item C<$options> (optional) + +Further options: + +=over + +=item C<$utf8> + +The config file was registered as UTF-8 encoded. + +=back + =back The returned hash is structured as follows: @@ -1205,7 +1218,7 @@ The error. =cut sub parse_config { - my ($class, $filename, $raw, $allow_unknown) = @_; + my ($class, $filename, $raw, $allow_unknown, $options) = @_; my $pdata = $class->private(); @@ -1214,7 +1227,13 @@ sub parse_config { $raw = '' if !defined($raw); - my $digest = Digest::SHA::sha1_hex($raw); + my $bytes = $raw; + if ($options && $options->{utf8}) { + # Digest::SHA croaks on wide characters + $bytes = encode('UTF-8', $raw); + } + + my $digest = Digest::SHA::sha1_hex($bytes); my $pri = 1; -- 2.47.3
