Otherwise containers fail to start even if they aren't trying to map ids. Also don't allocate buf unless we need to.
Reported-by: Alexander Vladimirov <alexander.idkfa.vladimi...@gmail.com> Signed-off-by: Serge Hallyn <serge.hal...@ubuntu.com> --- src/lxc/conf.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/lxc/conf.c b/src/lxc/conf.c index 85e1c61..af75690 100644 --- a/src/lxc/conf.c +++ b/src/lxc/conf.c @@ -2479,17 +2479,20 @@ int lxc_map_ids(struct lxc_list *idmap, pid_t pid) struct lxc_list *iterator; struct id_map *map; int ret = 0; - char *buf,*pos; enum idtype type; - - /* The kernel only takes <= 4k for writes to /proc/<nr>/[ug]id_map */ - buf = pos = malloc(4096); - if (!buf) - return -ENOMEM; + char *buf = NULL, *pos; for(type = ID_TYPE_UID; type <= ID_TYPE_GID; type++) { - int left,fill; + int left, fill; + + pos = buf; lxc_list_for_each(iterator, idmap) { + /* The kernel only takes <= 4k for writes to /proc/<nr>/[ug]id_map */ + if (!buf) + buf = pos = malloc(4096); + if (!buf) + return -ENOMEM; + map = iterator->elem; if (map->idtype == type) { left = 4096 - (pos - buf); @@ -2500,13 +2503,15 @@ int lxc_map_ids(struct lxc_list *idmap, pid_t pid) pos += fill; } } + if (pos == buf) // no mappings were found + continue; ret = write_id_mapping(type, pid, buf, pos-buf); if (ret) break; - pos = buf; } - free(buf); + if (buf) + free(buf); return ret; } -- 1.8.1.2 ------------------------------------------------------------------------------ Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_d2d_mar _______________________________________________ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel