From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=41256 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Q91CN-00078t-PD for qemu-devel@nongnu.org; Sun, 10 Apr 2011 16:25:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Q91CE-0001qk-37 for qemu-devel@nongnu.org; Sun, 10 Apr 2011 16:25:23 -0400 Received: from hall.aurel32.net ([88.191.126.93]:42103) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Q91CD-0001qQ-KX for qemu-devel@nongnu.org; Sun, 10 Apr 2011 16:25:22 -0400 Date: Sun, 10 Apr 2011 22:25:18 +0200 From: Aurelien Jarno Subject: Re: [Qemu-devel] [PATCH 04/15] linux-user: define a couple of syscalls for non-uid16 targets Message-ID: <20110410202518.GH4551@volta.aurel32.net> References: <1301927544-32767-1-git-send-email-agraf@suse.de> <1301927544-32767-5-git-send-email-agraf@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-15 Content-Disposition: inline In-Reply-To: <1301927544-32767-5-git-send-email-agraf@suse.de> List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Alexander Graf Cc: peter.maydell@linaro.org, Riku Voipio , QEMU-devel Developers , Richard Henderson On Mon, Apr 04, 2011 at 04:32:13PM +0200, Alexander Graf wrote: > From: Ulrich Hecht > > Quite a number of syscalls are only defined on systems with USE_UID16 > defined; this patch defines them on other systems as well. > > Fixes a large number of uid/gid-related testcases on the s390x target > (and most likely on other targets as well) > > Signed-off-by: Ulrich Hecht > --- > linux-user/syscall.c | 125 ++++++++++++++++++++++++++++++++++++++++++-------- > 1 files changed, 105 insertions(+), 20 deletions(-) > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index fabe815..0bce466 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -326,7 +326,7 @@ static int sys_fchmodat(int dirfd, const char *pathname, mode_t mode) > return (fchmodat(dirfd, pathname, mode, 0)); > } > #endif > -#if defined(TARGET_NR_fchownat) && defined(USE_UID16) > +#if defined(TARGET_NR_fchownat) > static int sys_fchownat(int dirfd, const char *pathname, uid_t owner, > gid_t group, int flags) > { > @@ -435,7 +435,7 @@ _syscall3(int,sys_faccessat,int,dirfd,const char *,pathname,int,mode) > #if defined(TARGET_NR_fchmodat) && defined(__NR_fchmodat) > _syscall3(int,sys_fchmodat,int,dirfd,const char *,pathname, mode_t,mode) > #endif > -#if defined(TARGET_NR_fchownat) && defined(__NR_fchownat) && defined(USE_UID16) > +#if defined(TARGET_NR_fchownat) && defined(__NR_fchownat) > _syscall5(int,sys_fchownat,int,dirfd,const char *,pathname, > uid_t,owner,gid_t,group,int,flags) > #endif > @@ -6817,18 +6817,35 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, > case TARGET_NR_setfsgid: > ret = get_errno(setfsgid(arg1)); > break; > +#else /* USE_UID16 */ > +#if defined(TARGET_NR_fchownat) && defined(__NR_fchownat) > + case TARGET_NR_fchownat: > + if (!(p = lock_user_string(arg2))) > + goto efault; > + ret = get_errno(sys_fchownat(arg1, p, arg3, arg4, arg5)); > + unlock_user(p, arg2, 0); > + break; > +#endif > #endif /* USE_UID16 */ > > -#ifdef TARGET_NR_lchown32 > +#if defined(TARGET_NR_lchown32) || !defined(USE_UID16) > +#if defined(TARGET_NR_lchown32) > case TARGET_NR_lchown32: > +#else > + case TARGET_NR_lchown: > +#endif > if (!(p = lock_user_string(arg1))) > goto efault; > ret = get_errno(lchown(p, arg2, arg3)); > unlock_user(p, arg1, 0); > break; > #endif > -#ifdef TARGET_NR_getuid32 > +#if defined(TARGET_NR_getuid32) || (defined(TARGET_NR_getuid) && !defined(USE_UID16)) > +#if defined(TARGET_NR_getuid32) > case TARGET_NR_getuid32: > +#else > + case TARGET_NR_getuid: > +#endif > ret = get_errno(getuid()); > break; > #endif > @@ -6973,33 +6990,57 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, > break; > #endif > > -#ifdef TARGET_NR_getgid32 > +#if defined(TARGET_NR_getgid32) || (defined(TARGET_NR_getgid) && !defined(USE_UID16)) > +#if defined(TARGET_NR_getgid32) > case TARGET_NR_getgid32: > +#else > + case TARGET_NR_getgid: > +#endif > ret = get_errno(getgid()); > break; > #endif > -#ifdef TARGET_NR_geteuid32 > +#if defined(TARGET_NR_geteuid32) || (defined(TARGET_NR_geteuid) && !defined(USE_UID16)) > +#if defined(TARGET_NR_geteuid32) > case TARGET_NR_geteuid32: > +#else > + case TARGET_NR_geteuid: > +#endif > ret = get_errno(geteuid()); > break; > #endif > -#ifdef TARGET_NR_getegid32 > +#if defined(TARGET_NR_getegid32) || (defined(TARGET_NR_getegid) && !defined(USE_UID16)) > +#if defined(TARGET_NR_getegid32) > case TARGET_NR_getegid32: > +#else > + case TARGET_NR_getegid: > +#endif > ret = get_errno(getegid()); > break; > #endif > -#ifdef TARGET_NR_setreuid32 > +#if defined(TARGET_NR_setreuid32) || !defined(USE_UID16) > +#if defined(TARGET_NR_setreuid32) > case TARGET_NR_setreuid32: > +#else > + case TARGET_NR_setreuid: > +#endif > ret = get_errno(setreuid(arg1, arg2)); > break; > #endif > -#ifdef TARGET_NR_setregid32 > +#if defined(TARGET_NR_setregid32) || !defined(USE_UID16) > +#if defined(TARGET_NR_setregid32) > case TARGET_NR_setregid32: > +#else > + case TARGET_NR_setregid: > +#endif > ret = get_errno(setregid(arg1, arg2)); > break; > #endif > -#ifdef TARGET_NR_getgroups32 > +#if defined(TARGET_NR_getgroups32) || !defined(USE_UID16) > +#if defined(TARGET_NR_getgroups32) > case TARGET_NR_getgroups32: > +#else > + case TARGET_NR_getgroups: > +#endif > { > int gidsetsize = arg1; > uint32_t *target_grouplist; > @@ -7023,8 +7064,12 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, > } > break; > #endif > -#ifdef TARGET_NR_setgroups32 > +#if defined(TARGET_NR_setgroups32) || !defined(USE_UID16) > +#if defined(TARGET_NR_setgroups32) > case TARGET_NR_setgroups32: > +#else > + case TARGET_NR_setgroups: > +#endif > { > int gidsetsize = arg1; > uint32_t *target_grouplist; > @@ -7044,18 +7089,30 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, > } > break; > #endif > -#ifdef TARGET_NR_fchown32 > +#if defined(TARGET_NR_fchown32) || !defined(USE_UID16) > +#if defined(TARGET_NR_fchown32) > case TARGET_NR_fchown32: > +#else > + case TARGET_NR_fchown: > +#endif > ret = get_errno(fchown(arg1, arg2, arg3)); > break; > #endif > -#ifdef TARGET_NR_setresuid32 > +#if defined(TARGET_NR_setresuid32) || !defined(USE_UID16) > +#if defined(TARGET_NR_setresuid32) > case TARGET_NR_setresuid32: > +#else > + case TARGET_NR_setresuid: > +#endif > ret = get_errno(setresuid(arg1, arg2, arg3)); > break; > #endif > -#ifdef TARGET_NR_getresuid32 > +#if defined(TARGET_NR_getresuid32) || !defined(USE_UID16) > +#if defined(TARGET_NR_getresuid32) > case TARGET_NR_getresuid32: > +#else > + case TARGET_NR_getresuid: > +#endif > { > uid_t ruid, euid, suid; > ret = get_errno(getresuid(&ruid, &euid, &suid)); > @@ -7068,13 +7125,21 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, > } > break; > #endif > -#ifdef TARGET_NR_setresgid32 > +#if defined(TARGET_NR_setresgid32) || !defined(USE_UID16) > +#if defined(TARGET_NR_setresgid32) > case TARGET_NR_setresgid32: > +#else > + case TARGET_NR_setresgid: > +#endif > ret = get_errno(setresgid(arg1, arg2, arg3)); > break; > #endif > +#if defined(TARGET_NR_getresgid32) || !defined(USE_UID16) > #ifdef TARGET_NR_getresgid32 > case TARGET_NR_getresgid32: > +#else > + case TARGET_NR_getresgid: > +#endif > { > gid_t rgid, egid, sgid; > ret = get_errno(getresgid(&rgid, &egid, &sgid)); > @@ -7087,31 +7152,51 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, > } > break; > #endif > -#ifdef TARGET_NR_chown32 > +#if defined(TARGET_NR_chown32) || !defined(USE_UID16) > +#if defined(TARGET_NR_chown32) > case TARGET_NR_chown32: > +#else > + case TARGET_NR_chown: > +#endif > if (!(p = lock_user_string(arg1))) > goto efault; > ret = get_errno(chown(p, arg2, arg3)); > unlock_user(p, arg1, 0); > break; > #endif > -#ifdef TARGET_NR_setuid32 > +#if defined(TARGET_NR_setuid32) || !defined(USE_UID16) > +#if defined(TARGET_NR_setuid32) > case TARGET_NR_setuid32: > +#else > + case TARGET_NR_setuid: > +#endif > ret = get_errno(setuid(arg1)); > break; > #endif > -#ifdef TARGET_NR_setgid32 > +#if defined(TARGET_NR_setgid32) || !defined(USE_UID16) > +#if defined(TARGET_NR_setgid32) > case TARGET_NR_setgid32: > +#else > + case TARGET_NR_setgid: > +#endif > ret = get_errno(setgid(arg1)); > break; > #endif > -#ifdef TARGET_NR_setfsuid32 > +#if defined(TARGET_NR_setfsuid32) || !defined(USE_UID16) > +#if defined(TARGET_NR_setfsuid32) > case TARGET_NR_setfsuid32: > +#else > + case TARGET_NR_setfsuid: > +#endif > ret = get_errno(setfsuid(arg1)); > break; > #endif > -#ifdef TARGET_NR_setfsgid32 > +#if defined(TARGET_NR_setfsgid32) || !defined(USE_UID16) > +#if defined(TARGET_NR_setfsgid32) > case TARGET_NR_setfsgid32: > +#else > + case TARGET_NR_setfsgid: > +#endif > ret = get_errno(setfsgid(arg1)); > break; > #endif This patch looks fine to me. That said as for the previous patch, I don't know very well linux-user, and I would appreciate if someone with a good knowledge of linux-user can review it. Riku maybe (CC:ed)? -- Aurelien Jarno GPG: 1024D/F1BCDB73 aurelien@aurel32.net http://www.aurel32.net