Hi, I just noticed that this is not completely correct. readlink() does not append a NULL byte, so you'll probably want to make the buffer one byte longer and either initialize it or set buf[ret] = '\0' (after the truncation check).
Benjamin On Thu, 2024-10-10 at 16:14 +0200, Johannes Berg wrote: > From: Johannes Berg <johannes.b...@intel.com> > > 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: 68b9883cc16e ("um: Discover host_task_size from envp") > Signed-off-by: Johannes Berg <johannes.b...@intel.com> > --- > arch/um/os-Linux/Makefile | 2 ++ > arch/um/os-Linux/main.c | 14 ++++++++++++-- > 2 files changed, 14 insertions(+), 2 deletions(-) > > diff --git a/arch/um/os-Linux/Makefile b/arch/um/os-Linux/Makefile > index 544e0b344c75..049dfa5bc9c6 100644 > --- a/arch/um/os-Linux/Makefile > +++ b/arch/um/os-Linux/Makefile > @@ -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 > \ > diff --git a/arch/um/os-Linux/main.c b/arch/um/os-Linux/main.c > index 8a52c49c5361..31dba0912a19 100644 > --- a/arch/um/os-Linux/main.c > +++ b/arch/um/os-Linux/main.c > @@ -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(); >