diff --git a/src/basic/namespace-util.c b/src/basic/namespace-util.c index 74c3ca04218..a55b76df97b 100644 --- a/src/basic/namespace-util.c +++ b/src/basic/namespace-util.c @@ -10,6 +10,7 @@ #include "namespace-util.h" #include "process-util.h" #include "stat-util.h" +#include "stdio-util.h" #include "user-util.h" int namespace_open(pid_t pid, int *pidns_fd, int *mntns_fd, int *netns_fd, int *userns_fd, int *root_fd) { @@ -82,15 +83,14 @@ int namespace_open(pid_t pid, int *pidns_fd, int *mntns_fd, int *netns_fd, int * } int namespace_enter(int pidns_fd, int mntns_fd, int netns_fd, int userns_fd, int root_fd) { - if (userns_fd >= 0) { - /* Can't setns to your own userns, since then you could - * escalate from non-root to root in your own namespace, so - * check if namespaces equal before attempting to enter. */ - _cleanup_free_ char *userns_fd_path = NULL; - int r; - if (asprintf(&userns_fd_path, "/proc/self/fd/%d", userns_fd) < 0) - return -ENOMEM; + int r; + if (userns_fd >= 0) { + /* Can't setns to your own userns, since then you could escalate from non-root to root in + * your own namespace, so check if namespaces are equal before attempting to enter. */ + + char userns_fd_path[STRLEN("/proc/self/fd/") + DECIMAL_STR_MAX(int)]; + xsprintf(userns_fd_path, "/proc/self/fd/%d", userns_fd); r = files_same(userns_fd_path, "/proc/self/ns/user", 0); if (r < 0) return r;