about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-09-18 19:00:53 +0200
committerptitSeb <sebastien.chev@gmail.com>2022-09-18 19:00:53 +0200
commitdcb4bbb3e622f657f94e5ce3e79a1557281643cc (patch)
tree0c6af4c289d9ac04bb4219b1a102afc615853e5b /src
parent21c56e78988e424ef027985312b4e376a84c15f9 (diff)
downloadbox64-dcb4bbb3e622f657f94e5ce3e79a1557281643cc.tar.gz
box64-dcb4bbb3e622f657f94e5ce3e79a1557281643cc.zip
More fixes and improvment to bash handling (helps #360)
Diffstat (limited to 'src')
-rwxr-xr-xsrc/emu/x64int3.c2
-rwxr-xr-xsrc/include/fileutils.h3
-rwxr-xr-xsrc/tools/fileutils.c22
-rw-r--r--src/wrapped/generated/functions_list.txt1
-rw-r--r--src/wrapped/generated/wrapper.c3
-rw-r--r--src/wrapped/generated/wrapper.h1
-rwxr-xr-xsrc/wrapped/wrappedlibc.c32
-rwxr-xr-xsrc/wrapped/wrappedlibc_private.h6
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)