[lxc-devel] [PATCH 1/1] idmap_add_id: fix broken behavior
Stéphane Graber
stgraber at ubuntu.com
Fri Jan 24 16:43:46 UTC 2014
On Thu, Jan 23, 2014 at 10:23:24PM -0600, Serge Hallyn wrote:
> The geteuid() addition is being made the first element of the lxc_list,
> but the first element is just a head whose entry is ignored. Therefore
> userns_exec_1() was starting its tasks without the caller's uid mapped
> into the namespace.
>
> Signed-off-by: Serge Hallyn <serge.hallyn at ubuntu.com>
Acked-by: Stéphane Graber <stgraber at ubuntu.com>
> ---
> src/lxc/conf.c | 52 +++++++++++++++++++++++++---------------------------
> 1 file changed, 25 insertions(+), 27 deletions(-)
>
> diff --git a/src/lxc/conf.c b/src/lxc/conf.c
> index d2942cb..30d0d6b 100644
> --- a/src/lxc/conf.c
> +++ b/src/lxc/conf.c
> @@ -2170,9 +2170,9 @@ static int setup_caps(struct lxc_list *caps)
> DEBUG("drop capability '%s' (%d)", drop_entry, capid);
>
> if (prctl(PR_CAPBSET_DROP, capid, 0, 0, 0)) {
> - SYSERROR("failed to remove %s capability", drop_entry);
> - return -1;
> - }
> + SYSERROR("failed to remove %s capability", drop_entry);
> + return -1;
> + }
>
> }
>
> @@ -2240,9 +2240,9 @@ static int dropcaps_except(struct lxc_list *caps)
> if (caplist[i])
> continue;
> if (prctl(PR_CAPBSET_DROP, i, 0, 0, 0)) {
> - SYSERROR("failed to remove capability %d", i);
> - return -1;
> - }
> + SYSERROR("failed to remove capability %d", i);
> + return -1;
> + }
> }
>
> DEBUG("capabilities have been setup");
> @@ -3135,7 +3135,7 @@ int lxc_map_ids(struct lxc_list *idmap, pid_t pid)
> * Return true if id was found, false otherwise.
> */
> bool get_mapped_rootid(struct lxc_conf *conf, enum idtype idtype,
> - unsigned long *val)
> + unsigned long *val)
> {
> struct lxc_list *it;
> struct id_map *map;
> @@ -3266,7 +3266,7 @@ int lxc_create_tty(const char *name, struct lxc_conf *conf)
> DEBUG("allocated pty '%s' (%d/%d)",
> pty_info->name, pty_info->master, pty_info->slave);
>
> - /* Prevent leaking the file descriptors to the container */
> + /* Prevent leaking the file descriptors to the container */
> fcntl(pty_info->master, F_SETFD, FD_CLOEXEC);
> fcntl(pty_info->slave, F_SETFD, FD_CLOEXEC);
>
> @@ -3969,29 +3969,31 @@ static struct lxc_list *idmap_add_id(struct lxc_conf *conf, uid_t uid)
> struct lxc_list *new = NULL, *tmp, *it, *next;
> struct id_map *entry;
>
> + new = malloc(sizeof(*new));
> + if (!new) {
> + ERROR("Out of memory building id map");
> + return NULL;
> + }
> + lxc_list_init(new);
> +
> if (hostid_mapped < 0) {
> hostid_mapped = find_unmapped_nsuid(conf);
> - if (hostid_mapped < 0) {
> - ERROR("Could not find free uid to map");
> - return NULL;
> - }
> - new = malloc(sizeof(*new));
> - if (!new) {
> - ERROR("Out of memory building id map");
> - return NULL;
> - }
> + if (hostid_mapped < 0)
> + goto err;
> + tmp = malloc(sizeof(*tmp));
> + if (!tmp)
> + goto err;
> entry = malloc(sizeof(*entry));
> if (!entry) {
> - free(new);
> - ERROR("Out of memory building idmap entry");
> - return NULL;
> + free(tmp);
> + goto err;
> }
> - new->elem = entry;
> + tmp->elem = entry;
> entry->idtype = ID_TYPE_UID;
> entry->nsid = hostid_mapped;
> entry->hostid = (unsigned long)uid;
> entry->range = 1;
> - lxc_list_init(new);
> + lxc_list_add_tail(new, tmp);
> }
> lxc_list_for_each_safe(it, &conf->id_map, next) {
> tmp = malloc(sizeof(*tmp));
> @@ -4005,11 +4007,7 @@ static struct lxc_list *idmap_add_id(struct lxc_conf *conf, uid_t uid)
> memset(entry, 0, sizeof(*entry));
> memcpy(entry, it->elem, sizeof(*entry));
> tmp->elem = entry;
> - if (!new) {
> - new = tmp;
> - lxc_list_init(new);
> - } else
> - lxc_list_add_tail(new, tmp);
> + lxc_list_add_tail(new, tmp);
> }
>
> return new;
> --
> 1.8.5.3
>
> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel
--
Stéphane Graber
Ubuntu developer
http://www.ubuntu.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20140124/2f17638f/attachment.pgp>
More information about the lxc-devel
mailing list