[lxc-devel] [lxc/master] conf: use mknod() to create dummy mount targets

brauner on Github lxc-bot at linuxcontainers.org
Wed Jul 4 22:35:11 UTC 2018


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 364 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20180704/c548a390/attachment.bin>
-------------- next part --------------
From ead2df59c91dbc733568d9eed5283c0ee76504de Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Thu, 5 Jul 2018 00:30:21 +0200
Subject: [PATCH] conf: use mknod() to create dummy mount targets

Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
 src/lxc/conf.c | 44 +++++++++++++++++---------------------------
 1 file changed, 17 insertions(+), 27 deletions(-)

diff --git a/src/lxc/conf.c b/src/lxc/conf.c
index 48a5c7b6d..ee2b394f5 100644
--- a/src/lxc/conf.c
+++ b/src/lxc/conf.c
@@ -1593,12 +1593,11 @@ static int lxc_setup_devpts(struct lxc_conf *conf)
 	}
 
 	/* Create dummy /dev/ptmx file as bind mountpoint for /dev/pts/ptmx. */
-	ret = open("/dev/ptmx", O_CREAT, 0666);
-	if (ret < 0) {
+	ret = mknod("/dev/ptmx", S_IFREG | 0000, 0);
+	if (ret < 0 && errno != EEXIST) {
 		SYSERROR("Failed to create dummy \"/dev/ptmx\" file as bind mount target");
 		return -1;
 	}
-	close(ret);
 	DEBUG("Created dummy \"/dev/ptmx\" file as bind mount target");
 
 	/* Fallback option: create symlink /dev/ptmx -> /dev/pts/ptmx  */
@@ -1680,11 +1679,9 @@ static int lxc_setup_dev_console(const struct lxc_rootfs *rootfs,
 	 * taken care of creating /dev/console.
 	 */
 	ret = mknod(path, S_IFREG | 0000, 0);
-	if (ret < 0) {
-		if (errno != EEXIST) {
-			SYSERROR("Failed to create console");
-			return -errno;
-		}
+	if (ret < 0 && errno != EEXIST) {
+		SYSERROR("Failed to create console");
+		return -errno;
 	}
 
 	ret = fchmod(console->slave, S_IXUSR | S_IXGRP | S_IXOTH);
@@ -1708,7 +1705,7 @@ static int lxc_setup_ttydir_console(const struct lxc_rootfs *rootfs,
 				    const struct lxc_terminal *console,
 				    char *ttydir)
 {
-	int ret, fd;
+	int ret;
 	char path[MAXPATHLEN], lxcpath[MAXPATHLEN];
 	char *rootfs_path = rootfs->path ? rootfs->mount : "";
 
@@ -1731,13 +1728,11 @@ static int lxc_setup_ttydir_console(const struct lxc_rootfs *rootfs,
 	if (ret < 0 || (size_t)ret >= sizeof(lxcpath))
 		return -1;
 
-	ret = creat(lxcpath, 0660);
-	if (ret == -1 && errno != EEXIST) {
+	ret = mknod(lxcpath, S_IFREG | 0000, 0);
+	if (ret < 0 && errno != EEXIST) {
 		SYSERROR("Failed to create \"%s\"", lxcpath);
 		return -errno;
 	}
-	if (ret >= 0)
-		close(ret);
 
 	ret = snprintf(path, sizeof(path), "%s/dev/console", rootfs_path);
 	if (ret < 0 || (size_t)ret >= sizeof(path))
@@ -1753,17 +1748,13 @@ static int lxc_setup_ttydir_console(const struct lxc_rootfs *rootfs,
 		}
 	}
 
-	fd = open(path, O_CREAT | O_EXCL, S_IXUSR | S_IXGRP | S_IXOTH);
-	if (fd < 0) {
-		if (errno != EEXIST) {
-			SYSERROR("Failed to create console");
-			return -errno;
-		}
-	} else {
-		close(fd);
+	ret = mknod(path, S_IFREG | 0000, 0);
+	if (ret < 0 && errno != EEXIST) {
+		SYSERROR("Failed to create console");
+		return -errno;
 	}
 
-	ret = chmod(console->name, S_IXUSR | S_IXGRP | S_IXOTH);
+	ret = fchmod(console->slave, S_IXUSR | S_IXGRP | S_IXOTH);
 	if (ret < 0) {
 		SYSERROR("Failed to set mode \"0%o\" to \"%s\"",
 			 S_IXUSR | S_IXGRP | S_IXOTH, console->name);
@@ -2079,7 +2070,7 @@ static int mount_entry_create_dir_file(const struct mntent *mntent,
 				       const struct lxc_rootfs *rootfs,
 				       const char *lxc_name, const char *lxc_path)
 {
-	int fd, ret;
+	int ret;
 	char *p1, *p2;
 
 	if (strncmp(mntent->mnt_type, "overlay", 7) == 0) {
@@ -2116,10 +2107,9 @@ static int mount_entry_create_dir_file(const struct mntent *mntent,
 		return -1;
 	}
 
-	fd = open(path, O_CREAT, 0644);
-	if (fd < 0)
-		return -1;
-	close(fd);
+	ret = mknod(path, S_IFREG | 0000, 0);
+	if (ret < 0 && errno != EEXIST)
+		return -errno;
 
 	return 0;
 }


More information about the lxc-devel mailing list