From fc2ad9dcdd756452694b523b39acf6e369fc282b Mon Sep 17 00:00:00 2001 From: Christian Brauner Date: Sat, 29 Apr 2017 00:03:06 +0200 Subject: [PATCH] utils: tweak lxc_mount_proc_if_needed() Create /proc directory if it doesn't exist. Closes #1475. Signed-off-by: Christian Brauner --- src/lxc/utils.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/lxc/utils.c b/src/lxc/utils.c index 03386dd73..6458bbdce 100644 --- a/src/lxc/utils.c +++ b/src/lxc/utils.c @@ -1766,37 +1766,48 @@ int lxc_mount_proc_if_needed(const char *rootfs) SYSERROR("proc path name too long"); return -1; } + memset(link, 0, 20); linklen = readlink(path, link, 20); mypid = (int)getpid(); - INFO("I am %d, /proc/self points to '%s'", mypid, link); + INFO("I am %d, /proc/self points to \"%s\"", mypid, link); + ret = snprintf(path, MAXPATHLEN, "%s/proc", rootfs); if (ret < 0 || ret >= MAXPATHLEN) { SYSERROR("proc path name too long"); return -1; } - if (linklen < 0) /* /proc not mounted */ + + /* /proc not mounted */ + if (linklen < 0) { + if (mkdir(path, 0755) && errno != EEXIST) + return -1; goto domount; + } + if (lxc_safe_int(link, &link_to_pid) < 0) return -1; + + /* wrong /procs mounted */ if (link_to_pid != mypid) { - /* wrong /procs mounted */ - umount2(path, MNT_DETACH); /* ignore failure */ + /* ignore failure */ + umount2(path, MNT_DETACH); goto domount; } + /* the right proc is already mounted */ return 0; domount: - if (!strcmp(rootfs,"")) /* rootfs is NULL */ + /* rootfs is NULL */ + if (!strcmp(rootfs,"")) ret = mount("proc", path, "proc", 0, NULL); else ret = safe_mount("proc", path, "proc", 0, NULL, rootfs); - if (ret < 0) return -1; - INFO("Mounted /proc in container for security transition"); + INFO("mounted /proc in container for security transition"); return 1; } -- 2.47.2