linux-user: Fix getresuid, getresgid if !USE_UID16
The size of the UID/GID types depends on whether USE_UID16 is defined. Define a new put_user_id() which writes a uid/gid type to guest memory. This fixes getresuid and getresgid, which were always storing 16 bits even if the uid type was 32 bits. Reported-by: Michael Matz <matz@suse.de> Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Riku Voipio <riku.voipio@linaro.org> Reviewed-by: Andreas Färber <afaerber@suse.de> Reviewed-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
		
							parent
							
								
									cd98d390ae
								
							
						
					
					
						commit
						76ca310a19
					
				| @ -4528,6 +4528,9 @@ static inline int tswapid(int id) | ||||
| { | ||||
|     return tswap16(id); | ||||
| } | ||||
| 
 | ||||
| #define put_user_id(x, gaddr) put_user_u16(x, gaddr) | ||||
| 
 | ||||
| #else /* !USE_UID16 */ | ||||
| static inline int high2lowuid(int uid) | ||||
| { | ||||
| @ -4549,6 +4552,9 @@ static inline int tswapid(int id) | ||||
| { | ||||
|     return tswap32(id); | ||||
| } | ||||
| 
 | ||||
| #define put_user_id(x, gaddr) put_user_u32(x, gaddr) | ||||
| 
 | ||||
| #endif /* USE_UID16 */ | ||||
| 
 | ||||
| void syscall_init(void) | ||||
| @ -7805,9 +7811,9 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, | ||||
|             uid_t ruid, euid, suid; | ||||
|             ret = get_errno(getresuid(&ruid, &euid, &suid)); | ||||
|             if (!is_error(ret)) { | ||||
|                 if (put_user_u16(high2lowuid(ruid), arg1) | ||||
|                     || put_user_u16(high2lowuid(euid), arg2) | ||||
|                     || put_user_u16(high2lowuid(suid), arg3)) | ||||
|                 if (put_user_id(high2lowuid(ruid), arg1) | ||||
|                     || put_user_id(high2lowuid(euid), arg2) | ||||
|                     || put_user_id(high2lowuid(suid), arg3)) | ||||
|                     goto efault; | ||||
|             } | ||||
|         } | ||||
| @ -7826,9 +7832,9 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, | ||||
|             gid_t rgid, egid, sgid; | ||||
|             ret = get_errno(getresgid(&rgid, &egid, &sgid)); | ||||
|             if (!is_error(ret)) { | ||||
|                 if (put_user_u16(high2lowgid(rgid), arg1) | ||||
|                     || put_user_u16(high2lowgid(egid), arg2) | ||||
|                     || put_user_u16(high2lowgid(sgid), arg3)) | ||||
|                 if (put_user_id(high2lowgid(rgid), arg1) | ||||
|                     || put_user_id(high2lowgid(egid), arg2) | ||||
|                     || put_user_id(high2lowgid(sgid), arg3)) | ||||
|                     goto efault; | ||||
|             } | ||||
|         } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Peter Maydell
						Peter Maydell