[CRIU] [PATCH] mnt: Introduce and use issubpath helper
Andrew Vagin
avagin at parallels.com
Fri Nov 7 04:34:37 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>
Acked-by: Andrew Vagin <avagin 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');
> +}
> +
> /*
> * 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