[CRIU] [PATCH] mnt: Introduce and use issubpath helper

Andrew Vagin avagin at parallels.com
Fri Nov 7 14:23:06 PST 2014


On Thu, Nov 06, 2014 at 04:40:34PM +0400, Pavel Emelyanov wrote:
> When we validate the mount tree not to have overmounts we need to 
> check one path to be the sub-path of another. Here's a helper for
> this.
> 
> Signed-off-by: Pavel Emelyanov <xemul at parallels.com>
> 
> ---
> 
> diff --git a/include/util.h b/include/util.h
> index 0816029..e54823b 100644
> --- a/include/util.h
> +++ b/include/util.h
> @@ -192,13 +192,17 @@ extern int read_fd_link(int lfd, char *buf, size_t size);
>  int vaddr_to_pfn(unsigned long vaddr, u64 *pfn);
>  
>  /*
> - * Check whether @str starts with @sub
> + * Check whether @str starts with @sub and report the
> + * next character of @str in @end
>   */
> -static inline bool strstartswith(const char *str, const char *sub)
> +static inline bool strstartswith2(const char *str, const char *sub, char *end)
>  {
>  	while (1) {
> -		if (*sub == '\0') /* end of sub -- match */
> +		if (*sub == '\0') /* end of sub -- match */ {
> +			if (end)
> +				*end = *str;
>  			return true;
> +		}
>  		if (*str == '\0') /* end of str, sub is NOT ended -- miss */
>  			return false;
>  		if (*str != *sub)
> @@ -209,6 +213,24 @@ static inline bool strstartswith(const char *str, const char *sub)
>  	}
>  }
>  
> +static inline bool strstartswith(const char *str, const char *sub)
> +{
> +	return strstartswith2(str, sub, NULL);
> +}
> +
> +/*
> + * Checks whether the @path has @sub_path as a sub path, i.e.
> + * sub_path is the beginning of path and the last component
> + * match is full (next character terminates path component).
> + */
> +
> +static inline bool issubpath(const char *path, const char *sub_path)
> +{
> +	char end;
> +	return strstartswith2(path, sub_path, &end) &&
> +		(end == '/' || end == '\0');
> +}

(00.408555)      1: Error (mount.c:420): issubpath("/asd", "/") -> 0
(00.408582)      1: Error (mount.c:421): issubpath("/asd/qwe", "/asd") -> 1

The first testcase failed.

> +
>  /*
>   * mkdir -p
>   */
> diff --git a/mount.c b/mount.c
> index f62fd04..3ec70f8 100644
> --- a/mount.c
> +++ b/mount.c
> @@ -479,19 +479,11 @@ static int validate_mounts(struct mount_info *info, bool for_dump)
>  		}
>  
>  		list_for_each_entry(t, &m->parent->children, siblings) {
> -			int tlen, mlen;
> -
>  			if (m == t)
>  				continue;
> -
> -			tlen = strlen(t->mountpoint);
> -			mlen = strlen(m->mountpoint);
> -			if (mlen < tlen)
> -				continue;
> -			if (strncmp(t->mountpoint, m->mountpoint, tlen))
> -				continue;
> -			if (mlen > tlen && m->mountpoint[tlen] != '/')
> +			if (!issubpath(m->mountpoint, t->mountpoint))
>  				continue;
> +
>  			pr_err("%d:%s is overmounted\n", m->mnt_id, m->mountpoint);
>  			return -1;
>  		}
> 
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu


More information about the CRIU mailing list