diff --git a/src/lxc/macro.h b/src/lxc/macro.h index 7626c5d76..042e239a7 100644 --- a/src/lxc/macro.h +++ b/src/lxc/macro.h @@ -149,6 +149,7 @@ #define LXC_LINELEN 4096 #define LXC_IDMAPLEN 4096 #define LXC_MAX_BUFFER 4096 +#define LXC_NAMESPACE_NAME_MAX 256 /* /proc/ = 6 * + diff --git a/src/lxc/utils.c b/src/lxc/utils.c index ea081c566..f20c6eeac 100644 --- a/src/lxc/utils.c +++ b/src/lxc/utils.c @@ -693,15 +693,18 @@ int detect_shared_rootfs(void) bool switch_to_ns(pid_t pid, const char *ns) { - int fd, ret; - char nspath[PATH_MAX]; + __do_close_prot_errno int fd = -EBADF; + int ret; + char nspath[STRLITERALLEN("/proc//ns/") + + INTTYPE_TO_STRLEN(pid_t) + + LXC_NAMESPACE_NAME_MAX]; /* Switch to new ns */ - ret = snprintf(nspath, PATH_MAX, "/proc/%d/ns/%s", pid, ns); - if (ret < 0 || ret >= PATH_MAX) + ret = snprintf(nspath, sizeof(nspath), "/proc/%d/ns/%s", pid, ns); + if (ret < 0 || ret >= sizeof(nspath)) return false; - fd = open(nspath, O_RDONLY); + fd = open(nspath, O_RDONLY | O_CLOEXEC); if (fd < 0) { SYSERROR("Failed to open \"%s\"", nspath); return false; @@ -709,12 +712,11 @@ bool switch_to_ns(pid_t pid, const char *ns) ret = setns(fd, 0); if (ret) { - SYSERROR("Failed to set process %d to \"%s\" of %d.", pid, ns, fd); - close(fd); + SYSERROR("Failed to set process %d to \"%s\" of %d.", pid, ns, + fd); return false; } - close(fd); return true; }