summaryrefslogtreecommitdiff
path: root/linux-user
diff options
context:
space:
mode:
authorHelge Deller <deller@gmx.de>2026-07-28 21:20:37 +0200
committerHelge Deller <deller@gmx.de>2026-07-29 22:56:12 +0200
commit9e3df3019d21c54df435406fca31b3e145b29702 (patch)
treecc2888c113a805de18c32e26ba4979a9876f0ea7 /linux-user
parentde5eb7c4dd3ef5688b14007134eb11ff4973580c (diff)
downloadqemu-9e3df3019d21c54df435406fca31b3e145b29702.tar.gz
qemu-9e3df3019d21c54df435406fca31b3e145b29702.zip
linux-user: Fix msqid_ds struct wrt 32-bit big endian architectures
Make sure that the time entries (msg_stime, msg_rtime and msg_ctime) are defined as 64-bit time_t values, since the userspace may access the whole 64-bit value. By this change we fix the word ordering for 32-bit big endian architectures as well. This fixes the msgctl01 LTP testcase on hppa32. Cc: qemu-stable@nongnu.org Signed-off-by: Helge Deller <deller@gmx.de>
Diffstat (limited to 'linux-user')
-rw-r--r--linux-user/syscall.c30
1 files changed, 12 insertions, 18 deletions
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 740142825d..c93b770ced 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -4216,21 +4216,15 @@ static inline abi_long do_semtimedop(int semid,
}
#endif
+#define target_time64_t abi_ullong
+#define target_swap_time64(x) tswap64(x)
+
struct target_msqid_ds
{
struct target_ipc_perm msg_perm;
- abi_ulong msg_stime;
-#if TARGET_ABI_BITS == 32
- abi_ulong __unused1;
-#endif
- abi_ulong msg_rtime;
-#if TARGET_ABI_BITS == 32
- abi_ulong __unused2;
-#endif
- abi_ulong msg_ctime;
-#if TARGET_ABI_BITS == 32
- abi_ulong __unused3;
-#endif
+ target_time64_t msg_stime;
+ target_time64_t msg_rtime;
+ target_time64_t msg_ctime;
abi_ulong __msg_cbytes;
abi_ulong msg_qnum;
abi_ulong msg_qbytes;
@@ -4249,9 +4243,9 @@ static inline abi_long target_to_host_msqid_ds(struct msqid_ds *host_md,
return -TARGET_EFAULT;
if (target_to_host_ipc_perm(&(host_md->msg_perm),target_addr))
return -TARGET_EFAULT;
- host_md->msg_stime = tswapal(target_md->msg_stime);
- host_md->msg_rtime = tswapal(target_md->msg_rtime);
- host_md->msg_ctime = tswapal(target_md->msg_ctime);
+ host_md->msg_stime = target_swap_time64(target_md->msg_stime);
+ host_md->msg_rtime = target_swap_time64(target_md->msg_rtime);
+ host_md->msg_ctime = target_swap_time64(target_md->msg_ctime);
host_md->__msg_cbytes = tswapal(target_md->__msg_cbytes);
host_md->msg_qnum = tswapal(target_md->msg_qnum);
host_md->msg_qbytes = tswapal(target_md->msg_qbytes);
@@ -4270,9 +4264,9 @@ static inline abi_long host_to_target_msqid_ds(abi_ulong target_addr,
return -TARGET_EFAULT;
if (host_to_target_ipc_perm(target_addr,&(host_md->msg_perm)))
return -TARGET_EFAULT;
- target_md->msg_stime = tswapal(host_md->msg_stime);
- target_md->msg_rtime = tswapal(host_md->msg_rtime);
- target_md->msg_ctime = tswapal(host_md->msg_ctime);
+ target_md->msg_stime = target_swap_time64(host_md->msg_stime);
+ target_md->msg_rtime = target_swap_time64(host_md->msg_rtime);
+ target_md->msg_ctime = target_swap_time64(host_md->msg_ctime);
target_md->__msg_cbytes = tswapal(host_md->__msg_cbytes);
target_md->msg_qnum = tswapal(host_md->msg_qnum);
target_md->msg_qbytes = tswapal(host_md->msg_qbytes);