diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-09-01 13:59:51 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-09-01 13:59:51 +0200 |
| commit | 02364151bcba524825838140f3d1a61db59dab88 (patch) | |
| tree | 3d6ba2cf3ea39d3ddf6119f30f84b8512b155157 /src | |
| parent | 9178effd9f837b52107c1943e9736cf2dfc5d40d (diff) | |
| download | box64-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.c | 9 | ||||
| -rwxr-xr-x | src/wrapped32/wrappedlibc.c | 6 | ||||
| -rwxr-xr-x | src/wrapped32/wrappedlibc_private.h | 2 |
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) |