[pve-devel] [PATCH container v2] improve mountpoint parsing

Wolfgang Bumiller w.bumiller at proxmox.com
Thu Feb 4 14:04:49 CET 2016


On Thu, Feb 04, 2016 at 01:40:15PM +0100, Dominik Csapak wrote:
> changes from v1:
> renamed function to verify_*
> added check for ../ at the beginning
> cleaned up regex (\.)? -> \.?
> 
> 
> currently we sanitize mountpoints with sanitize_mountpoint, which
> tries to remove dots, double-dots and multiple slashes, but it does it
> not correctly (e.g. /test/././ gets truncated to /test./ )
> 
> instead of trying to truncate the path, we create a format for mp strings
> which throws an error if /./ or /../ exist (also /. and /.. at the end or
> ../ at the beginning) since there should be no valid use for these in
> mountpoint paths anyway
> 
> with the new behaviour, we don't need sanitize_mountpoint anymore:
> 
> Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>

Acked-by: Wolfgang Bumiller <w.bumiller at proxmox.com>

Please write the patch changelog after the '---'-line below next time
so they don't get included in the commit message when applying with
git-am.

> ---
>  src/PVE/LXC.pm | 37 ++++++++++++++++++++-----------------
>  1 file changed, 20 insertions(+), 17 deletions(-)
> 
> diff --git a/src/PVE/LXC.pm b/src/PVE/LXC.pm
> index f761f33..0ea30f2 100644
> --- a/src/PVE/LXC.pm
> +++ b/src/PVE/LXC.pm
> @@ -38,6 +38,7 @@ my $rootfs_desc = {
>      volume => {
>  	type => 'string',
>  	default_key => 1,
> +	format => 'pve-lxc-mp-string',
>  	format_description => 'volume',
>  	description => 'Volume, device or directory to mount into the container.',
>      },
> @@ -367,10 +368,29 @@ for (my $i = 0; $i < $MAX_LXC_NETWORKS; $i++) {
>      };
>  }
>  
> +PVE::JSONSchema::register_format('pve-lxc-mp-string', \&verify_lxc_mp_string);
> +sub verify_lxc_mp_string{
> +    my ($mp, $noerr) = @_;
> +
> +    # do not allow:
> +    # /./ or /../ 
> +    # /. or /.. at the end
> +    # ../ at the beginning
> +    
> +    if($mp =~ m@/\.\.?/@ ||
> +       $mp =~ m@/\.\.?$@ ||
> +       $mp =~ m@^\.\./@){
> +	return undef if $noerr;
> +	die "$mp contains illegal character sequences\n";
> +    }
> +    return $mp;
> +}
> +
>  my $mp_desc = {
>      %$rootfs_desc,
>      mp => {
>  	type => 'string',
> +	format => 'pve-lxc-mp-string',
>  	format_description => 'Path',
>  	description => 'Path to the mountpoint as seen from inside the container.',
>      },
> @@ -2024,18 +2044,6 @@ sub mountpoint_names {
>      return $reverse ? reverse @names : @names;
>  }
>  
> -# The container might have *different* symlinks than the host. realpath/abs_path
> -# use the actual filesystem to resolve links.
> -sub sanitize_mountpoint {
> -    my ($mp) = @_;
> -    $mp = '/' . $mp; # we always start with a slash
> -    $mp =~ s@/{2,}@/@g; # collapse sequences of slashes
> -    $mp =~ s@/\./@@g; # collapse /./
> -    $mp =~ s@/\.(/)?$@$1@; # collapse a trailing /. or /./
> -    $mp =~ s@(.*)/[^/]+/\.\./@$1/@g; # collapse /../ without regard for symlinks
> -    $mp =~ s@/\.\.(/)?$@$1@; # collapse trailing /.. or /../ disregarding symlinks
> -    return $mp;
> -}
>  
>  sub foreach_mountpoint_full {
>      my ($conf, $reverse, $func) = @_;
> @@ -2046,11 +2054,6 @@ sub foreach_mountpoint_full {
>  	my $mountpoint = $key eq 'rootfs' ? parse_ct_rootfs($value, 1) : parse_ct_mountpoint($value, 1);
>  	next if !defined($mountpoint);
>  
> -	$mountpoint->{mp} = sanitize_mountpoint($mountpoint->{mp});
> -
> -	my $path = $mountpoint->{volume};
> -	$mountpoint->{volume} = sanitize_mountpoint($path) if $path =~ m|^/|;
> -
>  	&$func($key, $mountpoint);
>      }
>  }
> -- 
> 2.1.4
> 
> 
> _______________________________________________
> pve-devel mailing list
> pve-devel at pve.proxmox.com
> http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
> 




More information about the pve-devel mailing list