]> git.proxmox.com Git - mirror_lxc.git/commitdiff
lxcapi_create: fix template handling
authorSerge Hallyn <serge.hallyn@ubuntu.com>
Thu, 11 Jul 2013 04:30:29 +0000 (23:30 -0500)
committerSerge Hallyn <serge.hallyn@ubuntu.com>
Thu, 11 Jul 2013 15:25:33 +0000 (10:25 -0500)
1. If no template is passed in, then do not try to execute it.  The user
just wanted to write the configuration.

2. If template is passed in as a full path, then use that instead of
constructing '$templatedir/lxc-$template'.

Reported-by: Wanlong Gao <gaowanlong@cn.fujitsu.com>
Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
src/lxc/lxccontainer.c

index 596c189a2952c9cbb5b611b1f3e647a0bddf302c..6326eb074ea788136223307a1c0fb602d3c70628 100644 (file)
@@ -646,17 +646,6 @@ static bool lxcapi_stop(struct lxc_container *c)
        return ret == 0;
 }
 
-static bool valid_template(char *t)
-{
-       struct stat statbuf;
-       int statret;
-
-       statret = stat(t, &statbuf);
-       if (statret == 0)
-               return true;
-       return false;
-}
-
 /*
  * create the standard expected container dir
  */
@@ -715,6 +704,46 @@ 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.  If
+ * no template was passed in, return NULL  (this is ok).
+ * On error return (char *) -1.
+ */
+char *get_template_path(const char *t)
+{
+       int ret, len;
+       char *tpath;
+
+       if (!t)
+               return NULL;
+
+       if (t[0] == '/' && access(t, X_OK) == 0) {
+               tpath = strdup(t);
+               if (!tpath)
+                       return (char *) -1;
+               return tpath;
+       }
+
+       len = strlen(LXCTEMPLATEDIR) + strlen(t) + strlen("/lxc-") + 1;
+       tpath = malloc(len);
+       if (!tpath)
+               return (char *) -1;
+       ret = snprintf(tpath, len, "%s/lxc-%s", LXCTEMPLATEDIR, t);
+       if (ret < 0 || ret >= len) {
+               free(tpath);
+               return (char *) -1;
+       }
+       if (access(tpath, X_OK) < 0) {
+               SYSERROR("bad template: %s\n", t);
+               free(tpath);
+               return (char *) -1;
+       }
+
+       return tpath;
+}
+
 static char *lxcbasename(char *path)
 {
        char *p = path + strlen(path) - 1;
@@ -854,20 +883,13 @@ static bool lxcapi_create(struct lxc_container *c, const char *t,
 {
        bool bret = false;
        pid_t pid;
-       char *tpath = NULL;
-       int partial_fd, ret, len;
+       char *tpath;
+       int partial_fd;
 
        if (!c)
                return false;
 
-       len = strlen(LXCTEMPLATEDIR) + strlen(t) + strlen("/lxc-") + 1;
-       tpath = malloc(len);
-       if (!tpath)
-               return false;
-       ret = snprintf(tpath, len, "%s/lxc-%s", LXCTEMPLATEDIR, t);
-       if (ret < 0 || ret >= len)
-               goto out;
-       if (!valid_template(tpath)) {
+       if ((tpath = get_template_path(t)) < 0) {
                ERROR("bad template: %s\n", t);
                goto out;
        }