mips: rlimit codes are not the same
The codes for get/setrlimit differ between linux target platforms. This patch adds conversion. This is important else programs (rsyslog, python, ...) can go into a near infinite loop trying to close all the file descriptors from 0 to -1. Signed-off-by: Wesley W. Terpstra <terpstra@debian.org> Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
This commit is contained in:
		
							parent
							
								
									95b33b2f4f
								
							
						
					
					
						commit
						e22b701535
					
				| @ -960,6 +960,44 @@ static inline target_ulong host_to_target_rlim(rlim_t rlim) | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| static inline int target_to_host_resource(int code) | ||||
| { | ||||
|     switch (code) { | ||||
|     case TARGET_RLIMIT_AS: | ||||
|         return RLIMIT_AS; | ||||
|     case TARGET_RLIMIT_CORE: | ||||
|         return RLIMIT_CORE; | ||||
|     case TARGET_RLIMIT_CPU: | ||||
|         return RLIMIT_CPU; | ||||
|     case TARGET_RLIMIT_DATA: | ||||
|         return RLIMIT_DATA; | ||||
|     case TARGET_RLIMIT_FSIZE: | ||||
|         return RLIMIT_FSIZE; | ||||
|     case TARGET_RLIMIT_LOCKS: | ||||
|         return RLIMIT_LOCKS; | ||||
|     case TARGET_RLIMIT_MEMLOCK: | ||||
|         return RLIMIT_MEMLOCK; | ||||
|     case TARGET_RLIMIT_MSGQUEUE: | ||||
|         return RLIMIT_MSGQUEUE; | ||||
|     case TARGET_RLIMIT_NICE: | ||||
|         return RLIMIT_NICE; | ||||
|     case TARGET_RLIMIT_NOFILE: | ||||
|         return RLIMIT_NOFILE; | ||||
|     case TARGET_RLIMIT_NPROC: | ||||
|         return RLIMIT_NPROC; | ||||
|     case TARGET_RLIMIT_RSS: | ||||
|         return RLIMIT_RSS; | ||||
|     case TARGET_RLIMIT_RTPRIO: | ||||
|         return RLIMIT_RTPRIO; | ||||
|     case TARGET_RLIMIT_SIGPENDING: | ||||
|         return RLIMIT_SIGPENDING; | ||||
|     case TARGET_RLIMIT_STACK: | ||||
|         return RLIMIT_STACK; | ||||
|     default: | ||||
|         return code; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| static inline abi_long copy_from_user_timeval(struct timeval *tv, | ||||
|                                               abi_ulong target_tv_addr) | ||||
| { | ||||
| @ -5570,7 +5608,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, | ||||
|         break; | ||||
|     case TARGET_NR_setrlimit: | ||||
|         { | ||||
|             int resource = arg1; | ||||
|             int resource = target_to_host_resource(arg1); | ||||
|             struct target_rlimit *target_rlim; | ||||
|             struct rlimit rlim; | ||||
|             if (!lock_user_struct(VERIFY_READ, target_rlim, arg2, 1)) | ||||
| @ -5583,7 +5621,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, | ||||
|         break; | ||||
|     case TARGET_NR_getrlimit: | ||||
|         { | ||||
|             int resource = arg1; | ||||
|             int resource = target_to_host_resource(arg1); | ||||
|             struct target_rlimit *target_rlim; | ||||
|             struct rlimit rlim; | ||||
| 
 | ||||
| @ -6892,7 +6930,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, | ||||
|     case TARGET_NR_ugetrlimit: | ||||
|     { | ||||
| 	struct rlimit rlim; | ||||
| 	ret = get_errno(getrlimit(arg1, &rlim)); | ||||
| 	int resource = target_to_host_resource(arg1); | ||||
| 	ret = get_errno(getrlimit(resource, &rlim)); | ||||
| 	if (!is_error(ret)) { | ||||
| 	    struct target_rlimit *target_rlim; | ||||
|             if (!lock_user_struct(VERIFY_WRITE, target_rlim, arg2, 0)) | ||||
|  | ||||
| @ -693,6 +693,40 @@ struct target_rlimit { | ||||
| #define TARGET_RLIM_INFINITY	((target_ulong)~0UL) | ||||
| #endif | ||||
| 
 | ||||
| #if defined(TARGET_MIPS) | ||||
| #define TARGET_RLIMIT_CPU		0 | ||||
| #define TARGET_RLIMIT_FSIZE		1 | ||||
| #define TARGET_RLIMIT_DATA		2 | ||||
| #define TARGET_RLIMIT_STACK		3 | ||||
| #define TARGET_RLIMIT_CORE		4 | ||||
| #define TARGET_RLIMIT_RSS		7 | ||||
| #define TARGET_RLIMIT_NPROC		8 | ||||
| #define TARGET_RLIMIT_NOFILE		5 | ||||
| #define TARGET_RLIMIT_MEMLOCK		9 | ||||
| #define TARGET_RLIMIT_AS		6 | ||||
| #define TARGET_RLIMIT_LOCKS		10 | ||||
| #define TARGET_RLIMIT_SIGPENDING	11 | ||||
| #define TARGET_RLIMIT_MSGQUEUE		12 | ||||
| #define TARGET_RLIMIT_NICE		13 | ||||
| #define TARGET_RLIMIT_RTPRIO		14 | ||||
| #else | ||||
| #define TARGET_RLIMIT_CPU		0 | ||||
| #define TARGET_RLIMIT_FSIZE		1 | ||||
| #define TARGET_RLIMIT_DATA		2 | ||||
| #define TARGET_RLIMIT_STACK		3 | ||||
| #define TARGET_RLIMIT_CORE		4 | ||||
| #define TARGET_RLIMIT_RSS		5 | ||||
| #define TARGET_RLIMIT_NPROC		6 | ||||
| #define TARGET_RLIMIT_NOFILE		7 | ||||
| #define TARGET_RLIMIT_MEMLOCK		8 | ||||
| #define TARGET_RLIMIT_AS		9 | ||||
| #define TARGET_RLIMIT_LOCKS		10 | ||||
| #define TARGET_RLIMIT_SIGPENDING	11 | ||||
| #define TARGET_RLIMIT_MSGQUEUE		12 | ||||
| #define TARGET_RLIMIT_NICE		13 | ||||
| #define TARGET_RLIMIT_RTPRIO		14 | ||||
| #endif | ||||
| 
 | ||||
| struct target_pollfd { | ||||
|     int fd;           /* file descriptor */ | ||||
|     short events;     /* requested events */ | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Wesley W. Terpstra
						Wesley W. Terpstra