From d2cfdb3682d2315610941198f350eee3d4c0670a Mon Sep 17 00:00:00 2001 From: Wolfgang Bumiller Date: Tue, 16 Aug 2016 09:39:18 +0200 Subject: [PATCH 1/1] update to lxc-2.0.4 and pull --rcfile as common option branch --- Makefile | 6 +- debian/changelog | 8 + ...conf-set-pty_info-to-NULL-after-free.patch | 30 -- ...ve-rcfile-to-the-common-options-list.patch | 427 ++++++++++++++++++ ...ols-set-configfile-after-load_config.patch | 245 ++++++++++ .../0003-doc-add-rcfile-to-common-opts.patch | 39 ++ debian/patches/series | 4 +- lxc.tgz | Bin 13200761 -> 13466186 bytes 8 files changed, 725 insertions(+), 34 deletions(-) delete mode 100644 debian/patches/0001-conf-set-pty_info-to-NULL-after-free.patch create mode 100644 debian/patches/0001-tools-move-rcfile-to-the-common-options-list.patch create mode 100644 debian/patches/0002-tools-set-configfile-after-load_config.patch create mode 100644 debian/patches/0003-doc-add-rcfile-to-common-opts.patch diff --git a/Makefile b/Makefile index 3f6b4fd..a896a1c 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,8 @@ RELEASE=4.2 PACKAGE=lxc-pve -LXCVER=2.0.3 -DEBREL=4 +LXCVER=2.0.4 +DEBREL=1 SRCDIR=lxc SRCTAR=${SRCDIR}.tgz @@ -30,7 +30,7 @@ deb ${DEBS}: ${SRCTAR} .PHONY: download download ${SRCTAR}: rm -rf ${SRCDIR} ${SRCTAR} - git clone -b stable-2.0 git://github.com/lxc/lxc + git clone -b lxc-${LXCVER} git://github.com/lxc/lxc tar czf ${SRCTAR}.tmp ${SRCDIR} mv ${SRCTAR}.tmp ${SRCTAR} diff --git a/debian/changelog b/debian/changelog index 9819b65..ff4794a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +lxc (2.0.4-1) unstable; urgency=medium + + * update to lxc-2.0.4 + + * add --rcfile to the common options list + + -- Proxmox Support Team Tue, 16 Aug 2016 09:43:59 +0200 + lxc (2.0.3-4) unstable; urgency=medium * use dh_apparmor for the lxc-containers profile diff --git a/debian/patches/0001-conf-set-pty_info-to-NULL-after-free.patch b/debian/patches/0001-conf-set-pty_info-to-NULL-after-free.patch deleted file mode 100644 index 795ad9c..0000000 --- a/debian/patches/0001-conf-set-pty_info-to-NULL-after-free.patch +++ /dev/null @@ -1,30 +0,0 @@ -From e00c024230e457a0f37ea5c90bd8caac0c30020e Mon Sep 17 00:00:00 2001 -From: Wolfgang Bumiller -Date: Thu, 28 Jul 2016 11:52:18 +0200 -Subject: [PATCH] conf: set pty_info to NULL after free - -This fixes a double free corruption on container-requested -reboots when lxc_spawn() fails before receiving the ttys, as -lxc_fini() (part of __lxc_start()'s cleanup) calls -lxc_delete_tty(). - -Signed-off-by: Wolfgang Bumiller ---- - src/lxc/conf.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/src/lxc/conf.c b/src/lxc/conf.c -index 48a2978..1e330ac 100644 ---- a/src/lxc/conf.c -+++ b/src/lxc/conf.c -@@ -3327,6 +3327,7 @@ void lxc_delete_tty(struct lxc_tty_info *tty_info) - } - - free(tty_info->pty_info); -+ tty_info->pty_info = NULL; - tty_info->nbtty = 0; - } - --- -2.1.4 - diff --git a/debian/patches/0001-tools-move-rcfile-to-the-common-options-list.patch b/debian/patches/0001-tools-move-rcfile-to-the-common-options-list.patch new file mode 100644 index 0000000..a1e2e2f --- /dev/null +++ b/debian/patches/0001-tools-move-rcfile-to-the-common-options-list.patch @@ -0,0 +1,427 @@ +From dacc363d7d21434b764d95e4bd3d740c8995e951 Mon Sep 17 00:00:00 2001 +From: Wolfgang Bumiller +Date: Fri, 12 Aug 2016 12:21:22 +0200 +Subject: [PATCH 1/3] tools: move --rcfile to the common options list + +In almost all commands it's a useful addition to the -n +switch which is a common option, too. + +Signed-off-by: Wolfgang Bumiller +--- + src/lxc/arguments.c | 1 + + src/lxc/arguments.h | 2 ++ + src/lxc/tools/lxc_attach.c | 1 - + src/lxc/tools/lxc_cgroup.c | 12 +++++++++++- + src/lxc/tools/lxc_checkpoint.c | 10 ++++++++++ + src/lxc/tools/lxc_console.c | 12 +++++++++++- + src/lxc/tools/lxc_copy.c | 11 ++++++++++- + src/lxc/tools/lxc_destroy.c | 12 +++++++++++- + src/lxc/tools/lxc_device.c | 11 ++++++++++- + src/lxc/tools/lxc_freeze.c | 12 +++++++++++- + src/lxc/tools/lxc_info.c | 12 +++++++++++- + src/lxc/tools/lxc_snapshot.c | 12 +++++++++++- + src/lxc/tools/lxc_stop.c | 11 ++++++++++- + src/lxc/tools/lxc_unfreeze.c | 12 +++++++++++- + src/lxc/tools/lxc_wait.c | 12 +++++++++++- + 15 files changed, 131 insertions(+), 12 deletions(-) + +diff --git a/src/lxc/arguments.c b/src/lxc/arguments.c +index c2f7b67..0d2b203 100644 +--- a/src/lxc/arguments.c ++++ b/src/lxc/arguments.c +@@ -203,6 +203,7 @@ extern int lxc_arguments_parse(struct lxc_arguments *args, + case 'o': args->log_file = optarg; break; + case 'l': args->log_priority = optarg; break; + case 'q': args->quiet = 1; break; ++ case OPT_RCFILE: args->rcfile = optarg; break; + case 'P': + remove_trailing_slashes(optarg); + ret = lxc_arguments_lxcpath_add(args, optarg); +diff --git a/src/lxc/arguments.h b/src/lxc/arguments.h +index f68f8ab..39bedf5 100644 +--- a/src/lxc/arguments.h ++++ b/src/lxc/arguments.h +@@ -151,11 +151,13 @@ struct lxc_arguments { + {"logfile", required_argument, 0, 'o'}, \ + {"logpriority", required_argument, 0, 'l'}, \ + {"lxcpath", required_argument, 0, 'P'}, \ ++ {"rcfile", required_argument, 0, OPT_RCFILE}, \ + {0, 0, 0, 0} + + /* option keys for long only options */ + #define OPT_USAGE 0x1000 + #define OPT_VERSION OPT_USAGE-1 ++#define OPT_RCFILE OPT_USAGE-2 + + extern int lxc_arguments_parse(struct lxc_arguments *args, + int argc, char *const argv[]); +diff --git a/src/lxc/tools/lxc_attach.c b/src/lxc/tools/lxc_attach.c +index 281f97a..14c724a 100644 +--- a/src/lxc/tools/lxc_attach.c ++++ b/src/lxc/tools/lxc_attach.c +@@ -65,7 +65,6 @@ static const struct option my_longopts[] = { + {"keep-var", required_argument, 0, 502}, + {"set-var", required_argument, 0, 'v'}, + {"pty-log", required_argument, 0, 'L'}, +- {"rcfile", required_argument, 0, 'f'}, + LXC_COMMON_OPTIONS + }; + +diff --git a/src/lxc/tools/lxc_cgroup.c b/src/lxc/tools/lxc_cgroup.c +index dd60fd1..c644501 100644 +--- a/src/lxc/tools/lxc_cgroup.c ++++ b/src/lxc/tools/lxc_cgroup.c +@@ -56,7 +56,8 @@ Get or set the value of a state object (for example, 'cpuset.cpus')\n\ + in the container's cgroup for the corresponding subsystem.\n\ + \n\ + Options :\n\ +- -n, --name=NAME NAME of the container", ++ -n, --name=NAME NAME of the container\n\ ++ --rcfile=FILE Load configuration file FILE\n", + .options = my_longopts, + .parser = NULL, + .checker = my_checker, +@@ -84,6 +85,15 @@ int main(int argc, char *argv[]) + if (!c) + return 1; + ++ if (my_args.rcfile) { ++ c->clear_config(c); ++ if (!c->load_config(c, my_args.rcfile)) { ++ ERROR("Failed to load rcfile"); ++ lxc_container_put(c); ++ return 1; ++ } ++ } ++ + if (!c->may_control(c)) { + ERROR("Insufficent privileges to control %s:%s", my_args.lxcpath[0], my_args.name); + lxc_container_put(c); +diff --git a/src/lxc/tools/lxc_checkpoint.c b/src/lxc/tools/lxc_checkpoint.c +index 7130245..bc18b80 100644 +--- a/src/lxc/tools/lxc_checkpoint.c ++++ b/src/lxc/tools/lxc_checkpoint.c +@@ -114,6 +114,7 @@ Options :\n\ + Restore options:\n\ + -d, --daemon Daemonize the container (default)\n\ + -F, --foreground Start with the current tty attached to /dev/console\n\ ++ --rcfile=FILE Load configuration file FILE\n\ + ", + .options = my_longopts, + .parser = my_parser, +@@ -214,6 +215,15 @@ int main(int argc, char *argv[]) + exit(1); + } + ++ if (my_args.rcfile) { ++ c->clear_config(c); ++ if (!c->load_config(c, my_args.rcfile)) { ++ fprintf(stderr, "Failed to load rcfile\n"); ++ lxc_container_put(c); ++ exit(1); ++ } ++ } ++ + if (!c->may_control(c)) { + fprintf(stderr, "Insufficent privileges to control %s\n", my_args.name); + lxc_container_put(c); +diff --git a/src/lxc/tools/lxc_console.c b/src/lxc/tools/lxc_console.c +index adbd7e0..8a4d1c0 100644 +--- a/src/lxc/tools/lxc_console.c ++++ b/src/lxc/tools/lxc_console.c +@@ -80,7 +80,8 @@ lxc-console logs on the container with the identifier NAME\n\ + Options :\n\ + -n, --name=NAME NAME of the container\n\ + -t, --tty=NUMBER console tty number\n\ +- -e, --escape=PREFIX prefix for escape command\n", ++ -e, --escape=PREFIX prefix for escape command\n\ ++ --rcfile=FILE Load configuration file FILE\n", + .options = my_longopts, + .parser = my_parser, + .checker = NULL, +@@ -112,6 +113,15 @@ int main(int argc, char *argv[]) + exit(EXIT_FAILURE); + } + ++ if (my_args.rcfile) { ++ c->clear_config(c); ++ if (!c->load_config(c, my_args.rcfile)) { ++ fprintf(stderr, "Failed to load rcfile\n"); ++ lxc_container_put(c); ++ exit(EXIT_FAILURE); ++ } ++ } ++ + if (!c->may_control(c)) { + fprintf(stderr, "Insufficent privileges to control %s\n", my_args.name); + lxc_container_put(c); +diff --git a/src/lxc/tools/lxc_copy.c b/src/lxc/tools/lxc_copy.c +index 3257ab7..c81c077 100644 +--- a/src/lxc/tools/lxc_copy.c ++++ b/src/lxc/tools/lxc_copy.c +@@ -126,7 +126,8 @@ Options :\n\ + -D, --keedata pass together with -e start a persistent snapshot \n\ + -K, --keepname keep the hostname of the original container\n\ + -- hook options arguments passed to the hook program\n\ +- -M, --keepmac keep the MAC address of the original container\n", ++ -M, --keepmac keep the MAC address of the original container\n\ ++ --rcfile=FILE Load configuration file FILE\n", + .options = my_longopts, + .parser = my_parser, + .task = CLONE, +@@ -210,6 +211,14 @@ int main(int argc, char *argv[]) + if (!c) + exit(ret); + ++ if (my_args.rcfile) { ++ c->clear_config(c); ++ if (!c->load_config(c, my_args.rcfile)) { ++ fprintf(stderr, "Failed to load rcfile\n"); ++ goto out; ++ } ++ } ++ + if (!c->may_control(c)) { + if (!my_args.quiet) + fprintf(stderr, "Insufficent privileges to control %s\n", c->name); +diff --git a/src/lxc/tools/lxc_destroy.c b/src/lxc/tools/lxc_destroy.c +index b521739..50fd708 100644 +--- a/src/lxc/tools/lxc_destroy.c ++++ b/src/lxc/tools/lxc_destroy.c +@@ -53,7 +53,8 @@ lxc-destroy destroys a container with the identifier NAME\n\ + Options :\n\ + -n, --name=NAME NAME of the container\n\ + -s, --snapshots destroy including all snapshots\n\ +- -f, --force wait for the container to shut down\n", ++ -f, --force wait for the container to shut down\n\ ++ --rcfile=FILE Load configuration file FILE\n", + .options = my_longopts, + .parser = my_parser, + .checker = NULL, +@@ -88,6 +89,15 @@ int main(int argc, char *argv[]) + exit(EXIT_FAILURE); + } + ++ if (my_args.rcfile) { ++ c->clear_config(c); ++ if (!c->load_config(c, my_args.rcfile)) { ++ fprintf(stderr, "Failed to load rcfile\n"); ++ lxc_container_put(c); ++ exit(EXIT_FAILURE); ++ } ++ } ++ + if (!c->may_control(c)) { + if (!quiet) + fprintf(stderr, "Insufficent privileges to control %s\n", my_args.name); +diff --git a/src/lxc/tools/lxc_device.c b/src/lxc/tools/lxc_device.c +index 0c9e066..0f1ee8b 100644 +--- a/src/lxc/tools/lxc_device.c ++++ b/src/lxc/tools/lxc_device.c +@@ -53,7 +53,8 @@ static struct lxc_arguments my_args = { + lxc-device attach or detach DEV to or from container.\n\ + \n\ + Options :\n\ +- -n, --name=NAME NAME of the container", ++ -n, --name=NAME NAME of the container\n\ ++ --rcfile=FILE Load configuration file FILE\n", + .options = my_longopts, + .parser = NULL, + .checker = NULL, +@@ -125,6 +126,14 @@ int main(int argc, char *argv[]) + goto err; + } + ++ if (my_args.rcfile) { ++ c->clear_config(c); ++ if (!c->load_config(c, my_args.rcfile)) { ++ ERROR("Failed to load rcfile"); ++ goto err1; ++ } ++ } ++ + if (!c->is_running(c)) { + ERROR("Container %s is not running.", c->name); + goto err1; +diff --git a/src/lxc/tools/lxc_freeze.c b/src/lxc/tools/lxc_freeze.c +index ea8bd3e..d0239bf 100644 +--- a/src/lxc/tools/lxc_freeze.c ++++ b/src/lxc/tools/lxc_freeze.c +@@ -47,7 +47,8 @@ static struct lxc_arguments my_args = { + lxc-freeze freezes a container with the identifier NAME\n\ + \n\ + Options :\n\ +- -n, --name=NAME NAME of the container", ++ -n, --name=NAME NAME of the container\n\ ++ --rcfile=FILE Load configuration file FILE\n", + .options = my_longopts, + .parser = NULL, + .checker = NULL, +@@ -74,6 +75,15 @@ int main(int argc, char *argv[]) + exit(1); + } + ++ if (my_args.rcfile) { ++ c->clear_config(c); ++ if (!c->load_config(c, my_args.rcfile)) { ++ ERROR("Failed to load rcfile"); ++ lxc_container_put(c); ++ exit(1); ++ } ++ } ++ + if (!c->may_control(c)) { + ERROR("Insufficent privileges to control %s:%s", my_args.lxcpath[0], my_args.name); + lxc_container_put(c); +diff --git a/src/lxc/tools/lxc_info.c b/src/lxc/tools/lxc_info.c +index 58ff619..e833697 100644 +--- a/src/lxc/tools/lxc_info.c ++++ b/src/lxc/tools/lxc_info.c +@@ -93,7 +93,8 @@ Options :\n\ + -p, --pid shows the process id of the init container\n\ + -S, --stats shows usage stats\n\ + -H, --no-humanize shows stats as raw numbers, not humanized\n\ +- -s, --state shows the state of the container\n", ++ -s, --state shows the state of the container\n\ ++ --rcfile=FILE Load configuration file FILE\n", + .name = NULL, + .options = my_longopts, + .parser = my_parser, +@@ -295,6 +296,15 @@ static int print_info(const char *name, const char *lxcpath) + return -1; + } + ++ if (my_args.rcfile) { ++ c->clear_config(c); ++ if (!c->load_config(c, my_args.rcfile)) { ++ fprintf(stderr, "Failed to load rcfile\n"); ++ lxc_container_put(c); ++ return -1; ++ } ++ } ++ + if (!c->may_control(c)) { + fprintf(stderr, "Insufficent privileges to control %s\n", c->name); + lxc_container_put(c); +diff --git a/src/lxc/tools/lxc_snapshot.c b/src/lxc/tools/lxc_snapshot.c +index 8f44891..aa9b6fe 100644 +--- a/src/lxc/tools/lxc_snapshot.c ++++ b/src/lxc/tools/lxc_snapshot.c +@@ -62,7 +62,8 @@ Options :\n\ + -d, --destroy=NAME destroy snapshot NAME, e.g. 'snap0'\n\ + use ALL to destroy all snapshots\n\ + -c, --comment=FILE add FILE as a comment\n\ +- -C, --showcomments show snapshot comments\n", ++ -C, --showcomments show snapshot comments\n\ ++ --rcfile=FILE Load configuration file FILE\n", + .options = my_longopts, + .parser = my_parser, + .checker = NULL, +@@ -107,6 +108,15 @@ int main(int argc, char *argv[]) + exit(EXIT_FAILURE); + } + ++ if (my_args.rcfile) { ++ c->clear_config(c); ++ if (!c->load_config(c, my_args.rcfile)) { ++ fprintf(stderr, "Failed to load rcfile\n"); ++ lxc_container_put(c); ++ exit(EXIT_FAILURE); ++ } ++ } ++ + if (!c->may_control(c)) { + fprintf(stderr, "Insufficent privileges to control %s\n", + my_args.name); +diff --git a/src/lxc/tools/lxc_stop.c b/src/lxc/tools/lxc_stop.c +index 10ddce6..bbe1f1c 100644 +--- a/src/lxc/tools/lxc_stop.c ++++ b/src/lxc/tools/lxc_stop.c +@@ -75,7 +75,8 @@ Options :\n\ + -t, --timeout=T wait T seconds before hard-stopping\n\ + -k, --kill kill container rather than request clean shutdown\n\ + --nolock Avoid using API locks\n\ +- --nokill Only request clean shutdown, don't force kill after timeout\n", ++ --nokill Only request clean shutdown, don't force kill after timeout\n\ ++ --rcfile=FILE Load configuration file FILE\n", + .options = my_longopts, + .parser = my_parser, + .checker = NULL, +@@ -203,6 +204,14 @@ int main(int argc, char *argv[]) + goto out; + } + ++ if (my_args.rcfile) { ++ c->clear_config(c); ++ if (!c->load_config(c, my_args.rcfile)) { ++ fprintf(stderr, "Failed to load rcfile\n"); ++ goto out; ++ } ++ } ++ + if (!c->may_control(c)) { + fprintf(stderr, "Insufficent privileges to control %s\n", c->name); + goto out; +diff --git a/src/lxc/tools/lxc_unfreeze.c b/src/lxc/tools/lxc_unfreeze.c +index 3a13d37..b7bbea6 100644 +--- a/src/lxc/tools/lxc_unfreeze.c ++++ b/src/lxc/tools/lxc_unfreeze.c +@@ -45,7 +45,8 @@ static struct lxc_arguments my_args = { + lxc-unfreeze unfreezes a container with the identifier NAME\n\ + \n\ + Options :\n\ +- -n, --name=NAME NAME of the container\n", ++ -n, --name=NAME NAME of the container\n\ ++ --rcfile=FILE Load configuration file FILE\n", + .options = my_longopts, + .parser = NULL, + .checker = NULL, +@@ -78,6 +79,15 @@ int main(int argc, char *argv[]) + exit(1); + } + ++ if (my_args.rcfile) { ++ c->clear_config(c); ++ if (!c->load_config(c, my_args.rcfile)) { ++ ERROR("Failed to load rcfile"); ++ lxc_container_put(c); ++ exit(1); ++ } ++ } ++ + if (!c->unfreeze(c)) { + ERROR("Failed to unfreeze %s:%s", my_args.lxcpath[0], my_args.name); + lxc_container_put(c); +diff --git a/src/lxc/tools/lxc_wait.c b/src/lxc/tools/lxc_wait.c +index 712ba52..deeff98 100644 +--- a/src/lxc/tools/lxc_wait.c ++++ b/src/lxc/tools/lxc_wait.c +@@ -72,7 +72,8 @@ Options :\n\ + -s, --state=STATE ORed states to wait for\n\ + STOPPED, STARTING, RUNNING, STOPPING,\n\ + ABORTING, FREEZING, FROZEN, THAWED\n\ +- -t, --timeout=TMO Seconds to wait for state changes\n", ++ -t, --timeout=TMO Seconds to wait for state changes\n\ ++ --rcfile=FILE Load configuration file FILE\n", + .options = my_longopts, + .parser = my_parser, + .checker = my_checker, +@@ -104,6 +105,15 @@ int main(int argc, char *argv[]) + return 1; + } + ++ if (my_args.rcfile) { ++ c->clear_config(c); ++ if (!c->load_config(c, my_args.rcfile)) { ++ fprintf(stderr, "Failed to load rcfile\n"); ++ lxc_container_put(c); ++ return 1; ++ } ++ } ++ + if (!c->wait(c, my_args.states, my_args.timeout)) { + lxc_container_put(c); + return 1; +-- +2.1.4 + diff --git a/debian/patches/0002-tools-set-configfile-after-load_config.patch b/debian/patches/0002-tools-set-configfile-after-load_config.patch new file mode 100644 index 0000000..b32b49e --- /dev/null +++ b/debian/patches/0002-tools-set-configfile-after-load_config.patch @@ -0,0 +1,245 @@ +From fb259e5b431260c61a2afcee862f7e836d7d8cf9 Mon Sep 17 00:00:00 2001 +From: Wolfgang Bumiller +Date: Fri, 12 Aug 2016 14:49:37 +0200 +Subject: [PATCH 2/3] tools: set configfile after load_config + +In order to cause c->is_defined() to become true. + +Signed-off-by: Wolfgang Bumiller +--- + src/lxc/tools/lxc_attach.c | 6 ++++++ + src/lxc/tools/lxc_cgroup.c | 6 ++++++ + src/lxc/tools/lxc_checkpoint.c | 6 ++++++ + src/lxc/tools/lxc_console.c | 6 ++++++ + src/lxc/tools/lxc_copy.c | 5 +++++ + src/lxc/tools/lxc_destroy.c | 6 ++++++ + src/lxc/tools/lxc_device.c | 5 +++++ + src/lxc/tools/lxc_freeze.c | 6 ++++++ + src/lxc/tools/lxc_info.c | 6 ++++++ + src/lxc/tools/lxc_snapshot.c | 6 ++++++ + src/lxc/tools/lxc_stop.c | 5 +++++ + src/lxc/tools/lxc_unfreeze.c | 6 ++++++ + src/lxc/tools/lxc_wait.c | 6 ++++++ + 13 files changed, 75 insertions(+) + +diff --git a/src/lxc/tools/lxc_attach.c b/src/lxc/tools/lxc_attach.c +index 14c724a..e436ae9 100644 +--- a/src/lxc/tools/lxc_attach.c ++++ b/src/lxc/tools/lxc_attach.c +@@ -384,6 +384,12 @@ int main(int argc, char *argv[]) + lxc_container_put(c); + exit(EXIT_FAILURE); + } ++ c->configfile = strdup(my_args.rcfile); ++ if (!c->configfile) { ++ ERROR("Out of memory setting new config filename"); ++ lxc_container_put(c); ++ exit(EXIT_FAILURE); ++ } + } + + if (!c->may_control(c)) { +diff --git a/src/lxc/tools/lxc_cgroup.c b/src/lxc/tools/lxc_cgroup.c +index c644501..4dc2682 100644 +--- a/src/lxc/tools/lxc_cgroup.c ++++ b/src/lxc/tools/lxc_cgroup.c +@@ -92,6 +92,12 @@ int main(int argc, char *argv[]) + lxc_container_put(c); + return 1; + } ++ c->configfile = strdup(my_args.rcfile); ++ if (!c->configfile) { ++ ERROR("Out of memory setting new config filename"); ++ lxc_container_put(c); ++ return 1; ++ } + } + + if (!c->may_control(c)) { +diff --git a/src/lxc/tools/lxc_checkpoint.c b/src/lxc/tools/lxc_checkpoint.c +index bc18b80..6de3d23 100644 +--- a/src/lxc/tools/lxc_checkpoint.c ++++ b/src/lxc/tools/lxc_checkpoint.c +@@ -222,6 +222,12 @@ int main(int argc, char *argv[]) + lxc_container_put(c); + exit(1); + } ++ c->configfile = strdup(my_args.rcfile); ++ if (!c->configfile) { ++ fprintf(stderr, "Out of memory setting new config filename\n"); ++ lxc_container_put(c); ++ exit(1); ++ } + } + + if (!c->may_control(c)) { +diff --git a/src/lxc/tools/lxc_console.c b/src/lxc/tools/lxc_console.c +index 8a4d1c0..829c908 100644 +--- a/src/lxc/tools/lxc_console.c ++++ b/src/lxc/tools/lxc_console.c +@@ -120,6 +120,12 @@ int main(int argc, char *argv[]) + lxc_container_put(c); + exit(EXIT_FAILURE); + } ++ c->configfile = strdup(my_args.rcfile); ++ if (!c->configfile) { ++ fprintf(stderr, "Out of memory setting new config filename\n"); ++ lxc_container_put(c); ++ exit(EXIT_FAILURE); ++ } + } + + if (!c->may_control(c)) { +diff --git a/src/lxc/tools/lxc_copy.c b/src/lxc/tools/lxc_copy.c +index c81c077..f7dc8b2 100644 +--- a/src/lxc/tools/lxc_copy.c ++++ b/src/lxc/tools/lxc_copy.c +@@ -217,6 +217,11 @@ int main(int argc, char *argv[]) + fprintf(stderr, "Failed to load rcfile\n"); + goto out; + } ++ c->configfile = strdup(my_args.rcfile); ++ if (!c->configfile) { ++ fprintf(stderr, "Out of memory setting new config filename\n"); ++ goto out; ++ } + } + + if (!c->may_control(c)) { +diff --git a/src/lxc/tools/lxc_destroy.c b/src/lxc/tools/lxc_destroy.c +index 50fd708..3f46415 100644 +--- a/src/lxc/tools/lxc_destroy.c ++++ b/src/lxc/tools/lxc_destroy.c +@@ -96,6 +96,12 @@ int main(int argc, char *argv[]) + lxc_container_put(c); + exit(EXIT_FAILURE); + } ++ c->configfile = strdup(my_args.rcfile); ++ if (!c->configfile) { ++ fprintf(stderr, "Out of memory setting new config filename\n"); ++ lxc_container_put(c); ++ exit(EXIT_FAILURE); ++ } + } + + if (!c->may_control(c)) { +diff --git a/src/lxc/tools/lxc_device.c b/src/lxc/tools/lxc_device.c +index 0f1ee8b..49af062 100644 +--- a/src/lxc/tools/lxc_device.c ++++ b/src/lxc/tools/lxc_device.c +@@ -132,6 +132,11 @@ int main(int argc, char *argv[]) + ERROR("Failed to load rcfile"); + goto err1; + } ++ c->configfile = strdup(my_args.rcfile); ++ if (!c->configfile) { ++ ERROR("Out of memory setting new config filename"); ++ goto err1; ++ } + } + + if (!c->is_running(c)) { +diff --git a/src/lxc/tools/lxc_freeze.c b/src/lxc/tools/lxc_freeze.c +index d0239bf..ac0802e 100644 +--- a/src/lxc/tools/lxc_freeze.c ++++ b/src/lxc/tools/lxc_freeze.c +@@ -82,6 +82,12 @@ int main(int argc, char *argv[]) + lxc_container_put(c); + exit(1); + } ++ c->configfile = strdup(my_args.rcfile); ++ if (!c->configfile) { ++ ERROR("Out of memory setting new config filename"); ++ lxc_container_put(c); ++ exit(1); ++ } + } + + if (!c->may_control(c)) { +diff --git a/src/lxc/tools/lxc_info.c b/src/lxc/tools/lxc_info.c +index e833697..08c698d 100644 +--- a/src/lxc/tools/lxc_info.c ++++ b/src/lxc/tools/lxc_info.c +@@ -303,6 +303,12 @@ static int print_info(const char *name, const char *lxcpath) + lxc_container_put(c); + return -1; + } ++ c->configfile = strdup(my_args.rcfile); ++ if (!c->configfile) { ++ fprintf(stderr, "Out of memory setting new config filename\n"); ++ lxc_container_put(c); ++ return -1; ++ } + } + + if (!c->may_control(c)) { +diff --git a/src/lxc/tools/lxc_snapshot.c b/src/lxc/tools/lxc_snapshot.c +index aa9b6fe..a1166bc 100644 +--- a/src/lxc/tools/lxc_snapshot.c ++++ b/src/lxc/tools/lxc_snapshot.c +@@ -115,6 +115,12 @@ int main(int argc, char *argv[]) + lxc_container_put(c); + exit(EXIT_FAILURE); + } ++ c->configfile = strdup(my_args.rcfile); ++ if (!c->configfile) { ++ fprintf(stderr, "Out of memory setting new config filename\n"); ++ lxc_container_put(c); ++ exit(EXIT_FAILURE); ++ } + } + + if (!c->may_control(c)) { +diff --git a/src/lxc/tools/lxc_stop.c b/src/lxc/tools/lxc_stop.c +index bbe1f1c..cb7cfe2 100644 +--- a/src/lxc/tools/lxc_stop.c ++++ b/src/lxc/tools/lxc_stop.c +@@ -210,6 +210,11 @@ int main(int argc, char *argv[]) + fprintf(stderr, "Failed to load rcfile\n"); + goto out; + } ++ c->configfile = strdup(my_args.rcfile); ++ if (!c->configfile) { ++ fprintf(stderr, "Out of memory setting new config filename\n"); ++ goto out; ++ } + } + + if (!c->may_control(c)) { +diff --git a/src/lxc/tools/lxc_unfreeze.c b/src/lxc/tools/lxc_unfreeze.c +index b7bbea6..24faf5e 100644 +--- a/src/lxc/tools/lxc_unfreeze.c ++++ b/src/lxc/tools/lxc_unfreeze.c +@@ -86,6 +86,12 @@ int main(int argc, char *argv[]) + lxc_container_put(c); + exit(1); + } ++ c->configfile = strdup(my_args.rcfile); ++ if (!c->configfile) { ++ ERROR("Out of memory setting new config filename"); ++ lxc_container_put(c); ++ exit(1); ++ } + } + + if (!c->unfreeze(c)) { +diff --git a/src/lxc/tools/lxc_wait.c b/src/lxc/tools/lxc_wait.c +index deeff98..61fd869 100644 +--- a/src/lxc/tools/lxc_wait.c ++++ b/src/lxc/tools/lxc_wait.c +@@ -112,6 +112,12 @@ int main(int argc, char *argv[]) + lxc_container_put(c); + return 1; + } ++ c->configfile = strdup(my_args.rcfile); ++ if (!c->configfile) { ++ fprintf(stderr, "Out of memory setting new config filename\n"); ++ lxc_container_put(c); ++ return 1; ++ } + } + + if (!c->wait(c, my_args.states, my_args.timeout)) { +-- +2.1.4 + diff --git a/debian/patches/0003-doc-add-rcfile-to-common-opts.patch b/debian/patches/0003-doc-add-rcfile-to-common-opts.patch new file mode 100644 index 0000000..7b974cc --- /dev/null +++ b/debian/patches/0003-doc-add-rcfile-to-common-opts.patch @@ -0,0 +1,39 @@ +From 2e62657e65daad24f4c11744ce133e8c4d75df02 Mon Sep 17 00:00:00 2001 +From: Wolfgang Bumiller +Date: Fri, 12 Aug 2016 14:55:42 +0200 +Subject: [PATCH 3/3] doc: add --rcfile to common opts + +Signed-off-by: Wolfgang Bumiller +--- + doc/common_options.sgml.in | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +diff --git a/doc/common_options.sgml.in b/doc/common_options.sgml.in +index 38783dd..978c0ba 100644 +--- a/doc/common_options.sgml.in ++++ b/doc/common_options.sgml.in +@@ -107,6 +107,21 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + + ++ ++ ++ ++ Specify the configuration file to configure the virtualization ++ and isolation functionalities for the container. ++ ++ ++ This configuration file if present will be used even if there is ++ already a configuration file present in the previously created ++ container (via lxc-create). ++ ++ ++ ++ ++ + + + +-- +2.1.4 + diff --git a/debian/patches/series b/debian/patches/series index 72bfbb4..4a9c82a 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -6,4 +6,6 @@ include-linux-sched.patch use-var-lib-vz-as-default-dir.patch #do-not-use-config-path-for-rootfs.patch run-lxcnetaddbr.patch -0001-conf-set-pty_info-to-NULL-after-free.patch +0001-tools-move-rcfile-to-the-common-options-list.patch +0002-tools-set-configfile-after-load_config.patch +0003-doc-add-rcfile-to-common-opts.patch diff --git a/lxc.tgz b/lxc.tgz index 762256046396ac1a245ac0e5cb2ccf5b1d9b380b..0bbda7a0845814df3fc884423a7e43e67683c51e 100644 GIT binary patch delta 11588964 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