[PATCH] linux-user: fix layout of struct target_msq_id_ds

Andreas Schwab posted 1 patch 1 month ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/mvma520fd3i.fsf@suse.de
Maintainers: Laurent Vivier <laurent@vivier.eu>
linux-user/syscall.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
[PATCH] linux-user: fix layout of struct target_msq_id_ds
Posted by Andreas Schwab 1 month ago
The msg_lspid and msg_lrpid members are of type pid_t, which is a 32-bit
integer.

Signed-off-by: Andreas Schwab <schwab@suse.de>
---
 linux-user/syscall.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 0956a7b310..3dcdb3ef42 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -4185,8 +4185,8 @@ struct target_msqid_ds
     abi_ulong __msg_cbytes;
     abi_ulong msg_qnum;
     abi_ulong msg_qbytes;
-    abi_ulong msg_lspid;
-    abi_ulong msg_lrpid;
+    unsigned int msg_lspid;
+    unsigned int msg_lrpid;
     abi_ulong __unused4;
     abi_ulong __unused5;
 };
@@ -4206,8 +4206,8 @@ static inline abi_long target_to_host_msqid_ds(struct msqid_ds *host_md,
     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);
-    host_md->msg_lspid = tswapal(target_md->msg_lspid);
-    host_md->msg_lrpid = tswapal(target_md->msg_lrpid);
+    host_md->msg_lspid = tswap32(target_md->msg_lspid);
+    host_md->msg_lrpid = tswap32(target_md->msg_lrpid);
     unlock_user_struct(target_md, target_addr, 0);
     return 0;
 }
@@ -4227,8 +4227,8 @@ static inline abi_long host_to_target_msqid_ds(abi_ulong target_addr,
     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);
-    target_md->msg_lspid = tswapal(host_md->msg_lspid);
-    target_md->msg_lrpid = tswapal(host_md->msg_lrpid);
+    target_md->msg_lspid = tswap32(host_md->msg_lspid);
+    target_md->msg_lrpid = tswap32(host_md->msg_lrpid);
     unlock_user_struct(target_md, target_addr, 1);
     return 0;
 }
-- 
2.51.0


-- 
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."
Re: [PATCH] linux-user: fix layout of struct target_msq_id_ds
Posted by Richard Henderson 1 month ago
On 10/9/25 05:56, Andreas Schwab wrote:
> The msg_lspid and msg_lrpid members are of type pid_t, which is a 32-bit
> integer.
> 
> Signed-off-by: Andreas Schwab <schwab@suse.de>
> ---
>   linux-user/syscall.c | 12 ++++++------
>   1 file changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index 0956a7b310..3dcdb3ef42 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -4185,8 +4185,8 @@ struct target_msqid_ds
>       abi_ulong __msg_cbytes;
>       abi_ulong msg_qnum;
>       abi_ulong msg_qbytes;
> -    abi_ulong msg_lspid;
> -    abi_ulong msg_lrpid;
> +    unsigned int msg_lspid;
> +    unsigned int msg_lrpid;

This should be target_pid_t.


r~
Re: [PATCH] linux-user: fix layout of struct target_msq_id_ds
Posted by Richard Henderson 1 month ago
On 10/9/25 08:42, Richard Henderson wrote:
> On 10/9/25 05:56, Andreas Schwab wrote:
>> The msg_lspid and msg_lrpid members are of type pid_t, which is a 32-bit
>> integer.
>>
>> Signed-off-by: Andreas Schwab <schwab@suse.de>
>> ---
>>   linux-user/syscall.c | 12 ++++++------
>>   1 file changed, 6 insertions(+), 6 deletions(-)
>>
>> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
>> index 0956a7b310..3dcdb3ef42 100644
>> --- a/linux-user/syscall.c
>> +++ b/linux-user/syscall.c
>> @@ -4185,8 +4185,8 @@ struct target_msqid_ds
>>       abi_ulong __msg_cbytes;
>>       abi_ulong msg_qnum;
>>       abi_ulong msg_qbytes;
>> -    abi_ulong msg_lspid;
>> -    abi_ulong msg_lrpid;
>> +    unsigned int msg_lspid;
>> +    unsigned int msg_lrpid;
> 
> This should be target_pid_t.

