diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-12-19 13:57:33 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-12-19 13:57:33 +0100 |
| commit | a8000cb629eae569563b92e1ab7c5929bda3bb5f (patch) | |
| tree | abd716f5cc524790bee72b27a1a23c7ce3fd124b /src/libtools | |
| parent | 17f2371804b31d3829f029f27dad53eba2081a38 (diff) | |
| download | box64-a8000cb629eae569563b92e1ab7c5929bda3bb5f.tar.gz box64-a8000cb629eae569563b92e1ab7c5929bda3bb5f.zip | |
[BOX32] More fixes on libc wrapping
Diffstat (limited to 'src/libtools')
| -rwxr-xr-x | src/libtools/myalign32.c | 10 | ||||
| -rw-r--r-- | src/libtools/signal32.c | 21 |
2 files changed, 23 insertions, 8 deletions
diff --git a/src/libtools/myalign32.c b/src/libtools/myalign32.c index cd703549..0ce60bfc 100755 --- a/src/libtools/myalign32.c +++ b/src/libtools/myalign32.c @@ -1486,7 +1486,6 @@ void AlignMsgHdr_32(void* dest, void* dest_iov, void* dest_cmsg, void* source, i struct msghdr* d = dest; struct i386_msghdr* s = source; struct i386_iovec* s_iov = from_ptrv(s->msg_iov); - d->msg_name = from_ptrv(s->msg_name); d->msg_namelen = s->msg_namelen; d->msg_iov = iov; @@ -1495,11 +1494,11 @@ void AlignMsgHdr_32(void* dest, void* dest_iov, void* dest_cmsg, void* source, i AlignIOV_32(d->msg_iov+i, s_iov+i); } d->msg_iovlen = s->msg_iovlen; - d->msg_controllen = s->msg_controllen+(convert_control?0:4); + d->msg_controllen = s->msg_controllen; if(convert_control) { if(s->msg_control) { d->msg_control = dest_cmsg; - struct i386_cmsghdr* cmsg = from_ptrv(s->msg_control); + struct i386_cmsghdr* cmsg = (s->msg_controllen)?from_ptrv(s->msg_control):NULL; struct cmsghdr* dcmsg = dest_cmsg; while(cmsg) { dcmsg->cmsg_len = from_ulong(cmsg->cmsg_len); @@ -1515,11 +1514,13 @@ void AlignMsgHdr_32(void* dest, void* dest_iov, void* dest_cmsg, void* source, i uintptr_t next_diff = (uintptr_t)next-((uintptr_t)dcmsg+dcmsg->cmsg_len); if(cmsg) d->msg_controllen+=next_diff; + dcmsg = next; } } else d->msg_control = NULL; } else { + if(d->msg_controllen) d->msg_controllen+=4; d->msg_control = (s->msg_control)?dest_cmsg:NULL; if(d->msg_control) memset(d->msg_control, 0, d->msg_controllen); } @@ -1532,7 +1533,6 @@ void UnalignMsgHdr_32(void* dest, void* source) struct i386_msghdr* d = dest; struct iovec* s_iov = s->msg_iov; struct i386_iovec* d_iov = from_ptrv(d->msg_iov); - d->msg_name = to_ptrv(s->msg_name); d->msg_namelen = s->msg_namelen; // TODO: check if iovlen is too big @@ -1543,7 +1543,7 @@ void UnalignMsgHdr_32(void* dest, void* source) d->msg_controllen = s->msg_controllen; if(s->msg_control) { struct i386_cmsghdr* dcmsg = from_ptrv(d->msg_control); - struct cmsghdr* scmsg = s->msg_control; + struct cmsghdr* scmsg = (s->msg_controllen)?s->msg_control:NULL; while(scmsg) { dcmsg->cmsg_len = to_ulong(scmsg->cmsg_len); dcmsg->cmsg_level = scmsg->cmsg_level; diff --git a/src/libtools/signal32.c b/src/libtools/signal32.c index 3742d0c7..1bb13338 100644 --- a/src/libtools/signal32.c +++ b/src/libtools/signal32.c @@ -447,6 +447,23 @@ uint32_t RunFunctionHandler32(int* exit, int dynarec, i386_ucontext_t* sigcontex return ret; } +void convert_siginfo_to_32(void* d, void* s, int sig) +{ + if(!s || !d) return; + my_siginfo32_t* dst = d; + siginfo_t* src = s; + + memcpy(dst, src, sizeof(my_siginfo32_t)); + if(sig==SIGILL || sig==SIGFPE || sig==SIGSEGV || sig==SIGBUS) + dst->_sifields._sigfault.__si_addr = to_ptrv(src->si_addr); + if(sig==SIGCHLD) { + dst->_sifields._sigchld.__si_pid = src->si_pid; + dst->_sifields._sigchld.__si_uid = src->si_uid; + dst->_sifields._sigchld.__si_status = src->si_status; + dst->_sifields._sigchld.__si_stime = src->si_stime; + dst->_sifields._sigchld.__si_utime = src->si_utime; + } +} int write_opcode(uintptr_t rip, uintptr_t native_ip, int is32bits); #define is_memprot_locked (1<<1) #define is_dyndump_locked (1<<8) @@ -520,9 +537,7 @@ void my_sigactionhandler_oldcode_32(int32_t sig, int simple, siginfo_t* info, vo void* xstate = (void*)frame; frame -= sizeof(my_siginfo32_t); my_siginfo32_t* info2 = (my_siginfo32_t*)frame; - memcpy(info2, info, sizeof(my_siginfo32_t)); - if(sig==SIGILL || sig==SIGFPE || sig==SIGSEGV || sig==SIGBUS) - info2->_sifields._sigfault.__si_addr = to_ptrv(info->si_addr); + convert_siginfo_to_32(info2, info, sig); // try to fill some sigcontext.... frame -= sizeof(i386_ucontext_t); i386_ucontext_t *sigcontext = (i386_ucontext_t*)frame; |