aboutsummaryrefslogtreecommitdiff
path: root/linux-user
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2023-06-09 17:29:15 +0100
committerMichael Tokarev <mjt@tls.msk.ru>2023-06-10 00:00:24 +0300
commit8fbf89a9669520ac09b3ae0013ff3eb34f8cab23 (patch)
tree9d482f2d76b6275b50bc546a89bdaf3a8e126307 /linux-user
parent725160fe56eb9f6b9b13214b9adf519c25b9d527 (diff)
downloadqemu-8fbf89a9669520ac09b3ae0013ff3eb34f8cab23.zip
qemu-8fbf89a9669520ac09b3ae0013ff3eb34f8cab23.tar.gz
qemu-8fbf89a9669520ac09b3ae0013ff3eb34f8cab23.tar.bz2
linux-user: Return EINVAL for getgroups() with negative gidsetsize
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. It also brings the getgroups() code in to line with the setgroups() code. 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> Reviewed-by: Michael Tokarev <mjt@tls.msk.ru> Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
Diffstat (limited to 'linux-user')
-rw-r--r--linux-user/syscall.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 94256cc..f2cb101 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -11676,7 +11676,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) {
@@ -12012,7 +12012,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) {