# This adds a check that /tmp is not mounted noexec. UML needs to be able # to do PROT_EXEC mmaps of temp files. Previously, a noexec /tmp would # cause an early mysterious UML crash. Index: um/arch/um/include/mem_user.h =================================================================== --- um.orig/arch/um/include/mem_user.h 2004-06-29 08:42:03.000000000 -0400 +++ um/arch/um/include/mem_user.h 2004-09-20 11:28:09.000000000 -0400 @@ -66,6 +66,7 @@ extern int protect_memory(unsigned long addr, unsigned long len, int r, int w, int x, int must_succeed); extern unsigned long get_kmem_end(void); +extern void check_tmpexec(void); #endif Index: um/arch/um/kernel/mem_user.c =================================================================== --- um.orig/arch/um/kernel/mem_user.c 2004-08-12 14:25:02.000000000 -0400 +++ um/arch/um/kernel/mem_user.c 2004-09-20 11:29:26.000000000 -0400 @@ -83,6 +83,26 @@ return(fd); } +void check_tmpexec(void) +{ + void *addr; + int err, fd = create_tmp_file(UM_KERN_PAGE_SIZE); + + addr = mmap(NULL, UM_KERN_PAGE_SIZE, + PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE, fd, 0); + printf("Checking PROT_EXEC mmap in /tmp..."); + fflush(stdout); + if(addr == MAP_FAILED){ + err = errno; + perror("failed"); + if(err == EPERM) + printf("/tmp must be not mounted noexec\n"); + exit(1); + } + printf("OK\n"); + munmap(addr, UM_KERN_PAGE_SIZE); +} + static int have_devanon(void) { int fd; @@ -109,7 +129,7 @@ exit(1); } - addr = mmap(NULL, len, PROT_READ | PROT_WRITE , MAP_PRIVATE, fd, 0); + addr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); if(addr == MAP_FAILED){ os_print_error((int) addr, "mapping physmem file"); exit(1); Index: um/arch/um/kernel/um_arch.c =================================================================== --- um.orig/arch/um/kernel/um_arch.c 2004-08-12 21:25:45.000000000 -0400 +++ um/arch/um/kernel/um_arch.c 2004-09-20 11:28:09.000000000 -0400 @@ -319,6 +319,11 @@ uml_start = CHOOSE_MODE_PROC(set_task_sizes_tt, set_task_sizes_skas, 0, &host_task_size, &task_size); + /* Need to check this early because mmapping happens before the + * kernel is running. + */ + check_tmpexec(); + brk_start = (unsigned long) sbrk(0); CHOOSE_MODE_PROC(before_mem_tt, before_mem_skas, brk_start); /* Increase physical memory size for exec-shield users