From d03c85da9045a67e178c98d94b607cc3cd8d22c0 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sat, 14 Dec 2024 20:56:07 +0100 Subject: [BOX32][WRAPPER] More fixes to libc and X11 wrapping --- src/include/myalign32.h | 4 ++-- src/library_list_32.h | 2 +- src/libtools/libc_net32.c | 16 ++++------------ src/libtools/my_x11_conv.c | 37 ++++++++++++++++++++++++++++++++++-- src/libtools/my_x11_defs.h | 35 ++++++++++++++++++++++------------ src/libtools/my_x11_defs_32.h | 11 +++++++++++ src/libtools/myalign32.c | 44 +++---------------------------------------- src/wrapped32/wrappedlibc.c | 25 ------------------------ 8 files changed, 79 insertions(+), 95 deletions(-) (limited to 'src') diff --git a/src/include/myalign32.h b/src/include/myalign32.h index dbc8d055..caf2721f 100755 --- a/src/include/myalign32.h +++ b/src/include/myalign32.h @@ -527,7 +527,7 @@ struct i386_mmsghdr { struct i386_cmsghdr { - ulong_t cmsg_len; + uint32_t cmsg_len; int cmsg_level; int cmsg_type; } __attribute__((packed, aligned(4))); @@ -535,7 +535,7 @@ struct i386_cmsghdr void AlignIOV_32(void* dest, void* source); // x86 -> Native void UnalignIOV_32(void* dest, void* source); // Native -> x86 -void AlignMsgHdr_32(void* dest, void* dest_iov, void* dest_cmsg, void* source, int convert_control); // x86 -> Native +void AlignMsgHdr_32(void* dest, void* dest_iov, void* source); // x86 -> Native void UnalignMsgHdr_32(void* dest, void* source); // back to Native -> x86 struct i386_passwd diff --git a/src/library_list_32.h b/src/library_list_32.h index 487e4b64..b48c5042 100644 --- a/src/library_list_32.h +++ b/src/library_list_32.h @@ -80,6 +80,6 @@ GO("libvdpau.so", libvdpau) GO("libnsl.so.1", nsl) GO("libnsl.so", nsl) -GO("crashhandler.so", crashhandler) +//GO("crashhandler.so", crashhandler) GO("libtcmalloc_minimal.so.0", tcmallocminimal) GO("libtcmalloc_minimal.so.4", tcmallocminimal) diff --git a/src/libtools/libc_net32.c b/src/libtools/libc_net32.c index b3fde053..afc83f89 100644 --- a/src/libtools/libc_net32.c +++ b/src/libtools/libc_net32.c @@ -42,8 +42,7 @@ EXPORT ssize_t my32_recvmsg(x64emu_t* emu, int socket, struct i386_msghdr* msg, { struct iovec iov[msg->msg_iovlen]; struct msghdr m; - uint8_t buff[msg->msg_controllen+256]; - AlignMsgHdr_32(&m, iov, buff, msg, 0); + AlignMsgHdr_32(&m, iov, msg); ssize_t ret = recvmsg(socket, &m, flags); UnalignMsgHdr_32(msg, &m); return ret; @@ -53,8 +52,7 @@ EXPORT ssize_t my32_sendmsg(x64emu_t* emu, int socket, struct i386_msghdr* msg, { struct iovec iov[msg->msg_iovlen]; struct msghdr m; - uint8_t buff[msg->msg_controllen+256]; - AlignMsgHdr_32(&m, iov, buff, msg, 1); + AlignMsgHdr_32(&m, iov, msg); ssize_t ret = sendmsg(socket, &m, flags); UnalignMsgHdr_32(msg, &m); return ret; @@ -64,16 +62,13 @@ EXPORT int my32_recvmmsg(x64emu_t* emu, int socket, struct i386_mmsghdr* msgs, u { struct mmsghdr m[vlen]; uint32_t iovlen = 0; - size_t ctrlen = 0; for(uint32_t i=0; iiovlen) iovlen = msgs[i].msg_hdr.msg_iovlen; - if(msgs[i].msg_hdr.msg_controllen>ctrlen) ctrlen = msgs[i].msg_hdr.msg_controllen; m[i].msg_len = msgs[i].msg_len; } struct iovec iov[vlen][iovlen]; - uint8_t buff[vlen][ctrlen+256]; for(uint32_t i=0; iiovlen) iovlen = msgs[i].msg_hdr.msg_iovlen; - if(msgs[i].msg_hdr.msg_controllen>ctrlen) ctrlen = msgs[i].msg_hdr.msg_controllen; m[i].msg_len = msgs[i].msg_len; } struct iovec iov[vlen][iovlen]; - uint8_t buff[vlen][ctrlen+256]; for(uint32_t i=0; isize_types = src->size_types; + dst->num_types = src->num_types; + dst->types = to_ptrv(src->types); + dst->size_syms = src->size_syms; + dst->num_syms = src->num_syms; + dst->syms = to_ptrv(src->syms); + dst->key_sym_map = to_ptrv(src->key_sym_map); + dst->modmap = to_ptrv(src->modmap); + } + return a; +} +void* inplace_XkbClientMapRec_enlarge(void* a) +{ + if(a) { + my_XkbClientMapRec_32_t* src = a; + my_XkbClientMapRec_t* dst = a; + dst->modmap = from_ptrv(src->modmap); + dst->key_sym_map = from_ptrv(src->key_sym_map); + dst->syms = from_ptrv(src->syms); + dst->num_syms = src->num_syms; + dst->size_syms = src->size_syms; + dst->types = from_ptrv(src->types); + dst->num_types = src->num_types; + dst->size_types = src->size_types; + } + return a; +} + void* inplace_XkbDescRec_shrink(void* a) { if(a) { @@ -1207,7 +1240,7 @@ void* inplace_XkbDescRec_shrink(void* a) dst->max_key_code = src->max_key_code; dst->ctrls = to_ptrv(src->ctrls); dst->server = to_ptrv(src->server); - dst->map = to_ptrv(src->map); + dst->map = to_ptrv(inplace_XkbClientMapRec_shrink(src->map)); dst->indicators = to_ptrv(src->indicators); dst->names = to_ptrv(inplace_XkbNamesRec_shrink(src->names)); dst->compat = to_ptrv(src->compat); @@ -1225,7 +1258,7 @@ void* inplace_XkbDescRec_enlarge(void* a) dst->compat = from_ptrv(src->compat); dst->names = inplace_XkbNamesRec_enlarge(from_ptrv(src->names)); dst->indicators = from_ptrv(src->indicators); - dst->map = from_ptrv(src->map); + dst->map = inplace_XkbClientMapRec_enlarge(from_ptrv(src->map)); dst->server = from_ptrv(src->server); dst->ctrls = from_ptrv(src->ctrls); dst->max_key_code = src->max_key_code; diff --git a/src/libtools/my_x11_defs.h b/src/libtools/my_x11_defs.h index 889a47ec..0cf6081d 100644 --- a/src/libtools/my_x11_defs.h +++ b/src/libtools/my_x11_defs.h @@ -1366,19 +1366,30 @@ typedef struct my_XkbNamesRec_s { unsigned short num_rg; } my_XkbNamesRec_t; +typedef struct my_XkbClientMapRec_s { + unsigned char size_types; + unsigned char num_types; + void* types; //XkbKeyTypePtr + unsigned short size_syms; + unsigned short num_syms; + void* syms; //KeySym* + void* key_sym_map; //XkbSymMapPtr + unsigned char* modmap; +} my_XkbClientMapRec_t; + typedef struct my_XkbDescRec_s { - my_XDisplay_t* display; - unsigned short flags; - unsigned short device_spec; - uint8_t min_key_code; - uint8_t max_key_code; - void* ctrls; //XkbControlsPtr - void* server; //XkbServerMapPtr - void* map; //XkbClientMapPtr - void* indicators; //XkbIndicatorPtr - my_XkbNamesRec_t* names; - void* compat; //XkbCompatMapPtr - void* geom; //XkbGeometryPtr + my_XDisplay_t* display; + unsigned short flags; + unsigned short device_spec; + uint8_t min_key_code; + uint8_t max_key_code; + void* ctrls; //XkbControlsPtr + void* server; //XkbServerMapPtr + my_XkbClientMapRec_t* map; //XkbClientMapPtr + void* indicators; //XkbIndicatorPtr + my_XkbNamesRec_t* names; + void* compat; //XkbCompatMapPtr + void* geom; //XkbGeometryPtr } my_XkbDescRec_t; typedef struct my_XmbTextItem_s { diff --git a/src/libtools/my_x11_defs_32.h b/src/libtools/my_x11_defs_32.h index 56971dba..01144d1f 100644 --- a/src/libtools/my_x11_defs_32.h +++ b/src/libtools/my_x11_defs_32.h @@ -1299,6 +1299,17 @@ typedef struct my_XkbNamesRec_32_s { unsigned short num_rg; } my_XkbNamesRec_32_t; +typedef struct my_XkbClientMapRec_32_s { + unsigned char size_types; + unsigned char num_types; + ptr_t types; //XkbKeyTypePtr + unsigned short size_syms; + unsigned short num_syms; + ptr_t syms; //KeySym* + ptr_t key_sym_map; //XkbSymMapPtr + ptr_t modmap; //unsigned char* +} my_XkbClientMapRec_32_t; + typedef struct my_XkbDescRec_32_s { ptr_t display; //my_XDisplay_32_t* unsigned short flags; diff --git a/src/libtools/myalign32.c b/src/libtools/myalign32.c index e32a9571..258fcc9e 100755 --- a/src/libtools/myalign32.c +++ b/src/libtools/myalign32.c @@ -1480,7 +1480,7 @@ void UnalignIOV_32(void* dest, void* source) void* my32___cmsg_nxthdr(struct i386_msghdr* mhdr, struct i386_cmsghdr* cmsg); // x86 -> Native -void AlignMsgHdr_32(void* dest, void* dest_iov, void* dest_cmsg, void* source, int convert_control) +void AlignMsgHdr_32(void* dest, void* dest_iov, void* source) { struct iovec* iov = dest_iov; struct msghdr* d = dest; @@ -1496,29 +1496,7 @@ void AlignMsgHdr_32(void* dest, void* dest_iov, void* dest_cmsg, void* source, i } d->msg_iovlen = s->msg_iovlen; 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 cmsghdr* dcmsg = dest_cmsg; - while(cmsg) { - dcmsg->cmsg_len = from_ulong(cmsg->cmsg_len); - dcmsg->cmsg_level = cmsg->cmsg_level; - dcmsg->cmsg_type = cmsg->cmsg_type; - if(cmsg->cmsg_len) { - dcmsg->cmsg_len += 4; - memcpy(CMSG_DATA(dcmsg), cmsg+1, cmsg->cmsg_len-sizeof(struct i386_cmsghdr)); - d->msg_controllen += 4; - } - dcmsg = (struct cmsghdr*)(((uintptr_t)dcmsg) + ((dcmsg->cmsg_len+7)&~7)); - cmsg = my32___cmsg_nxthdr(s, cmsg); - } - } else - d->msg_control = NULL; - } else { - d->msg_control = (s->msg_control)?dest_cmsg:NULL; - if(d->msg_control) memset(d->msg_control, 0, d->msg_controllen); - } + d->msg_control = from_ptrv(s->msg_control); d->msg_flags = s->msg_flags; } @@ -1537,23 +1515,7 @@ void UnalignMsgHdr_32(void* dest, void* source) } d->msg_iovlen = s->msg_iovlen; 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; - while(scmsg) { - dcmsg->cmsg_len = to_ulong(scmsg->cmsg_len); - dcmsg->cmsg_level = scmsg->cmsg_level; - dcmsg->cmsg_type = scmsg->cmsg_type; - 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; - } - (struct i386_cmsghdr*)(((uintptr_t)dcmsg) + ((dcmsg->cmsg_len+3)&~3)); - scmsg = CMSG_NXTHDR(s, scmsg); - } - } else - d->msg_control = 0; + d->msg_control = to_ptrv(s->msg_control); d->msg_flags = s->msg_flags; } diff --git a/src/wrapped32/wrappedlibc.c b/src/wrapped32/wrappedlibc.c index e0082e9e..284d04e8 100755 --- a/src/wrapped32/wrappedlibc.c +++ b/src/wrapped32/wrappedlibc.c @@ -2298,31 +2298,6 @@ EXPORT int my32_getgrgid_r(x64emu_t* emu, gid_t gid, struct i386_group *grp, cha return ret; } -#if 0 -EXPORT int32_t my32_recvmmsg(x64emu_t* emu, int32_t fd, void* msgvec, uint32_t vlen, uint32_t flags, void* timeout) -{ - // Implemented starting glibc 2.12+ - library_t* lib = my_lib; - if(!lib) return 0; - void* f = dlsym(lib->priv.w.lib, "recvmmsg"); - if(f) - return ((iFipuup_t)f)(fd, msgvec, vlen, flags, timeout); - // Use the syscall - return syscall(__NR_recvmmsg, fd, msgvec, vlen, flags, timeout); -} - -EXPORT int32_t my32___sendmmsg(x64emu_t* emu, int32_t fd, void* msgvec, uint32_t vlen, uint32_t flags) -{ - // Implemented starting glibc 2.14+ - library_t* lib = my_lib; - if(!lib) return 0; - void* f = dlsym(lib->priv.w.lib, "__sendmmsg"); - if(f) - return ((iFipuu_t)f)(fd, msgvec, vlen, flags); - // Use the syscall - return syscall(__NR_sendmmsg, fd, msgvec, vlen, flags); -} -#endif EXPORT int32_t my32___register_atfork(x64emu_t *emu, void* prepare, void* parent, void* child, void* handle) { // this is partly incorrect, because the emulated funcionts should be executed by actual fork and not by my32_atfork... -- cgit 1.4.1