um: restore process name

After the execve() to disable ASLR, comm is now "exe",
which is a bit confusing. Use readlink() to get this
to the right name again.

Disable stack frame size warnings on main.o since it's
part of the initial userspace and can use larger stack.

Fixes: 68b9883cc1 ("um: Discover host_task_size from envp")
Link: https://patch.msgid.link/20241010161411.c576e2aeb3e5.I244d4f34b8a8555ee5bec0e1cf5027bce4cc491b@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
Johannes Berg 2024-10-10 16:14:12 +02:00
parent 14d4a7b516
commit 031acdcfb5
2 changed files with 14 additions and 2 deletions

View File

@ -12,6 +12,8 @@ obj-y = execvp.o file.o helper.o irq.o main.o mem.o process.o \
CFLAGS_signal.o += -Wframe-larger-than=4096
CFLAGS_main.o += -Wno-frame-larger-than
obj-$(CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA) += elf_aux.o
USER_OBJS := $(user-objs-y) elf_aux.o execvp.o file.o helper.o irq.o \

View File

@ -10,6 +10,7 @@
#include <errno.h>
#include <signal.h>
#include <string.h>
#include <limits.h>
#include <sys/resource.h>
#include <sys/personality.h>
#include <as-layout.h>
@ -112,8 +113,17 @@ int __init main(int argc, char **argv, char **envp)
/* Disable randomization and re-exec if it was changed successfully */
ret = personality(PER_LINUX | ADDR_NO_RANDOMIZE);
if (ret >= 0 && (ret & (PER_LINUX | ADDR_NO_RANDOMIZE)) !=
(PER_LINUX | ADDR_NO_RANDOMIZE))
execve("/proc/self/exe", argv, envp);
(PER_LINUX | ADDR_NO_RANDOMIZE)) {
char buf[PATH_MAX] = {};
ssize_t ret;
ret = readlink("/proc/self/exe", buf, sizeof(buf));
if (ret < 0 || ret >= sizeof(buf)) {
perror("readlink failure");
exit(1);
}
execve(buf, argv, envp);
}
set_stklim();