* [PATCH] linux-user: Return EINVAL for getgroups() with negative gidsetsize
@ 2023-06-02 17:48 Peter Maydell
2023-06-02 18:05 ` Laurent Vivier
` (3 more replies)
0 siblings, 4 replies; 6+ messages in thread
From: Peter Maydell @ 2023-06-02 17:48 UTC (permalink / raw)
To: qemu-devel; +Cc: Laurent Vivier
Coverity doesn't like the way we might end up calling getgroups()
with a NULL grouplist pointer. This is fine for the special case
of gidsetsize == 0, but we will also do it if the guest passes
us a negative gidsetsize. (CID 1512465)
Explicitly fail the negative gidsetsize with EINVAL, as the kernel
does. This means we definitely only call the libc getgroups()
with valid parameters.
Possibly Coverity may still complain about getgroups(0, NULL), but
that would be a false positive.
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
linux-user/syscall.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 89b58b386b1..29fdfdf18e4 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -11574,7 +11574,7 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1,
g_autofree gid_t *grouplist = NULL;
int i;
- if (gidsetsize > NGROUPS_MAX) {
+ if (gidsetsize > NGROUPS_MAX || gidsetsize < 0) {
return -TARGET_EINVAL;
}
if (gidsetsize > 0) {
--
2.34.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] linux-user: Return EINVAL for getgroups() with negative gidsetsize
2023-06-02 17:48 [PATCH] linux-user: Return EINVAL for getgroups() with negative gidsetsize Peter Maydell
@ 2023-06-02 18:05 ` Laurent Vivier
2023-06-02 20:04 ` Philippe Mathieu-Daudé
` (2 subsequent siblings)
3 siblings, 0 replies; 6+ messages in thread
From: Laurent Vivier @ 2023-06-02 18:05 UTC (permalink / raw)
To: Peter Maydell, qemu-devel
Le 02/06/2023 à 19:48, Peter Maydell a écrit :
> Coverity doesn't like the way we might end up calling getgroups()
> with a NULL grouplist pointer. This is fine for the special case
> of gidsetsize == 0, but we will also do it if the guest passes
> us a negative gidsetsize. (CID 1512465)
>
> Explicitly fail the negative gidsetsize with EINVAL, as the kernel
> does. This means we definitely only call the libc getgroups()
> with valid parameters.
>
> Possibly Coverity may still complain about getgroups(0, NULL), but
> that would be a false positive.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
> linux-user/syscall.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index 89b58b386b1..29fdfdf18e4 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -11574,7 +11574,7 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1,
> g_autofree gid_t *grouplist = NULL;
> int i;
>
> - if (gidsetsize > NGROUPS_MAX) {
> + if (gidsetsize > NGROUPS_MAX || gidsetsize < 0) {
> return -TARGET_EINVAL;
> }
> if (gidsetsize > 0) {
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] linux-user: Return EINVAL for getgroups() with negative gidsetsize
2023-06-02 17:48 [PATCH] linux-user: Return EINVAL for getgroups() with negative gidsetsize Peter Maydell
2023-06-02 18:05 ` Laurent Vivier
@ 2023-06-02 20:04 ` Philippe Mathieu-Daudé
2023-06-03 17:08 ` Michael Tokarev
2023-06-03 17:11 ` Michael Tokarev
3 siblings, 0 replies; 6+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-06-02 20:04 UTC (permalink / raw)
To: Peter Maydell, qemu-devel; +Cc: Laurent Vivier
On 2/6/23 19:48, Peter Maydell wrote:
> Coverity doesn't like the way we might end up calling getgroups()
> with a NULL grouplist pointer. This is fine for the special case
> of gidsetsize == 0, but we will also do it if the guest passes
> us a negative gidsetsize. (CID 1512465)
>
> Explicitly fail the negative gidsetsize with EINVAL, as the kernel
> does. This means we definitely only call the libc getgroups()
> with valid parameters.
>
> Possibly Coverity may still complain about getgroups(0, NULL), but
> that would be a false positive.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
> linux-user/syscall.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] linux-user: Return EINVAL for getgroups() with negative gidsetsize
2023-06-02 17:48 [PATCH] linux-user: Return EINVAL for getgroups() with negative gidsetsize Peter Maydell
2023-06-02 18:05 ` Laurent Vivier
2023-06-02 20:04 ` Philippe Mathieu-Daudé
@ 2023-06-03 17:08 ` Michael Tokarev
2023-06-03 17:11 ` Michael Tokarev
3 siblings, 0 replies; 6+ messages in thread
From: Michael Tokarev @ 2023-06-03 17:08 UTC (permalink / raw)
To: Peter Maydell, qemu-devel; +Cc: Laurent Vivier
02.06.2023 20:48, Peter Maydell wrote:
> Coverity doesn't like the way we might end up calling getgroups()
> with a NULL grouplist pointer. This is fine for the special case
> of gidsetsize == 0, but we will also do it if the guest passes
> us a negative gidsetsize. (CID 1512465)
>
> Explicitly fail the negative gidsetsize with EINVAL, as the kernel
> does. This means we definitely only call the libc getgroups()
> with valid parameters.
>
> Possibly Coverity may still complain about getgroups(0, NULL), but
> that would be a false positive.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
I especially kept the negative case like this when initially writing
this code, thinking to return whatever error the kernel will return.
But I guess it doesn't really matter here, and the less fragile corner
cases, the better.
Reviewed-by: Michael Tokarev <mjt@tls.msk.ru>
Thanks,
/mjt
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] linux-user: Return EINVAL for getgroups() with negative gidsetsize
2023-06-02 17:48 [PATCH] linux-user: Return EINVAL for getgroups() with negative gidsetsize Peter Maydell
` (2 preceding siblings ...)
2023-06-03 17:08 ` Michael Tokarev
@ 2023-06-03 17:11 ` Michael Tokarev
2023-06-09 8:04 ` Michael Tokarev
3 siblings, 1 reply; 6+ messages in thread
From: Michael Tokarev @ 2023-06-03 17:11 UTC (permalink / raw)
To: Peter Maydell, qemu-devel; +Cc: Laurent Vivier
02.06.2023 20:48, Peter Maydell wrote:
> @@ -11574,7 +11574,7 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1,
> g_autofree gid_t *grouplist = NULL;
> int i;
>
> - if (gidsetsize > NGROUPS_MAX) {
> + if (gidsetsize > NGROUPS_MAX || gidsetsize < 0) {
> return -TARGET_EINVAL;
> }
> if (gidsetsize > 0) {
FWIW, there's another piece of code exactly like this one,
for TARGET_NR_getgroups32. The same change is needed there too.
Thanks,
/mjt
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] linux-user: Return EINVAL for getgroups() with negative gidsetsize
2023-06-03 17:11 ` Michael Tokarev
@ 2023-06-09 8:04 ` Michael Tokarev
0 siblings, 0 replies; 6+ messages in thread
From: Michael Tokarev @ 2023-06-09 8:04 UTC (permalink / raw)
To: Peter Maydell, qemu-devel; +Cc: Laurent Vivier
03.06.2023 20:11, Michael Tokarev wrote:
> 02.06.2023 20:48, Peter Maydell wrote:
>
>> @@ -11574,7 +11574,7 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1,
>> g_autofree gid_t *grouplist = NULL;
>> int i;
>> - if (gidsetsize > NGROUPS_MAX) {
>> + if (gidsetsize > NGROUPS_MAX || gidsetsize < 0) {
>> return -TARGET_EINVAL;
>> }
>> if (gidsetsize > 0) {
>
> FWIW, there's another piece of code exactly like this one,
> for TARGET_NR_getgroups32. The same change is needed there too.
Peter, will you respin this (to include getgroups32 case), or should I ?
(The change is trivial enough to carry though -trivial@).
Thanks,
/mjt
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2023-06-09 8:04 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-06-02 17:48 [PATCH] linux-user: Return EINVAL for getgroups() with negative gidsetsize Peter Maydell
2023-06-02 18:05 ` Laurent Vivier
2023-06-02 20:04 ` Philippe Mathieu-Daudé
2023-06-03 17:08 ` Michael Tokarev
2023-06-03 17:11 ` Michael Tokarev
2023-06-09 8:04 ` Michael Tokarev
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).