this repo has no description
1
fork

Configure Feed

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

Fix execve() on scripts

+69 -10
+69 -10
src/kernel/emulation/linux/process/execve.c
··· 9 9 #include <stdint.h> 10 10 #include <stddef.h> 11 11 #include <stdbool.h> 12 + #include <errno.h> 12 13 13 14 #define MH_MAGIC 0xfeedface 14 15 #define MH_CIGAM 0xcefaedfe ··· 21 22 extern char *strcat(char *dest, const char *src); 22 23 extern char *strcpy(char *dest, const char *src); 23 24 extern char* strchr(const char* s, int c); 25 + extern void *memchr(const void *s, int c, __SIZE_TYPE__ n); 24 26 extern int strncmp(const char *s1, const char *s2, __SIZE_TYPE__ n); 25 27 extern __SIZE_TYPE__ strlen(const char *s); 26 28 ··· 31 33 32 34 long sys_execve(char* fname, char** argvp, char** envp) 33 35 { 34 - int ret, fd; 36 + int ret, fd, len; 35 37 char mldr_path[256]; 36 38 union 37 39 { ··· 48 50 return fd; 49 51 50 52 ret = sys_read(fd, m.magic_array, sizeof(m.magic_array)); 53 + sys_close(fd); 54 + 51 55 if (ret < 4) 52 - goto no_macho; 56 + return -ENOEXEC; 57 + 58 + len = LINUX_SYSCALL(__NR_readlink, "/proc/self/exe", mldr_path, sizeof(mldr_path)-1); 59 + if (len < 0) 60 + return -ENOEXEC; 61 + mldr_path[len] = '\0'; 53 62 54 63 if (m.magic == MH_MAGIC || m.magic == MH_CIGAM 55 64 || m.magic == MH_MAGIC_64 || m.magic == MH_CIGAM_64 56 65 || m.magic == FAT_MAGIC || m.magic == FAT_CIGAM) 57 66 { 58 67 // It is a Mach-O file 59 - int len, i; 68 + int i; 60 69 char** modargvp; 61 70 char *buf; 62 - 63 - len = LINUX_SYSCALL(__NR_readlink, "/proc/self/exe", mldr_path, sizeof(mldr_path)-1); 64 - if (len < 0) 65 - goto no_macho; 66 - mldr_path[len] = '\0'; 67 71 68 72 // Prepend mldr path 69 73 len = 0; ··· 86 90 argvp = modargvp; 87 91 fname = mldr_path; 88 92 } 93 + // Shebang support 94 + else if (m.magic_array[0] == '#' && m.magic_array[1] == '!') 95 + { 96 + char *nl, *interp, *arg; 97 + char** modargvp; 98 + int i, j; 99 + 100 + nl = memchr(m.magic_array, '\n', sizeof(m.magic_array)); 101 + if (nl == NULL) 102 + return -ENOEXEC; 103 + 104 + *nl = '\0'; 105 + 106 + for (i = 2; isspace(m.magic_array[i]); i++); 107 + 108 + interp = &m.magic_array[i]; 109 + 110 + for (i = 0; !isspace(interp[i]) && interp[i]; i++); 111 + 112 + if (interp[i] == '\0') 113 + arg = NULL; 114 + else 115 + arg = &interp[i]; 116 + 117 + if (arg != NULL) 118 + { 119 + *arg = '\0'; // terminate interp 120 + while (isspace(*arg)) 121 + arg++; 122 + if (*arg == '\0') 123 + arg = NULL; // no argument, just whitespace 124 + } 125 + 126 + // Count original arguments 127 + while (argvp[len++]); 128 + 129 + // Allocate a new argvp 130 + modargvp = (char**) __builtin_alloca(sizeof(void*) * (len+3)); 131 + 132 + i = 0; 89 133 90 - no_macho: 91 - sys_close(fd); 134 + modargvp[i++] = mldr_path; 135 + modargvp[i++] = interp; 136 + if (arg != NULL) 137 + modargvp[i++] = arg; 138 + modargvp[i] = fname; 139 + 140 + // Append original arguments 141 + for (j = 1; j < len+1; j++) 142 + modargvp[i+j] = argvp[j]; 143 + 144 + argvp = modargvp; 145 + fname = mldr_path; 146 + } 147 + else 148 + { 149 + return -ENOEXEC; 150 + } 92 151 93 152 ret = LINUX_SYSCALL(__NR_execve, fname, argvp, envp); 94 153 if (ret < 0)