diff options
| -rwxr-xr-x | src/emu/x64int3.c | 2 | ||||
| -rwxr-xr-x | src/include/fileutils.h | 3 | ||||
| -rwxr-xr-x | src/tools/fileutils.c | 22 | ||||
| -rw-r--r-- | src/wrapped/generated/functions_list.txt | 1 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.c | 3 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.h | 1 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibc.c | 32 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibc_private.h | 6 |
8 files changed, 55 insertions, 15 deletions
diff --git a/src/emu/x64int3.c b/src/emu/x64int3.c index f79d897d..f56e66ca 100755 --- a/src/emu/x64int3.c +++ b/src/emu/x64int3.c @@ -154,7 +154,7 @@ void x64Int3(x64emu_t* emu, uintptr_t* addr) perr = 1; } else if (strstr(s, "waitpid")==s) { pu32 = (uint32_t*)R_RSI; - snprintf(buff, 255, "%04d|%p: Calling %s(%ld, %p, %d)", tid, *(void**)(R_RSP), s, R_RDI, pu32, R_EDX); + snprintf(buff, 255, "%04d|%p: Calling %s(%d, %p, %d)", tid, *(void**)(R_RSP), s, R_EDI, pu32, R_EDX); perr = 1; post = 6; } else if (!strcmp(s, "lseek64")) { diff --git a/src/include/fileutils.h b/src/include/fileutils.h index 79da42bc..ff69e6da 100755 --- a/src/include/fileutils.h +++ b/src/include/fileutils.h @@ -18,6 +18,9 @@ int FileIsX86ELF(const char* filename); int FileIsX64ELF(const char* filename); int FileIsShell(const char* filename); +// return temp folder (will return /tmp if nothing is correct) +const char* GetTmpDir(); + #if defined(RPI) || defined(RK3399) || defined(RK3326) void sanitize_mojosetup_gtk_background(); #endif diff --git a/src/tools/fileutils.c b/src/tools/fileutils.c index 06299fc0..42524ee8 100755 --- a/src/tools/fileutils.c +++ b/src/tools/fileutils.c @@ -107,16 +107,30 @@ int FileIsShell(const char* filename) char head[20] = {0}; int sz = fread(head, strlen(bashsign), 1, f); fclose(f); - if(sz!=1) { + if(sz!=1) return 0; - if(memcmp(head, bashsign, strlen(bashsign))==0) + head[strlen(bashsign)+1] = 0; + if(!strcmp(head, bashsign)) return 1; - } - if(memcmp(head, shsign, strlen(shsign))==0) + head[strlen(shsign)+1] = 0; + if(!strcmp(head, shsign)) return 1; return 0; } +const char* GetTmpDir() { + char *tmpdir; + if ((tmpdir = getenv ("TMPDIR")) != NULL) return tmpdir; + if ((tmpdir = getenv ("TEMP")) != NULL) return tmpdir; + if ((tmpdir = getenv ("TMP")) != NULL) return tmpdir; + if(FileExist("/tmp", 0)) return "/tmp"; + if(FileExist("/var/tmp", 0)) return "/var/tmp"; + if(FileExist("/usr/tmp", 0)) return "/usr/tmp"; + + return "/tmp"; // meh... +} + + #if defined(RPI) || defined(RK3399) || defined(RK3326) void sanitize_mojosetup_gtk_background() { diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt index 2f537346..56bbae31 100644 --- a/src/wrapped/generated/functions_list.txt +++ b/src/wrapped/generated/functions_list.txt @@ -484,7 +484,6 @@ #() lFipi #() lFipL #() lFlll -#() lFlpi #() lFpli #() lFpLu #() lFpLp diff --git a/src/wrapped/generated/wrapper.c b/src/wrapped/generated/wrapper.c index babaf870..74866d6e 100644 --- a/src/wrapped/generated/wrapper.c +++ b/src/wrapped/generated/wrapper.c @@ -518,7 +518,6 @@ typedef intptr_t (*lFilL_t)(int64_t, intptr_t, uintptr_t); typedef intptr_t (*lFipi_t)(int64_t, void*, int64_t); typedef intptr_t (*lFipL_t)(int64_t, void*, uintptr_t); typedef intptr_t (*lFlll_t)(intptr_t, intptr_t, intptr_t); -typedef intptr_t (*lFlpi_t)(intptr_t, void*, int64_t); typedef intptr_t (*lFpli_t)(void*, intptr_t, int64_t); typedef intptr_t (*lFpLu_t)(void*, uintptr_t, uint64_t); typedef intptr_t (*lFpLp_t)(void*, uintptr_t, void*); @@ -2712,7 +2711,6 @@ void lFilL(x64emu_t *emu, uintptr_t fcn) { lFilL_t fn = (lFilL_t)fcn; R_RAX=(int void lFipi(x64emu_t *emu, uintptr_t fcn) { lFipi_t fn = (lFipi_t)fcn; R_RAX=(intptr_t)fn((int64_t)R_RDI, (void*)R_RSI, (int64_t)R_RDX); } void lFipL(x64emu_t *emu, uintptr_t fcn) { lFipL_t fn = (lFipL_t)fcn; R_RAX=(intptr_t)fn((int64_t)R_RDI, (void*)R_RSI, (uintptr_t)R_RDX); } void lFlll(x64emu_t *emu, uintptr_t fcn) { lFlll_t fn = (lFlll_t)fcn; R_RAX=(intptr_t)fn((intptr_t)R_RDI, (intptr_t)R_RSI, (intptr_t)R_RDX); } -void lFlpi(x64emu_t *emu, uintptr_t fcn) { lFlpi_t fn = (lFlpi_t)fcn; R_RAX=(intptr_t)fn((intptr_t)R_RDI, (void*)R_RSI, (int64_t)R_RDX); } void lFpli(x64emu_t *emu, uintptr_t fcn) { lFpli_t fn = (lFpli_t)fcn; R_RAX=(intptr_t)fn((void*)R_RDI, (intptr_t)R_RSI, (int64_t)R_RDX); } void lFpLu(x64emu_t *emu, uintptr_t fcn) { lFpLu_t fn = (lFpLu_t)fcn; R_RAX=(intptr_t)fn((void*)R_RDI, (uintptr_t)R_RSI, (uint64_t)R_RDX); } void lFpLp(x64emu_t *emu, uintptr_t fcn) { lFpLp_t fn = (lFpLp_t)fcn; R_RAX=(intptr_t)fn((void*)R_RDI, (uintptr_t)R_RSI, (void*)R_RDX); } @@ -4848,7 +4846,6 @@ int isSimpleWrapper(wrapper_t fun) { if (fun == &lFipi) return 1; if (fun == &lFipL) return 1; if (fun == &lFlll) return 1; - if (fun == &lFlpi) return 1; if (fun == &lFpli) return 1; if (fun == &lFpLu) return 1; if (fun == &lFpLp) return 1; diff --git a/src/wrapped/generated/wrapper.h b/src/wrapped/generated/wrapper.h index e643fd5e..2e9d97b3 100644 --- a/src/wrapped/generated/wrapper.h +++ b/src/wrapped/generated/wrapper.h @@ -517,7 +517,6 @@ void lFilL(x64emu_t *emu, uintptr_t fnc); void lFipi(x64emu_t *emu, uintptr_t fnc); void lFipL(x64emu_t *emu, uintptr_t fnc); void lFlll(x64emu_t *emu, uintptr_t fnc); -void lFlpi(x64emu_t *emu, uintptr_t fnc); void lFpli(x64emu_t *emu, uintptr_t fnc); void lFpLu(x64emu_t *emu, uintptr_t fnc); void lFpLp(x64emu_t *emu, uintptr_t fnc); diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c index df4e120b..ad6e804a 100755 --- a/src/wrapped/wrappedlibc.c +++ b/src/wrapped/wrappedlibc.c @@ -1726,7 +1726,7 @@ EXPORT int32_t my_execve(x64emu_t* emu, const char* path, char* const argv[], ch int x64 = FileIsX64ELF(path); int x86 = my_context->box86path?FileIsX86ELF(path):0; int script = (my_context->bashpath && FileIsShell(path))?1:0; - printf_log(LOG_DEBUG, "execve(\"%s\", %p, %p) is x64=%d x86=%d script=%d (my_context->envv=%p, environ=%p\n", path, argv, envp, x64, x86, script, my_context->envv, environ); + printf_log(LOG_DEBUG, "execve(\"%s\", %p[\"%s\", \"%s\", \"%s\"...], %p) is x64=%d x86=%d script=%d (my_context->envv=%p, environ=%p\n", path, argv, argv[0], argv[1]?argv[1]:"(nil)", argv[2]?argv[2]:"(nil)", envp, x64, x86, script, my_context->envv, environ); // hack to update the environ var if needed if(envp == my_context->envv && environ) { envp = environ; @@ -1743,8 +1743,9 @@ EXPORT int32_t my_execve(x64emu_t* emu, const char* path, char* const argv[], ch const char** newargv = (const char**)box_calloc(n+1+toadd, sizeof(char*)); newargv[0] = x86?emu->context->box86path:emu->context->box64path; if(script) newargv[1] = emu->context->bashpath; // script needs to be launched with bash - memcpy(newargv+toadd, argv+skip_first, sizeof(char*)*(n+toadd)); + memcpy(newargv+toadd, argv+skip_first, sizeof(char*)*(n+1)); if(self) newargv[toadd] = emu->context->fullpath; + else newargv[toadd] = path; printf_log(LOG_DEBUG, " => execve(\"%s\", %p [\"%s\", \"%s\", \"%s\"...:%d], %p)\n", newargv[0], newargv, newargv[0], (n+toadd)?newargv[1]:"", ((n+toadd)>1)?newargv[2]:"",n, envp); int ret = execve(newargv[0], (char* const*)newargv, envp); box_free(newargv); @@ -1759,6 +1760,33 @@ EXPORT int32_t my_execve(x64emu_t* emu, const char* path, char* const argv[], ch char *argv2[3] = { my_context->box64path, argv[1], NULL }; return execve(path, argv2, envp); } + #ifndef NOALIGN + if(!strcmp(path + strlen(path) - strlen("/grep"), "/grep") + && argv[1] && argv[2] && !strcmp(argv[2], "/proc/cpuinfo")) { + // special case of a bash script shell running grep on cpuinfo to extract capacities... + int n=0; + while(argv[n]) ++n; + const char** newargv = (const char**)box_calloc(n+1, sizeof(char*)); + memcpy(newargv, argv, sizeof(char*)*(n)); + // create a dummy cpuinfo in temp (that will stay there, sorry) + const char* tmpdir = GetTmpDir(); + char template[100] = {0}; + sprintf(template, "%s/box64cpuinfoXXXXXX", tmpdir); + int fd = mkstemp(template); + CreateCPUInfoFile(fd); + // get back the name + char cpuinfo_file[100] = {0}; + sprintf(template, "/proc/self/fd/%d", fd); + int rl = readlink(template, cpuinfo_file, sizeof(cpuinfo_file)); + close(fd); + chmod(cpuinfo_file, 0666); + newargv[2] = cpuinfo_file; + printf_log(LOG_DEBUG, " => execve(\"%s\", %p [\"%s\", \"%s\", \"%s\"...:%d], %p)\n", path, newargv, newargv[0], newargv[1], newargv[2],n, envp); + int ret = execve(path, (char* const*)newargv, envp); + box_free(newargv); + return ret; + } + #endif return execve(path, argv, envp); } diff --git a/src/wrapped/wrappedlibc_private.h b/src/wrapped/wrappedlibc_private.h index 64d6d553..0d80202e 100755 --- a/src/wrapped/wrappedlibc_private.h +++ b/src/wrapped/wrappedlibc_private.h @@ -2084,13 +2084,13 @@ GOM(__vsyslog_chk, vFEiipA) //GO(vwprintf, iFpA) //GO(__vwprintf_chk, //GO(vwscanf, iFpA) -GOW(__wait, lFp) +GOW(__wait, iFp) GOW(wait, iFp) GOW(wait3, iFpip) GOW(wait4, iFipip) GOW(waitid, iFuupi) -GO(__waitpid, lFlpi) -GOW(waitpid, lFlpi) +GO(__waitpid, iFipi) +GOW(waitpid, iFipi) GOM(warn, vFEpV) GOM(warnx, vFEpV) GOW(wcpcpy, pFpp) |