about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-12-15 17:04:26 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-12-15 17:04:26 +0100
commitc30e012e8d0f86b97c80e3c99281f4cd7705e68a (patch)
tree2f1315c66c06399de3192cd66d681c9a7a932f23 /src
parentd90522bc4ef003a3f643d53f390b77bc1e27b234 (diff)
downloadbox64-c30e012e8d0f86b97c80e3c99281f4cd7705e68a.tar.gz
box64-c30e012e8d0f86b97c80e3c99281f4cd7705e68a.zip
[BOX32][WRAPPER] Some fixes to struct msghdr alignment functions
Diffstat (limited to 'src')
-rw-r--r--src/libtools/libc_net32.c3
-rwxr-xr-xsrc/libtools/myalign32.c8
2 files changed, 6 insertions, 5 deletions
diff --git a/src/libtools/libc_net32.c b/src/libtools/libc_net32.c
index 0c222e5c..55681a5f 100644
--- a/src/libtools/libc_net32.c
+++ b/src/libtools/libc_net32.c
@@ -45,7 +45,8 @@ EXPORT ssize_t my32_recvmsg(x64emu_t* emu, int socket, struct i386_msghdr* msg,
     uint8_t buff[msg->msg_controllen+256];
     AlignMsgHdr_32(&m, iov, buff, msg, 0);
     ssize_t ret = recvmsg(socket, &m, flags);
-    UnalignMsgHdr_32(msg, &m);
+    if(ret>0)
+        UnalignMsgHdr_32(msg, &m);
     return ret;
 }
 
diff --git a/src/libtools/myalign32.c b/src/libtools/myalign32.c
index 6f94ce99..fc20454b 100755
--- a/src/libtools/myalign32.c
+++ b/src/libtools/myalign32.c
@@ -1495,7 +1495,7 @@ 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;
+    d->msg_controllen = s->msg_controllen+(convert_control?0:4);
     if(convert_control) {
         if(s->msg_control) {
             d->msg_control = dest_cmsg;
@@ -1536,7 +1536,7 @@ void UnalignMsgHdr_32(void* dest, void* source)
         UnalignIOV_32(d_iov+i, s_iov+i);
     }
     d->msg_iovlen = s->msg_iovlen;
-    d->msg_controllen = s->msg_controllen;
+    //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;
@@ -1547,9 +1547,9 @@ void UnalignMsgHdr_32(void* dest, void* source)
             if(dcmsg->cmsg_len) {
                 dcmsg->cmsg_len -= 4;
                 memcpy(dcmsg+1, CMSG_DATA(scmsg), dcmsg->cmsg_len-sizeof(struct i386_cmsghdr));
-                d->msg_controllen -= 4;
+                //d->msg_controllen -= 4;
             }
-            (struct i386_cmsghdr*)(((uintptr_t)dcmsg) + ((dcmsg->cmsg_len+3)&~3));
+            dcmsg = (struct i386_cmsghdr*)(((uintptr_t)dcmsg) + ((dcmsg->cmsg_len+3)&~3));
             scmsg = CMSG_NXTHDR(s, scmsg);
         }
     } else