about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-09-01 13:59:51 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-09-01 13:59:51 +0200
commit02364151bcba524825838140f3d1a61db59dab88 (patch)
tree3d6ba2cf3ea39d3ddf6119f30f84b8512b155157 /src
parent9178effd9f837b52107c1943e9736cf2dfc5d40d (diff)
downloadbox64-02364151bcba524825838140f3d1a61db59dab88.tar.gz
box64-02364151bcba524825838140f3d1a61db59dab88.zip
[BOX32] Some fixes to strtol/strtoul and read 32bits wrapped functions
Diffstat (limited to 'src')
-rw-r--r--src/emu/x86syscall_32.c9
-rwxr-xr-xsrc/wrapped32/wrappedlibc.c6
-rwxr-xr-xsrc/wrapped32/wrappedlibc_private.h2
3 files changed, 9 insertions, 8 deletions
diff --git a/src/emu/x86syscall_32.c b/src/emu/x86syscall_32.c
index 58bcb5bb..2bc41ff9 100644
--- a/src/emu/x86syscall_32.c
+++ b/src/emu/x86syscall_32.c
@@ -233,6 +233,7 @@ struct i386_user_desc {
 
 int32_t my32_open(x64emu_t* emu, void* pathname, int32_t flags, uint32_t mode);
 int32_t my32_execve(x64emu_t* emu, const char* path, char* const argv[], char* const envp[]);
+ssize_t my32_read(int fd, void* buf, size_t count);
 int my32_munmap(x64emu_t* emu, void* addr, unsigned long length);
 
 void EXPORT x86Syscall(x64emu_t *emu)
@@ -271,10 +272,10 @@ void EXPORT x86Syscall(x64emu_t *emu)
             R_EAX = R_EBX; // faking the syscall here, we don't want to really terminate the thread now
             break;
         case 3:  // sys_read
-            S_EAX = read((int)R_EBX, from_ptrv(R_ECX), from_ulong(R_EDX));
+            S_EAX = to_long(my32_read((int)R_EBX, from_ptrv(R_ECX), from_ulong(R_EDX)));
             break;
         case 4:  // sys_write
-            S_EAX = write((int)R_EBX, from_ptrv(R_ECX), from_ulong(R_EDX));
+            S_EAX = to_long(write((int)R_EBX, from_ptrv(R_ECX), from_ulong(R_EDX)));
             break;
         case 5: // sys_open
             if(s==5) {printf_log(LOG_DEBUG, " => sys_open(\"%s\", %d, %d)", (char*)from_ptrv(R_EBX), of_convert32(R_ECX), R_EDX);}; 
@@ -338,9 +339,9 @@ uint32_t EXPORT my32_syscall(x64emu_t *emu, ptr_t* b)
             emu->quit = 1;
             return u32(4); // faking the syscall here, we don't want to really terminate the program now
         case 3:  // sys_read
-            return (uint32_t)read(i32(4), p(8), u32(12));
+            return (uint32_t)to_long(my32_read(i32(4), p(8), u32(12)));
         case 4:  // sys_write
-            return (uint32_t)write(i32(4), p(8), u32(12));
+            return (uint32_t)to_long(write(i32(4), p(8), u32(12)));
         case 5: // sys_open
             return my32_open(emu, p(4), of_convert32(u32(8)), u32(12));
         case 6:  // sys_close
diff --git a/src/wrapped32/wrappedlibc.c b/src/wrapped32/wrappedlibc.c
index 88031874..9ed02ae3 100755
--- a/src/wrapped32/wrappedlibc.c
+++ b/src/wrapped32/wrappedlibc.c
@@ -1535,7 +1535,7 @@ static int hasDBFromAddress(uintptr_t addr)
 }
 #endif
 
-EXPORT int32_t my32_read(int fd, void* buf, uint32_t count)
+EXPORT ssize_t my32_read(int fd, void* buf, size_t count)
 {
     int ret = read(fd, buf, count);
 #ifdef DYNAREC
@@ -2874,7 +2874,7 @@ EXPORT int my32_futimes(x64emu_t* emu, int fd, uint32_t* times)
     return futimes(fd, tm);
 }
 
-EXPORT int my32_strtol(const char* s, char** endp, int base)
+EXPORT long my32_strtol(const char* s, char** endp, int base)
 {
     long ret = strtol(s, endp, base);
     if (ret<INT_MIN) {
@@ -2887,7 +2887,7 @@ EXPORT int my32_strtol(const char* s, char** endp, int base)
     return ret;
 }
 
-EXPORT unsigned int my32_strtoul(const char* s, char** endp, int base)
+EXPORT unsigned long my32_strtoul(const char* s, char** endp, int base)
 {
     unsigned long ret = strtoul(s, endp, base);
     if(ret>UINT_MAX) {
diff --git a/src/wrapped32/wrappedlibc_private.h b/src/wrapped32/wrappedlibc_private.h
index 5c4e37ce..c3da65ed 100755
--- a/src/wrapped32/wrappedlibc_private.h
+++ b/src/wrapped32/wrappedlibc_private.h
@@ -1700,7 +1700,7 @@ GOW(strtold_l, DFpBp_a)
 GO2(__strtold_l, KFpBp_a, __strtod_l)
 GOW2(strtold_l, KFpBp_a, strtod_l)
 #endif
-GO(__strtol_internal, lFpBp_i)
+GO2(__strtol_internal, lFpBp_i, my32_strtol)    //%%,noE
 GO(strtoll, IFpBp_i)
 //GO(__strtol_l, lFppiip)
 //GOW(strtol_l, lFppiip)