diff options
author | Evgeny Zinoviev <me@ch1p.io> | 2021-01-17 20:04:06 +0300 |
---|---|---|
committer | Evgeny Zinoviev <me@ch1p.io> | 2021-01-17 20:04:06 +0300 |
commit | bdadd4b91b28d5ce3660eb045fab4b8793c88312 (patch) | |
tree | 3ffcc2413872370d78e7a111032e47242a3d16d4 | |
parent | fb47acbdf15d3f424006f9ff409f67fede4bdbc5 (diff) |
fix a bug caused by reused buffer when /run/voidnsrun was not mounted as tmpfs when -d option was used
-rw-r--r-- | voidnsrun.c | 40 |
1 files changed, 20 insertions, 20 deletions
diff --git a/voidnsrun.c b/voidnsrun.c index 80d6526..c9b94ba 100644 --- a/voidnsrun.c +++ b/voidnsrun.c @@ -273,25 +273,6 @@ int main(int argc, char **argv) ERROR_EXIT("error: failed to acquire mount namespace's fd.%s\n", strerror(errno)); - /* Check socket directory. */ - /* TODO: fix invalid permissions, or just die in that case. */ - - /* This should be safe, SOCK_PATH is hardcoded in config.h and it's definitely - * smaller than buffer. */ - strcpy(buf, SOCK_PATH); - - char *sock_dir = dirname(buf); - if (access(sock_dir, F_OK) == -1) { - if (mkdir(sock_dir, 0700) == -1) - ERROR_EXIT("error: failed to create %s directory.\n", sock_dir); - } else { - if ((dirptr = opendir(sock_dir)) == NULL) - ERROR_EXIT("error: %s is not a directory.\n", sock_dir); - if (exists(SOCK_PATH) && unlink(SOCK_PATH) == -1) - ERROR_EXIT("failed to unlink %s: %s", SOCK_PATH, strerror(errno)); - } - DEBUG("sock_dir=%s\n", sock_dir); - /* Get current working directory. Will need to restore it later in the * new mount namespace. */ getcwd(cwd, PATH_MAX); @@ -346,10 +327,29 @@ int main(int argc, char **argv) && !ignore_missing) ERROR_EXIT("error: some undo mounts failed.\n"); + /* Check socket directory. */ + /* TODO: fix invalid permissions, or just die in that case. */ + + /* This should be safe, SOCK_PATH is hardcoded in config.h and it's definitely + * smaller than buffer. */ + strcpy(buf, SOCK_PATH); + + char *sock_dir = dirname(buf); + if (access(sock_dir, F_OK) == -1) { + if (mkdir(sock_dir, 0700) == -1) + ERROR_EXIT("error: failed to create %s directory.\n", sock_dir); + } else { + if ((dirptr = opendir(sock_dir)) == NULL) + ERROR_EXIT("error: %s is not a directory.\n", sock_dir); + if (exists(SOCK_PATH) && unlink(SOCK_PATH) == -1) + ERROR_EXIT("failed to unlink %s: %s", SOCK_PATH, strerror(errno)); + } + DEBUG("sock_dir=%s\n", sock_dir); + /* Mount socket directory as tmpfs. It will only be visible in this namespace, * and the socket file will also be available from this namespace only.*/ if (mount("tmpfs", sock_dir, "tmpfs", 0, "size=4k,mode=0700,uid=0,gid=0") == -1) - ERROR_EXIT("mount: error mounting tmpfs in %s.\n", sock_dir); + ERROR_EXIT("mount: error mounting tmpfs in %s: %s.\n", sock_dir, strerror(errno)); /* * Fork. We need it because we need to preserve file descriptor of the |