On Mon, 15 Jul 2013 13:47:40 -0500 Serge Hallyn <serge.hal...@ubuntu.com> wrote:
> > 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. > > Reported-by: Dwight Engen <dwight.en...@oracle.com> > Signed-off-by: Serge Hallyn <serge.hal...@ubuntu.com> > --- > src/lxc/conf.c | 13 +++++++++++++ > src/lxc/confile.c | 6 ++++++ > 2 files changed, 19 insertions(+) > > diff --git a/src/lxc/conf.c b/src/lxc/conf.c > index dc521b5..21614d9 100644 > --- a/src/lxc/conf.c > +++ b/src/lxc/conf.c > @@ -3123,6 +3123,18 @@ int lxc_clear_config_caps(struct lxc_conf *c) > 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) > { > struct lxc_list *it,*next; > @@ -3226,5 +3238,6 @@ void lxc_conf_free(struct lxc_conf *conf) > lxc_clear_hooks(conf, "lxc.hook"); > lxc_clear_mount_entries(conf); > lxc_clear_saved_nics(conf); > + lxc_clear_idmaps(conf); > free(conf); > } > diff --git a/src/lxc/confile.c b/src/lxc/confile.c > index a7db117..05370f0 100644 > --- a/src/lxc/confile.c > +++ b/src/lxc/confile.c > @@ -1945,6 +1945,12 @@ void write_config(FILE *fout, struct lxc_conf > *c) } > lxc_list_for_each(it, &c->caps) > 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->type == ID_TYPE_UID ? 'u' : 'c', > idmap->nsid, > + idmap->hostid, idmap->range); Hi Serge, I'm getting: confile.c:1951:9: error: ‘struct id_map’ has no member named ‘type’ I think you wanted idmap->idtype :) With that change, it builds but I'm getting a segfault when doing a lxc-clone -s -o ol64-01 -n ol64-02 (and ol64-01 has lxc.id_map entries). Here is the gdb backtrace, I'll look into it if you don't have time. Starting program: /usr/bin/lxc-clone -s -o ol64-01 -n ol64-04 [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib64/libthread_db.so.1". Detaching after fork from child process 28359. Detaching after fork from child process 28361. Program received signal SIGSEGV, Segmentation fault. 0x00007f99e689e08e in write_config (fout=fout@entry=0x1b79670, c=0x1b77400) at confile.c:1950 1950 confile.c: No such file or directory. Missing separate debuginfos, use: debuginfo-install lxc-0.9.x-1.fc18.x86_64 (gdb) bt #0 0x00007f99e689e08e in write_config (fout=fout@entry=0x1b79670, c=0x1b77400) at confile.c:1950 #1 0x00007f99e68a6c6b in lxcapi_save_config (c=0x1b764d0, alt_file=<optimized out>) at lxccontainer.c:1214 #2 0x00007f99e68a99b8 in lxcapi_clone (c=<optimized out>, newname=<optimized out>, lxcpath=<optimized out>, flags=<optimized out>, bdevtype=0x0, bdevdata=0x0, newsize=0, hookargs=0x0) at lxccontainer.c:1963 #3 0x0000000000400d2f in main () > + } > for (i=0; i<NUM_LXC_HOOKS; i++) { > lxc_list_for_each(it, &c->hooks[i]) > fprintf(fout, "lxc.hook.%s = %s\n", ------------------------------------------------------------------------------ See everything from the browser to the database with AppDynamics Get end-to-end visibility with application monitoring from AppDynamics Isolate bottlenecks and diagnose root cause in seconds. Start your free trial of AppDynamics Pro today! http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk _______________________________________________ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel