From: Stéphane Graber Date: Wed, 28 Jan 2015 08:28:22 +0000 (+0100) Subject: Fix lxc-create -h with absolute template path X-Git-Tag: lxc-1.1.0.rc4~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6010a416227149adabc5aa8e018e2333adb2a922;p=thirdparty%2Flxc.git Fix lxc-create -h with absolute template path Close #421 Signed-off-by: Stéphane Graber Acked-by: Serge E. Hallyn --- diff --git a/src/lxc/lxc_create.c b/src/lxc/lxc_create.c index 2cc866a32..8f46db941 100644 --- a/src/lxc/lxc_create.c +++ b/src/lxc/lxc_create.c @@ -101,8 +101,6 @@ static const struct option my_longopts[] = { static void create_helpfn(const struct lxc_arguments *args) { char *argv[3], *path; - size_t len; - int ret; pid_t pid; if (!args->template) @@ -114,11 +112,7 @@ static void create_helpfn(const struct lxc_arguments *args) { return; } - len = strlen(LXCTEMPLATEDIR) + strlen(args->template) + strlen("/lxc-") + 1; - path = alloca(len); - ret = snprintf(path, len, "%s/lxc-%s", LXCTEMPLATEDIR, args->template); - if (ret < 0 || ret >= len) - return; + path = get_template_path(args->template); argv[0] = path; argv[1] = "-h"; diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c index 2b3e28c13..4da1627c3 100644 --- a/src/lxc/lxccontainer.c +++ b/src/lxc/lxccontainer.c @@ -841,40 +841,6 @@ static struct bdev *do_bdev_create(struct lxc_container *c, const char *type, return bdev; } -/* - * Given the '-t' template option to lxc-create, figure out what to - * do. If the template is a full executable path, use that. If it - * is something like 'sshd', then return $templatepath/lxc-sshd. - * On success return the template, on error return NULL. - */ -static char *get_template_path(const char *t) -{ - int ret, len; - char *tpath; - - if (t[0] == '/' && access(t, X_OK) == 0) { - tpath = strdup(t); - return tpath; - } - - len = strlen(LXCTEMPLATEDIR) + strlen(t) + strlen("/lxc-") + 1; - tpath = malloc(len); - if (!tpath) - return NULL; - ret = snprintf(tpath, len, "%s/lxc-%s", LXCTEMPLATEDIR, t); - if (ret < 0 || ret >= len) { - free(tpath); - return NULL; - } - if (access(tpath, X_OK) < 0) { - SYSERROR("bad template: %s", t); - free(tpath); - return NULL; - } - - return tpath; -} - static char *lxcbasename(char *path) { char *p = path + strlen(path) - 1; diff --git a/src/lxc/utils.c b/src/lxc/utils.c index 23b1b11ef..93de1c350 100644 --- a/src/lxc/utils.c +++ b/src/lxc/utils.c @@ -1506,3 +1506,37 @@ int is_dir(const char *path) return 1; return 0; } + +/* + * Given the '-t' template option to lxc-create, figure out what to + * do. If the template is a full executable path, use that. If it + * is something like 'sshd', then return $templatepath/lxc-sshd. + * On success return the template, on error return NULL. + */ +char *get_template_path(const char *t) +{ + int ret, len; + char *tpath; + + if (t[0] == '/' && access(t, X_OK) == 0) { + tpath = strdup(t); + return tpath; + } + + len = strlen(LXCTEMPLATEDIR) + strlen(t) + strlen("/lxc-") + 1; + tpath = malloc(len); + if (!tpath) + return NULL; + ret = snprintf(tpath, len, "%s/lxc-%s", LXCTEMPLATEDIR, t); + if (ret < 0 || ret >= len) { + free(tpath); + return NULL; + } + if (access(tpath, X_OK) < 0) { + SYSERROR("bad template: %s", t); + free(tpath); + return NULL; + } + + return tpath; +} diff --git a/src/lxc/utils.h b/src/lxc/utils.h index ae2c851e2..b23cd8eea 100644 --- a/src/lxc/utils.h +++ b/src/lxc/utils.h @@ -285,3 +285,4 @@ char *choose_init(const char *rootfs); int print_to_file(const char *file, const char *content); bool switch_to_ns(pid_t pid, const char *ns); int is_dir(const char *path); +char *get_template_path(const char *t);