Ho hum, target_pid_t is private to elfload.c.

Since this is

include/uapi/asm-generic/posix_types.h:typedef int              __kernel_ipc_pid_t;
include/uapi/linux/msg.h:       __kernel_ipc_pid_t msg_lspid;   /* pid of last msgsnd */
include/uapi/linux/msg.h:       __kernel_ipc_pid_t msg_lrpid;   /* last receive pid */

I.e. not really just pid_t, then let's go ahead and use abi_int and have a comment.


r~


Re: [PATCH] linux-user: fix layout of struct target_msq_id_ds
Posted by Philippe Mathieu-Daudé 1 month ago
Hi Andreas,

On 9/10/25 14:56, Andreas Schwab wrote:
> The msg_lspid and msg_lrpid members are of type pid_t, which is a 32-bit
> integer.
> 
> Signed-off-by: Andreas Schwab <schwab@suse.de>
> ---
>   linux-user/syscall.c | 12 ++++++------
>   1 file changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index 0956a7b310..3dcdb3ef42 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -4185,8 +4185,8 @@ struct target_msqid_ds
>       abi_ulong __msg_cbytes;
>       abi_ulong msg_qnum;
>       abi_ulong msg_qbytes;
> -    abi_ulong msg_lspid;
> -    abi_ulong msg_lrpid;
> +    unsigned int msg_lspid;
> +    unsigned int msg_lrpid;

Why not use the explicit 'uint32_t' type?

>       abi_ulong __unused4;
>       abi_ulong __unused5;
>   };
> @@ -4206,8 +4206,8 @@ static inline abi_long target_to_host_msqid_ds(struct msqid_ds *host_md,
>       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);
> -    host_md->msg_lspid = tswapal(target_md->msg_lspid);
> -    host_md->msg_lrpid = tswapal(target_md->msg_lrpid);
> +    host_md->msg_lspid = tswap32(target_md->msg_lspid);
> +    host_md->msg_lrpid = tswap32(target_md->msg_lrpid);
>       unlock_user_struct(target_md, target_addr, 0);
>       return 0;
>   }
> @@ -4227,8 +4227,8 @@ static inline abi_long host_to_target_msqid_ds(abi_ulong target_addr,
>       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);
> -    target_md->msg_lspid = tswapal(host_md->msg_lspid);
> -    target_md->msg_lrpid = tswapal(host_md->msg_lrpid);
> +    target_md->msg_lspid = tswap32(host_md->msg_lspid);
> +    target_md->msg_lrpid = tswap32(host_md->msg_lrpid);
>       unlock_user_struct(target_md, target_addr, 1);
>       return 0;
>   }
Re: [PATCH] linux-user: fix layout of struct target_msq_id_ds
Posted by Andreas Schwab 1 month ago
On Okt 09 2025, Philippe Mathieu-Daudé wrote:

> Hi Andreas,
>
> On 9/10/25 14:56, Andreas Schwab wrote:
>> The msg_lspid and msg_lrpid members are of type pid_t, which is a 32-bit
>> integer.
>> Signed-off-by: Andreas Schwab <schwab@suse.de>
>> ---
>>   linux-user/syscall.c | 12 ++++++------
>>   1 file changed, 6 insertions(+), 6 deletions(-)
>> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
>> index 0956a7b310..3dcdb3ef42 100644
>> --- a/linux-user/syscall.c
>> +++ b/linux-user/syscall.c
>> @@ -4185,8 +4185,8 @@ struct target_msqid_ds
>>       abi_ulong __msg_cbytes;
>>       abi_ulong msg_qnum;
>>       abi_ulong msg_qbytes;
>> -    abi_ulong msg_lspid;
>> -    abi_ulong msg_lrpid;
>> +    unsigned int msg_lspid;
>> +    unsigned int msg_lrpid;
>
> Why not use the explicit 'uint32_t' type?

linux-user/syscall.c often just uses int for 32-bit integers, and it's
the same as x86_64/target_syscall.h:struct target_msgid64_ds.

-- 
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."