[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 15/18] xenstore: New function xs_path_is_subpath



On Fri, 2011-12-09 at 18:54 +0000, Ian Jackson wrote:
> This utility function compares two paths, textually and reports
> whether one is a subpath (a child path) of the other.
> 
> Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
> ---
>  tools/xenstore/xs.c |   17 +++++++++++++++++
>  tools/xenstore/xs.h |    7 +++++++
>  2 files changed, 24 insertions(+), 0 deletions(-)
> 
> diff --git a/tools/xenstore/xs.c b/tools/xenstore/xs.c
> index 8e54fe0..0a01675 100644
> --- a/tools/xenstore/xs.c
> +++ b/tools/xenstore/xs.c
> @@ -950,6 +950,23 @@ char *xs_get_domain_path(struct xs_handle *h, unsigned 
> int domid)
>       return xs_single(h, XBT_NULL, XS_GET_DOMAIN_PATH, domid_str, NULL);
>  }
>  
> +bool xs_path_is_subpath(const char *parent, const char *child)
> +{
> +        size_t childlen = strlen(child);
> +        size_t parentlen = strlen(parent);
> +
> +     if (childlen < parentlen)
> +             return false;
> +
> +     if (memcmp(child, parent, parentlen))
> +             return false;
> +
> +     if (childlen > parentlen && child[parentlen] != '/')
> +             return false;

It took me a second to figure that this last statement was preventing
false positives from sibling directories where one is a substring of the
other. Worth a comment?

Doesn't the correctness of this depend on whether parent has a trailing
slash or not though?

        parent  = "foo"                 len = 3
        child   = "foo/bar"
        => child[3] == '/' => GOOD

        parent  = "foo/"                len = 4
        child   = "foo/bar
        => child[4] == 'b' => BAD.

Does adding
        if parent[parentlen] == '/' parentlen--;
beforehand help?

> +
> +     return true;
> +}
> +
>  bool xs_is_domain_introduced(struct xs_handle *h, unsigned int domid)
>  {
>       char *domain = single_with_domid(h, XS_IS_DOMAIN_INTRODUCED, domid);
> diff --git a/tools/xenstore/xs.h b/tools/xenstore/xs.h
> index 63f535d..8d49e50 100644
> --- a/tools/xenstore/xs.h
> +++ b/tools/xenstore/xs.h
> @@ -207,6 +207,13 @@ bool xs_release_domain(struct xs_handle *h, unsigned int 
> domid);
>   */
>  char *xs_get_domain_path(struct xs_handle *h, unsigned int domid);
>  
> +/* Returns true if child is either equal to parent, or a node underneath
> + * parent; or false otherwise.  Done by string comparison, so relative and
> + * absolute pathnames never in a parent/child relationship by this
> + * definition.  Cannot fail.
> + */
> +bool xs_path_is_subpath(const char *parent, const char *child);
> +
>  /* Return whether the domain specified has been introduced to xenstored.
>   */
>  bool xs_is_domain_introduced(struct xs_handle *h, unsigned int domid);



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.