about summary refs log tree commit diff stats
path: root/src/libtools
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-12-19 13:57:33 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-12-19 13:57:33 +0100
commita8000cb629eae569563b92e1ab7c5929bda3bb5f (patch)
treeabd716f5cc524790bee72b27a1a23c7ce3fd124b /src/libtools
parent17f2371804b31d3829f029f27dad53eba2081a38 (diff)
downloadbox64-a8000cb629eae569563b92e1ab7c5929bda3bb5f.tar.gz
box64-a8000cb629eae569563b92e1ab7c5929bda3bb5f.zip
[BOX32] More fixes on libc wrapping
Diffstat (limited to 'src/libtools')
-rwxr-xr-xsrc/libtools/myalign32.c10
-rw-r--r--src/libtools/signal32.c21
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;