[pve-devel] [PATCH storage] Plugins: en/decode notes as UTF-8
Dominik Csapak
d.csapak at proxmox.com
Wed Mar 9 10:51:37 CET 2022
sorry i forgot to fix the s/sucessfully/successfully/ typo...
also:
On 3/9/22 09:21, Dominik Csapak wrote:
> When writing into the file, explicitly utf8 encode it, and then try to
> utf8 decode it on read.
>
> If the notes are not valid utf8, we assume it was an iso-8859 comment
> and return is at is was.
>
and return *it* *as* *it* was
s/t confusion :P
> Technically this is a breaking change, since there are iso-8859 comments
> that would sucessfully decode as utf8, for example:
> the byte sequence "C2 A9" would be "£" in iso, but would decode to "£".
>
> From what i can tell though, this is rather unlikely to happen for
> "real world" notes, because the first byte would be in the range of
> C0-F7 (which are mostly language dependent characters like "Â")
> and the following bytes would have to be in the range of
> 80-BF, which are only special characters like "£" (or undefined)
>
> Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
> ---
> PVE/Storage/DirPlugin.pm | 9 +++++++--
> PVE/Storage/Plugin.pm | 3 ++-
> 2 files changed, 9 insertions(+), 3 deletions(-)
>
> diff --git a/PVE/Storage/DirPlugin.pm b/PVE/Storage/DirPlugin.pm
> index c60818b..2c58a17 100644
> --- a/PVE/Storage/DirPlugin.pm
> +++ b/PVE/Storage/DirPlugin.pm
> @@ -4,6 +4,7 @@ use strict;
> use warnings;
>
> use Cwd;
> +use Encode qw(decode encode);
> use File::Path;
> use IO::File;
> use POSIX;
> @@ -103,7 +104,10 @@ sub get_volume_notes {
> my $path = $class->filesystem_path($scfg, $volname);
> $path .= $class->SUPER::NOTES_EXT;
>
> - return PVE::Tools::file_get_contents($path) if -f $path;
> + if (-f $path) {
> + my $data = PVE::Tools::file_get_contents($path);
> + return eval { decode('UTF-8', $data, 1) } // $data;
> + }
>
> return '';
> }
> @@ -120,7 +124,8 @@ sub update_volume_notes {
> $path .= $class->SUPER::NOTES_EXT;
>
> if (defined($notes) && $notes ne '') {
> - PVE::Tools::file_set_contents($path, $notes);
> + my $encoded = encode('UTF-8', $notes);
> + PVE::Tools::file_set_contents($path, $encoded);
> } else {
> unlink $path or $! == ENOENT or die "could not delete notes - $!\n";
> }
> diff --git a/PVE/Storage/Plugin.pm b/PVE/Storage/Plugin.pm
> index a6b0bdd..0c21987 100644
> --- a/PVE/Storage/Plugin.pm
> +++ b/PVE/Storage/Plugin.pm
> @@ -3,6 +3,7 @@ package PVE::Storage::Plugin;
> use strict;
> use warnings;
>
> +use Encode qw(decode);
> use Fcntl ':mode';
> use File::chdir;
> use File::Path;
> @@ -1172,7 +1173,7 @@ my $get_subdir_files = sub {
> my $notes_fn = $original.NOTES_EXT;
> if (-f $notes_fn) {
> my $notes = PVE::Tools::file_read_firstline($notes_fn);
> - $info->{notes} = $notes if defined($notes);
> + $info->{notes} = eval { decode('UTF-8', $notes, 1) } // $notes if defined($notes);
> }
>
> $info->{protected} = 1 if -e PVE::Storage::protection_file_path($original);
More information about the pve-devel
mailing list