]> git.proxmox.com Git - mirror_lxc.git/blobdiff - src/lxc/conf.c
spelling: output
[mirror_lxc.git] / src / lxc / conf.c
index c450cfcbee15bc884abb1e98418636f5de8d6bb9..52ec8731b82d627578143cf47392234321455c4e 100644 (file)
@@ -542,7 +542,7 @@ int run_script(const char *name, const char *section, const char *script, ...)
 int pin_rootfs(const char *rootfs)
 {
        int fd, ret;
-       char absrootfspin[MAXPATHLEN];
+       char absrootfspin[PATH_MAX];
        char *absrootfs;
        struct stat s;
        struct statfs sfs;
@@ -565,9 +565,9 @@ int pin_rootfs(const char *rootfs)
                return -2;
        }
 
-       ret = snprintf(absrootfspin, MAXPATHLEN, "%s/.lxc-keep", absrootfs);
+       ret = snprintf(absrootfspin, PATH_MAX, "%s/.lxc-keep", absrootfs);
        free(absrootfs);
-       if (ret >= MAXPATHLEN)
+       if (ret < 0 || ret >= PATH_MAX)
                return -1;
 
        fd = open(absrootfspin, O_CREAT | O_RDWR, S_IWUSR | S_IRUSR);
@@ -639,7 +639,7 @@ unsigned long add_required_remount_flags(const char *s, const char *d,
 
 static int add_shmount_to_list(struct lxc_conf *conf)
 {
-       char new_mount[MAXPATHLEN];
+       char new_mount[PATH_MAX];
        /* Offset for the leading '/' since the path_cont
         * is absolute inside the container.
         */
@@ -833,7 +833,7 @@ static const struct dev_symlinks dev_symlinks[] = {
 static int lxc_setup_dev_symlinks(const struct lxc_rootfs *rootfs)
 {
        int i, ret;
-       char path[MAXPATHLEN];
+       char path[PATH_MAX];
        struct stat s;
 
        for (i = 0; i < sizeof(dev_symlinks) / sizeof(dev_symlinks[0]); i++) {
@@ -841,7 +841,7 @@ static int lxc_setup_dev_symlinks(const struct lxc_rootfs *rootfs)
 
                ret = snprintf(path, sizeof(path), "%s/dev/%s",
                               rootfs->path ? rootfs->mount : "", d->name);
-               if (ret < 0 || ret >= MAXPATHLEN)
+               if (ret < 0 || ret >= PATH_MAX)
                        return -1;
 
                /* Stat the path first. If we don't get an error accept it as
@@ -897,7 +897,7 @@ static int lxc_setup_ttys(struct lxc_conf *conf)
        int i, ret;
        const struct lxc_tty_info *ttys = &conf->ttys;
        char *ttydir = ttys->dir;
-       char path[MAXPATHLEN], lxcpath[MAXPATHLEN];
+       char path[PATH_MAX], lxcpath[PATH_MAX];
 
        if (!conf->rootfs.path)
                return 0;
@@ -1218,13 +1218,13 @@ enum {
 static int lxc_fill_autodev(const struct lxc_rootfs *rootfs)
 {
        int i, ret;
-       char path[MAXPATHLEN];
+       char path[PATH_MAX];
        mode_t cmask;
        int use_mknod = LXC_DEVNODE_MKNOD;
 
-       ret = snprintf(path, MAXPATHLEN, "%s/dev",
+       ret = snprintf(path, PATH_MAX, "%s/dev",
                       rootfs->path ? rootfs->mount : "");
-       if (ret < 0 || ret >= MAXPATHLEN)
+       if (ret < 0 || ret >= PATH_MAX)
                return -1;
 
        /* ignore, just don't try to fill in */
@@ -1235,12 +1235,12 @@ static int lxc_fill_autodev(const struct lxc_rootfs *rootfs)
 
        cmask = umask(S_IXUSR | S_IXGRP | S_IXOTH);
        for (i = 0; i < sizeof(lxc_devices) / sizeof(lxc_devices[0]); i++) {
-               char hostpath[MAXPATHLEN];
+               char hostpath[PATH_MAX];
                const struct lxc_device_node *device = &lxc_devices[i];
 
-               ret = snprintf(path, MAXPATHLEN, "%s/dev/%s",
+               ret = snprintf(path, PATH_MAX, "%s/dev/%s",
                               rootfs->path ? rootfs->mount : "", device->name);
-               if (ret < 0 || ret >= MAXPATHLEN)
+               if (ret < 0 || ret >= PATH_MAX)
                        return -1;
 
                if (use_mknod >= LXC_DEVNODE_MKNOD) {
@@ -1292,8 +1292,8 @@ static int lxc_fill_autodev(const struct lxc_rootfs *rootfs)
                }
 
                /* Fallback to bind-mounting the device from the host. */
-               ret = snprintf(hostpath, MAXPATHLEN, "/dev/%s", device->name);
-               if (ret < 0 || ret >= MAXPATHLEN)
+               ret = snprintf(hostpath, PATH_MAX, "/dev/%s", device->name);
+               if (ret < 0 || ret >= PATH_MAX)
                        return -1;
 
                ret = safe_mount(hostpath, path, 0, MS_BIND, NULL,
@@ -1397,7 +1397,7 @@ int lxc_chroot(const struct lxc_rootfs *rootfs)
                return -1;
        }
 
-       /* The following code cleans up inhereted mounts which are not required
+       /* The following code cleans up inherited mounts which are not required
         * for CT.
         *
         * The mountinfo file shows not all mounts, if a few points have been
@@ -1494,15 +1494,16 @@ int lxc_chroot(const struct lxc_rootfs *rootfs)
  */
 static int lxc_pivot_root(const char *rootfs)
 {
-       int newroot = -1, oldroot = -1, ret = -1;
+       int oldroot;
+       int newroot = -1, ret = -1;
 
-       oldroot = open("/", O_DIRECTORY | O_RDONLY);
+       oldroot = open("/", O_DIRECTORY | O_RDONLY | O_CLOEXEC);
        if (oldroot < 0) {
                SYSERROR("Failed to open old root directory");
                return -1;
        }
 
-       newroot = open(rootfs, O_DIRECTORY | O_RDONLY);
+       newroot = open(rootfs, O_DIRECTORY | O_RDONLY | O_CLOEXEC);
        if (newroot < 0) {
                SYSERROR("Failed to open new root directory");
                goto on_error;
@@ -1564,9 +1565,9 @@ static int lxc_pivot_root(const char *rootfs)
        TRACE("pivot_root(\"%s\") successful", rootfs);
 
 on_error:
-       if (oldroot != -1)
-               close(oldroot);
-       if (newroot != -1)
+       close(oldroot);
+
+       if (newroot >= 0)
                close(newroot);
 
        return ret;
@@ -1747,7 +1748,7 @@ static int lxc_setup_dev_console(const struct lxc_rootfs *rootfs,
                                 const struct lxc_terminal *console)
 {
        int ret;
-       char path[MAXPATHLEN];
+       char path[PATH_MAX];
        char *rootfs_path = rootfs->path ? rootfs->mount : "";
 
        if (console->path && !strcmp(console->path, "none"))
@@ -1801,7 +1802,7 @@ static int lxc_setup_ttydir_console(const struct lxc_rootfs *rootfs,
                                    char *ttydir)
 {
        int ret;
-       char path[MAXPATHLEN], lxcpath[MAXPATHLEN];
+       char path[PATH_MAX], lxcpath[PATH_MAX];
        char *rootfs_path = rootfs->path ? rootfs->mount : "";
 
        if (console->path && !strcmp(console->path, "none"))
@@ -2015,15 +2016,15 @@ static int mount_entry(const char *fsname, const char *target,
                       bool dev, bool relative, const char *rootfs)
 {
        int ret;
-       char srcbuf[MAXPATHLEN];
+       char srcbuf[PATH_MAX];
        const char *srcpath = fsname;
 #ifdef HAVE_STATVFS
        struct statvfs sb;
 #endif
 
        if (relative) {
-               ret = snprintf(srcbuf, MAXPATHLEN, "%s/%s", rootfs ? rootfs : "/", fsname ? fsname : "");
-               if (ret < 0 || ret >= MAXPATHLEN) {
+               ret = snprintf(srcbuf, PATH_MAX, "%s/%s", rootfs ? rootfs : "/", fsname ? fsname : "");
+               if (ret < 0 || ret >= PATH_MAX) {
                        ERROR("source path is too long");
                        return -1;
                }
@@ -2257,7 +2258,7 @@ static inline int mount_entry_on_generic(struct mntent *mntent,
 static inline int mount_entry_on_systemfs(struct mntent *mntent)
 {
        int ret;
-       char path[MAXPATHLEN];
+       char path[PATH_MAX];
 
        /* For containers created without a rootfs all mounts are treated as
         * absolute paths starting at / on the host.
@@ -2280,7 +2281,7 @@ static int mount_entry_on_absolute_rootfs(struct mntent *mntent,
        int offset;
        char *aux;
        const char *lxcpath;
-       char path[MAXPATHLEN];
+       char path[PATH_MAX];
        int ret = 0;
 
        lxcpath = lxc_global_config_value("lxc.lxcpath");
@@ -2290,8 +2291,8 @@ static int mount_entry_on_absolute_rootfs(struct mntent *mntent,
        /* If rootfs->path is a blockdev path, allow container fstab to use
         * <lxcpath>/<name>/rootfs" as the target prefix.
         */
-       ret = snprintf(path, MAXPATHLEN, "%s/%s/rootfs", lxcpath, lxc_name);
-       if (ret < 0 || ret >= MAXPATHLEN)
+       ret = snprintf(path, PATH_MAX, "%s/%s/rootfs", lxcpath, lxc_name);
+       if (ret < 0 || ret >= PATH_MAX)
                goto skipvarlib;
 
        aux = strstr(mntent->mnt_dir, path);
@@ -2309,8 +2310,8 @@ skipvarlib:
        offset = strlen(rootfs->path);
 
 skipabs:
-       ret = snprintf(path, MAXPATHLEN, "%s/%s", rootfs->mount, aux + offset);
-       if (ret < 0 || ret >= MAXPATHLEN)
+       ret = snprintf(path, PATH_MAX, "%s/%s", rootfs->mount, aux + offset);
+       if (ret < 0 || ret >= PATH_MAX)
                return -1;
 
        return mount_entry_on_generic(mntent, path, rootfs, lxc_name, lxc_path);
@@ -2322,7 +2323,7 @@ static int mount_entry_on_relative_rootfs(struct mntent *mntent,
                                          const char *lxc_path)
 {
        int ret;
-       char path[MAXPATHLEN];
+       char path[PATH_MAX];
 
        /* relative to root mount point */
        ret = snprintf(path, sizeof(path), "%s/%s", rootfs->mount, mntent->mnt_dir);
@@ -2419,10 +2420,6 @@ FILE *make_anonymous_mount_file(struct lxc_list *mount,
 
                TRACE("Created temporary mount file");
        }
-       if (fd < 0) {
-               SYSERROR("Could not create temporary mount file");
-               return NULL;
-       }
 
        lxc_list_for_each (iterator, mount) {
                size_t len;
@@ -2647,8 +2644,10 @@ int setup_resource_limits(struct lxc_list *limits, pid_t pid)
                        SYSERROR("Failed to set limit %s", lim->resource);
                        return -1;
                }
+
+               TRACE("Setup \"%s\" limit", lim->resource);
 #else
-               ERROR("Cannot set limit %s as prlimit is missing", lim->resource);
+               ERROR("Cannot set limit \"%s\" as prlimit is missing", lim->resource);
                return -1;
 #endif
        }
@@ -2662,7 +2661,7 @@ int setup_sysctl_parameters(struct lxc_list *sysctls)
        struct lxc_sysctl *elem;
        int ret = 0;
        char *tmp = NULL;
-       char filename[MAXPATHLEN] = {0};
+       char filename[PATH_MAX] = {0};
 
        lxc_list_for_each (it, sysctls) {
                elem = it->elem;
@@ -2697,7 +2696,7 @@ int setup_proc_filesystem(struct lxc_list *procs, pid_t pid)
        struct lxc_proc *elem;
        int ret = 0;
        char *tmp = NULL;
-       char filename[MAXPATHLEN] = {0};
+       char filename[PATH_MAX] = {0};
 
        lxc_list_for_each (it, procs) {
                elem = it->elem;
@@ -2806,13 +2805,13 @@ int write_id_mapping(enum idtype idtype, pid_t pid, const char *buf,
                     size_t buf_size)
 {
        int fd, ret;
-       char path[MAXPATHLEN];
+       char path[PATH_MAX];
 
        if (geteuid() != 0 && idtype == ID_TYPE_GID) {
                size_t buflen;
 
-               ret = snprintf(path, MAXPATHLEN, "/proc/%d/setgroups", pid);
-               if (ret < 0 || ret >= MAXPATHLEN)
+               ret = snprintf(path, PATH_MAX, "/proc/%d/setgroups", pid);
+               if (ret < 0 || ret >= PATH_MAX)
                        return -E2BIG;
 
                fd = open(path, O_WRONLY);
@@ -2835,9 +2834,9 @@ int write_id_mapping(enum idtype idtype, pid_t pid, const char *buf,
                }
        }
 
-       ret = snprintf(path, MAXPATHLEN, "/proc/%d/%cid_map", pid,
+       ret = snprintf(path, PATH_MAX, "/proc/%d/%cid_map", pid,
                       idtype == ID_TYPE_UID ? 'u' : 'g');
-       if (ret < 0 || ret >= MAXPATHLEN)
+       if (ret < 0 || ret >= PATH_MAX)
                return -E2BIG;
 
        fd = open(path, O_WRONLY);
@@ -2917,7 +2916,7 @@ static int idmaptool_on_path_and_privileged(const char *binary, cap_value_t cap)
         * of the doubt. Otherwise we might fail even though all the necessary
         * file capabilities are set.
         */
-       DEBUG("Cannot check for file capabilites as full capability support is "
+       DEBUG("Cannot check for file capabilities as full capability support is "
              "missing. Manual intervention needed");
        fret = 1;
 #endif
@@ -2938,7 +2937,7 @@ int lxc_map_ids(struct lxc_list *idmap, pid_t pid)
        int fill, left;
        char u_or_g;
        char *pos;
-       char cmd_output[MAXPATHLEN];
+       char cmd_output[PATH_MAX];
        struct id_map *map;
        struct lxc_list *iterator;
        enum idtype type;
@@ -3041,7 +3040,7 @@ int lxc_map_ids(struct lxc_list *idmap, pid_t pid)
                if (!had_entry)
                        continue;
 
-               /* Try to catch the ouput of new{g,u}idmap to make debugging
+               /* Try to catch the output of new{g,u}idmap to make debugging
                 * easier.
                 */
                if (use_shadow) {
@@ -3171,7 +3170,7 @@ int chown_mapped_root(const char *path, struct lxc_conf *conf)
                         "-m", map5,
                         "--", "chown", ugid, path,
                         NULL};
-       char cmd_output[MAXPATHLEN];
+       char cmd_output[PATH_MAX];
 
        hostuid = geteuid();
        hostgid = getegid();
@@ -3342,9 +3341,8 @@ void remount_all_slave(void)
                }
        }
 
-#define __LXC_SENDFILE_MAX 0x7ffff000 /* maximum number of bytes sendfile can handle */
 again:
-       copied = sendfile(memfd, mntinfo_fd, NULL, __LXC_SENDFILE_MAX);
+       copied = lxc_sendfile_nointr(memfd, mntinfo_fd, NULL, LXC_SENDFILE_MAX);
        if (copied < 0) {
                if (errno == EINTR)
                        goto again;
@@ -3507,23 +3505,22 @@ int lxc_setup_rootfs_prepare_root(struct lxc_conf *conf, const char *name,
 
 static bool verify_start_hooks(struct lxc_conf *conf)
 {
-       char path[MAXPATHLEN];
+       char path[PATH_MAX];
        struct lxc_list *it;
 
        lxc_list_for_each (it, &conf->hooks[LXCHOOK_START]) {
                int ret;
-               struct stat st;
                char *hookname = it->elem;
 
-               ret = snprintf(path, MAXPATHLEN, "%s%s",
+               ret = snprintf(path, PATH_MAX, "%s%s",
                               conf->rootfs.path ? conf->rootfs.mount : "",
                               hookname);
-               if (ret < 0 || ret >= MAXPATHLEN)
+               if (ret < 0 || ret >= PATH_MAX)
                        return false;
 
-               ret = stat(path, &st);
+               ret = access(path, X_OK);
                if (ret < 0) {
-                       SYSERROR("Start hook %s not found in container",
+                       SYSERROR("Start hook \"%s\" not found in container",
                                 hookname);
                        return false;
                }
@@ -3602,10 +3599,6 @@ int lxc_setup(struct lxc_handler *handler)
                return -1;
        }
 
-       /* Make sure any start hooks are in the container */
-       if (!verify_start_hooks(lxc_conf))
-               return -1;
-
        if (lxc_conf->is_execute) {
                if (execveat_supported()) {
                        int fd;
@@ -3673,6 +3666,12 @@ int lxc_setup(struct lxc_handler *handler)
                }
        }
 
+       /* Make sure any start hooks are in the container */
+       if (!verify_start_hooks(lxc_conf)) {
+               ERROR("Failed to verify start hooks");
+               return -1;
+       }
+
        ret = lxc_setup_console(&lxc_conf->rootfs, &lxc_conf->console,
                                lxc_conf->ttys.dir);
        if (ret < 0) {
@@ -4361,7 +4360,7 @@ on_error:
  * - the container root {g,u}id as seen from the host > user's host {g,u}id
  * - the container root -> some sub{g,u}id
  * The former we add, if the user did not specifiy a mapping. The latter we
- * retrieve from the ontainer's configured {g,u}id mappings as it must have been
+ * retrieve from the container's configured {g,u}id mappings as it must have been
  * there to start the container in the first place.
  */
 int userns_exec_1(struct lxc_conf *conf, int (*fn)(void *), void *data,