this repo has no description
1
fork

Configure Feed

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

Fix exec'ing ELFs

+14 -16
+14 -16
src/kernel/emulation/linux/process/execve.c
··· 96 96 char *nl, *interp, *arg; 97 97 char** modargvp; 98 98 int i, j; 99 - 99 + 100 100 nl = memchr(m.magic_array, '\n', sizeof(m.magic_array)); 101 101 if (nl == NULL) 102 102 return -ENOEXEC; 103 - 103 + 104 104 *nl = '\0'; 105 - 105 + 106 106 for (i = 2; isspace(m.magic_array[i]); i++); 107 - 107 + 108 108 interp = &m.magic_array[i]; 109 - 109 + 110 110 for (i = 0; !isspace(interp[i]) && interp[i]; i++); 111 - 111 + 112 112 if (interp[i] == '\0') 113 113 arg = NULL; 114 114 else 115 115 arg = &interp[i]; 116 - 116 + 117 117 if (arg != NULL) 118 118 { 119 119 *arg = '\0'; // terminate interp ··· 124 124 if (*arg == '\0') 125 125 arg = NULL; // no argument, just whitespace 126 126 } 127 - 127 + 128 128 // Count original arguments 129 129 while (argvp[len++]); 130 - 130 + 131 131 // Allocate a new argvp 132 132 modargvp = (char**) __builtin_alloca(sizeof(void*) * (len+3)); 133 - 133 + 134 134 i = 0; 135 135 136 136 modargvp[i++] = mldr_path; ··· 138 138 if (arg != NULL) 139 139 modargvp[i++] = arg; 140 140 modargvp[i] = fname; 141 - 141 + 142 142 // Append original arguments 143 143 for (j = 1; j < len+1; j++) 144 144 modargvp[i+j] = argvp[j]; 145 - 145 + 146 146 argvp = modargvp; 147 147 fname = mldr_path; 148 148 } 149 - else 150 - { 151 - return -ENOEXEC; 152 - } 149 + 150 + // otherwise, it's a native Linux executable (ELF) 153 151 154 152 ret = LINUX_SYSCALL(__NR_execve, fname, argvp, envp); 155 153 if (ret < 0)