userns: clear and save id_map (v2)

Otherwise (a) there is a memory leak when using user namespaces and
clearing a config, and (b) saving a container configuration file doesn't
maintain the userns mapping.  For instance, if container c1 has
lxc.id_map configuration entries, then

python3
import lxc
c=lxc.Container("c1")
c.save_config("/tmp/config1")

should show 'lxc.id_map =' entries in /tmp/config1.

Changelog for v2:
   1. fix incorrect saving of group types (s/'c'/'g')
   2. fix typo -> idmap->type should be idmap->idtype

Reported-by: Dwight Engen <dwight.engen@oracle.com>
Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
Acked-by: Dwight Engen <dwight.engen@oracle.com>
Tested-by: Dwight Engen <dwight.engen@oracle.com>
This commit is contained in:
Serge Hallyn 2013-07-15 16:42:15 -05:00
parent 3ce746862b
commit 27c27d73e1
2 changed files with 19 additions and 0 deletions

View File

@ -3079,6 +3079,18 @@ int lxc_clear_config_caps(struct lxc_conf *c)
return 0; return 0;
} }
int lxc_clear_idmaps(struct lxc_conf *c)
{
struct lxc_list *it, *next;
lxc_list_for_each_safe(it, &c->id_map, next) {
lxc_list_del(it);
free(it->elem);
free(it);
}
return 0;
}
int lxc_clear_cgroups(struct lxc_conf *c, const char *key) int lxc_clear_cgroups(struct lxc_conf *c, const char *key)
{ {
struct lxc_list *it,*next; struct lxc_list *it,*next;
@ -3182,5 +3194,6 @@ void lxc_conf_free(struct lxc_conf *conf)
lxc_clear_hooks(conf, "lxc.hook"); lxc_clear_hooks(conf, "lxc.hook");
lxc_clear_mount_entries(conf); lxc_clear_mount_entries(conf);
lxc_clear_saved_nics(conf); lxc_clear_saved_nics(conf);
lxc_clear_idmaps(conf);
free(conf); free(conf);
} }

View File

@ -1945,6 +1945,12 @@ void write_config(FILE *fout, struct lxc_conf *c)
} }
lxc_list_for_each(it, &c->caps) lxc_list_for_each(it, &c->caps)
fprintf(fout, "lxc.cap.drop = %s\n", (char *)it->elem); fprintf(fout, "lxc.cap.drop = %s\n", (char *)it->elem);
lxc_list_for_each(it, &c->id_map) {
struct id_map *idmap = it->elem;
fprintf(fout, "lxc.id_map = %c %lu %lu %lu\n",
idmap->idtype == ID_TYPE_UID ? 'u' : 'g', idmap->nsid,
idmap->hostid, idmap->range);
}
for (i=0; i<NUM_LXC_HOOKS; i++) { for (i=0; i<NUM_LXC_HOOKS; i++) {
lxc_list_for_each(it, &c->hooks[i]) lxc_list_for_each(it, &c->hooks[i])
fprintf(fout, "lxc.hook.%s = %s\n", fprintf(fout, "lxc.hook.%s = %s\n",