jail: don't assume positive return value of creat
[project/procd.git] / jail / jail.c
index bfa2587b30550e7f79ddcaa733466b1d1488bed2..09780ac7e2b732cd6456c835f93c29816ad3dc89 100644 (file)
@@ -215,6 +215,10 @@ static void free_hooklist(struct hook_execvpe **hooklist)
 
 static void free_sysctl(void) {
        struct sysctl_val *cur;
+
+       if (!opts.sysctl)
+               return;
+
        cur = *opts.sysctl;
 
        while (cur) {
@@ -370,7 +374,7 @@ static int create_dev_console(const char *jail_root)
 {
        char *console_fname;
        char dev_console_path[PATH_MAX];
-       int slave_console_fd;
+       int slave_console_fd, dev_console_dummy;
 
        /* Open UNIX/98 virtual console */
        console_fd = posix_openpt(O_RDWR | O_NOCTTY);
@@ -390,7 +394,11 @@ static int create_dev_console(const char *jail_root)
 
        /* mount-bind PTY slave to /dev/console in jail */
        snprintf(dev_console_path, sizeof(dev_console_path), "%s/dev/console", jail_root);
-       close(creat(dev_console_path, 0620));
+       dev_console_dummy = creat(dev_console_path, 0620);
+       if (dev_console_dummy < 0)
+               goto no_console;
+
+       close(dev_console_dummy);
 
        if (mount(console_fname, dev_console_path, "bind", MS_BIND, NULL))
                goto no_console;
@@ -585,6 +593,7 @@ static int create_devices(void)
 {
        struct mknod_args **cur, *curdef;
        char *path, *tmp;
+       int ret;
 
        if (!opts.devices)
                goto only_default_devices;
@@ -640,11 +649,25 @@ only_default_devices:
        }
 
        /* Dev symbolic links as defined in OCI spec */
-       (void) symlink("/dev/pts/ptmx", "/dev/ptmx");
-       (void) symlink("/proc/self/fd", "/dev/fd");
-       (void) symlink("/proc/self/fd/0", "/dev/stdin");
-       (void) symlink("/proc/self/fd/1", "/dev/stdout");
-       (void) symlink("/proc/self/fd/2", "/dev/stderr");
+       ret = symlink("/dev/pts/ptmx", "/dev/ptmx");
+       if (ret < 0)
+               WARNING("symlink() failed to create link to /dev/pts/ptmx");
+
+       ret = symlink("/proc/self/fd", "/dev/fd");
+       if (ret < 0)
+               WARNING("symlink() failed to create link to /proc/self/fd");
+
+       ret = symlink("/proc/self/fd/0", "/dev/stdin");
+       if (ret < 0)
+               WARNING("symlink() failed to create link to /proc/self/fd/0");
+
+       ret = symlink("/proc/self/fd/1", "/dev/stdout");
+       if (ret < 0)
+               WARNING("symlink() failed to create link to /proc/self/fd/1");
+
+       ret = symlink("/proc/self/fd/2", "/dev/stderr");
+       if (ret < 0)
+               WARNING("symlink() failed to create link to /proc/self/fd/2");
 
        return 0;
 }
@@ -737,7 +760,9 @@ static int build_jail_fs(void)
                if (overlaydir)
                        unlink(jaillink);
 
-               (void) symlink("../dev/resolv.conf.d/resolv.conf.auto", jaillink);
+               ret = symlink("../dev/resolv.conf.d/resolv.conf.auto", jaillink);
+               if (ret < 0)
+                       WARNING("symlink() failed to create link to ../dev/resolv.conf.d/resolv.conf.auto");
        }
 
        run_hooks(opts.hooks.createContainer, enter_jail_fs);
@@ -2729,8 +2754,14 @@ int main(int argc, char **argv)
                opts.envp = calloc(1 + envn, sizeof(char*));
                list_for_each_entry_safe(enve, tmpenve, &envl, list) {
                        tmp = getenv(enve->envarg);
-                       if (tmp)
-                               asprintf(&opts.envp[envc++], "%s=%s", enve->envarg, tmp);
+                       if (tmp) {
+                               ret = asprintf(&opts.envp[envc++], "%s=%s", enve->envarg, tmp);
+                               if (ret < 0) {
+                                       ERROR("filed to handle envargs %s\n", tmp);
+                                       free(enve);
+                                       goto errout;
+                               }
+                       }
 
                        list_del(&enve->list);
                        free(enve);