qemu-stable
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] linux-user: Make TARGET_NR_setgroups affect only the current


From: Helge Deller
Subject: Re: [PATCH] linux-user: Make TARGET_NR_setgroups affect only the current thread
Date: Wed, 31 Jan 2024 08:53:49 +0100
User-agent: Mozilla Thunderbird

On 1/31/24 01:18, Ilya Leoshkevich wrote:
Like TARGET_NR_setuid, TARGET_NR_setgroups should affect only the
calling thread, and not the entire process. Therefore, implement it
using a syscall, and not a libc call.

Cc: qemu-stable@nongnu.org
Fixes: 19b84f3c35d7 ("added setgroups and getgroups syscalls")
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>

Patch seems ok, but just out of interest, how did you noticed?

Helge


---
  linux-user/syscall.c | 10 ++++++++--
  1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index ff245dade51..da15d727e16 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -7203,11 +7203,17 @@ static inline int tswapid(int id)
  #else
  #define __NR_sys_setresgid __NR_setresgid
  #endif
+#ifdef __NR_setgroups32
+#define __NR_sys_setgroups __NR_setgroups32
+#else
+#define __NR_sys_setgroups __NR_setgroups
+#endif

  _syscall1(int, sys_setuid, uid_t, uid)
  _syscall1(int, sys_setgid, gid_t, gid)
  _syscall3(int, sys_setresuid, uid_t, ruid, uid_t, euid, uid_t, suid)
  _syscall3(int, sys_setresgid, gid_t, rgid, gid_t, egid, gid_t, sgid)
+_syscall2(int, sys_setgroups, int, size, gid_t *, grouplist)

  void syscall_init(void)
  {
@@ -11772,7 +11778,7 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int 
num, abi_long arg1,
                  unlock_user(target_grouplist, arg2,
                              gidsetsize * sizeof(target_id));
              }
-            return get_errno(setgroups(gidsetsize, grouplist));
+            return get_errno(sys_setgroups(gidsetsize, grouplist));
          }
      case TARGET_NR_fchown:
          return get_errno(fchown(arg1, low2highuid(arg2), low2highgid(arg3)));
@@ -12108,7 +12114,7 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int 
num, abi_long arg1,
                  }
                  unlock_user(target_grouplist, arg2, 0);
              }
-            return get_errno(setgroups(gidsetsize, grouplist));
+            return get_errno(sys_setgroups(gidsetsize, grouplist));
          }
  #endif
  #ifdef TARGET_NR_fchown32




reply via email to

[Prev in Thread] Current Thread [Next in Thread]