this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add sys_execve()

+96
+1
src/kernel/emulation/linux/CMakeLists.txt
··· 57 57 process/fork.c 58 58 process/wait4.c 59 59 process/waitid.c 60 + process/execve.c 60 61 signal/duct_signals.c 61 62 signal/kill.c 62 63 signal/sigaltstack.c
+86
src/kernel/emulation/linux/process/execve.c
··· 1 + #include "execve.h" 2 + #include "../base.h" 3 + #include "../errno.h" 4 + #include <asm/unistd.h> 5 + #include "../fcntl/open.h" 6 + #include "../unistd/read.h" 7 + #include "../unistd/close.h" 8 + #include "../unistd/readlink.h" 9 + #include <stdint.h> 10 + 11 + #define MH_MAGIC 0xfeedface 12 + #define MH_CIGAM 0xcefaedfe 13 + #define MH_MAGIC_64 0xfeedfacf 14 + #define MH_CIGAM_64 0xcffaedfe 15 + #define FAT_MAGIC 0xcafebabe 16 + #define FAT_CIGAM 0xbebafeca 17 + 18 + extern int strcmp(const char *s1, const char *s2); 19 + 20 + long sys_execve(char* fname, char** argvp, char** envp) 21 + { 22 + int ret, fd; 23 + uint32_t magic; 24 + char dyld_path[256]; 25 + 26 + // Ideally, if everybody used binfmt_misc to allow direct 27 + // execution of Mach-O binaries under Darling, this wouldn't 28 + // be necessary. But we cannot rely on that. 29 + 30 + fd = sys_open(fname, BSD_O_RDONLY, 0); 31 + if (fd < 0) 32 + return fd; 33 + 34 + ret = sys_read(fd, &magic, sizeof(magic)); 35 + if (ret != 4) 36 + goto no_macho; 37 + 38 + if (magic == MH_MAGIC || magic == MH_CIGAM 39 + || magic == MH_MAGIC_64 || magic == MH_CIGAM_64 40 + || magic == FAT_MAGIC || magic == FAT_CIGAM) 41 + { 42 + // It is a Mach-O file 43 + int len, i; 44 + char** modargvp; 45 + 46 + len = sys_readlink("/proc/self/exe", dyld_path, sizeof(dyld_path)-1); 47 + if (len < 0) 48 + goto no_macho; 49 + 50 + dyld_path[len] = '\0'; 51 + 52 + // Remove 64 or 32 suffix if present 53 + if (strcmp(&dyld_path[len - 2], "32") == 0 54 + || strcmp(&dyld_path[len - 2], "64") == 0) 55 + { 56 + dyld_path[len-2] = '\0'; 57 + } 58 + 59 + // Prepend dyld path 60 + len = 0; 61 + 62 + // Count arguments 63 + while (argvp[len++]); 64 + 65 + // Allocate a new argvp, execute dyld_path 66 + modargvp = (char**) __builtin_alloca(sizeof(void*) * (len+1)); 67 + modargvp[0] = dyld_path; 68 + modargvp[1] = fname; 69 + 70 + for (i = 2; i < len+1; i++) 71 + modargvp[i] = argvp[i-1]; 72 + 73 + argvp = modargvp; 74 + fname = dyld_path; 75 + } 76 + 77 + no_macho: 78 + sys_close(fd); 79 + 80 + ret = LINUX_SYSCALL(__NR_execve, fname, argvp, envp); 81 + if (ret < 0) 82 + ret = errno_linux_to_bsd(ret); 83 + 84 + return ret; 85 + } 86 +
+7
src/kernel/emulation/linux/process/execve.h
··· 1 + #ifndef LINUX_EXECVE_H 2 + #define LINUX_EXECVE_H 3 + 4 + long sys_execve(char* fname, char** argvp, char** envp); 5 + 6 + #endif 7 +
+2
src/kernel/emulation/linux/syscalls.c
··· 47 47 #include "process/vfork.h" 48 48 #include "process/wait4.h" 49 49 #include "process/waitid.h" 50 + #include "process/execve.h" 50 51 #include "misc/ioctl.h" 51 52 #include "misc/getrlimit.h" 52 53 #include "misc/thread_selfid.h" ··· 116 117 [54] = sys_ioctl, 117 118 [57] = sys_symlink, 118 119 [58] = sys_readlink, 120 + [59] = sys_execve, 119 121 [60] = sys_umask, 120 122 [61] = sys_chroot, 121 123 [66] = sys_vfork,