[libvirt] [PATCH v2 3/8] LXC: sort the uidmap/gidmap of domain

Daniel P. Berrange berrange at redhat.com
Fri May 10 10:27:55 UTC 2013


On Fri, May 10, 2013 at 05:58:12PM +0800, Gao feng wrote:
> Make sure the mapping line contains the root user of container
> is the first element of idmap array. So we can get the real
> user id on host for the container easily.
> 
> This patch also check the map information, User must map
> the root user of container to any user of host.
> 
> Signed-off-by: Gao feng <gaofeng at cn.fujitsu.com>
> ---
>  src/conf/domain_conf.c | 25 ++++++++++++++++++++++++-
>  1 file changed, 24 insertions(+), 1 deletion(-)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 46be458..5bc4b8c 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -9815,7 +9815,8 @@ virDomainIdmapDefParseXML(const xmlNodePtr *node,
>                            ssize_t num)
>  {
>      int i;
> -    struct idmap *idmap = NULL;
> +    struct idmap *idmap = NULL, map;
> +    int index = -1;
>      xmlNodePtr save_ctxt = ctxt->node;
>  
>      if (VIR_ALLOC_N(idmap, num) < 0) {
> @@ -9828,7 +9829,29 @@ virDomainIdmapDefParseXML(const xmlNodePtr *node,
>          virXPathUInt("string(./@start)", ctxt, &idmap[i].start);
>          virXPathUInt("string(./@target)", ctxt, &idmap[i].target);
>          virXPathUInt("string(./@count)", ctxt, &idmap[i].count);
> +
> +        if (idmap[i].start == 0) {
> +            index = i;
> +            map.start = idmap[i].start;
> +            map.target = idmap[i].target;
> +            map.count = idmap[i].count;
> +        }
> +    }
> +    /* Make sure the mapping line contains the root user of container
> +     * is the first element of idmap array. So we can get the real
> +     * user id on host for the container easily. */
> +    if (index != -1) {
> +        idmap[index] = idmap[0];
> +        idmap[0] = map;

IMHO it would be better to just use qsort() with 'start' as the sort
key to ensure the entire array is sorted, not merely the first
element.

> +    } else {
> +        /* Root user of container isn't mapped to any user of host,
> +         * return error. */
> +        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                       _("You must map the root user of container"));
> +        VIR_FREE(idmap);
> +        idmap = NULL;
>      }
> +
>   error:
>      ctxt->node = save_ctxt;
>      return idmap;

Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list