setrlimit: Check arguments in the same order as in Linux

(1) Check if rlim's address is valid
(2) Check if soft-limit does not exceed hard-limit

Fujitsu: POSTK_DEBUG_TEMP_FIX_3
Refs: #1050
Change-Id: I5bf1008ce172f9dff64ec89b1f97614926abaf13
This commit is contained in:
Ken Sato
2018-07-02 13:15:32 +09:00
committed by Masamichi Takagi
parent b920da5103
commit 3636c8e7e4
10 changed files with 481 additions and 13 deletions

View File

@ -5565,16 +5565,16 @@ SYSCALL_DECLARE(setrlimit)
struct rlimit *rlm = (struct rlimit *)ihk_mc_syscall_arg1(ctx);
struct thread *thread = cpu_local_var(current);
int i;
#ifdef POSTK_DEBUG_TEMP_FIX_3 /* If rlim_cur is greater than rlim_max, return -EINVAL (S64FX_19) */
struct rlimit new_rlim;
if (copy_from_user(&new_rlim, rlm, sizeof(*rlm)))
return -EFAULT;
if (new_rlim.rlim_cur > new_rlim.rlim_max)
return -EINVAL;
#endif /* POSTK_DEBUG_TEMP_FIX_3 */
int mcresource;
if (copy_from_user(&new_rlim, rlm, sizeof(*rlm))) {
return -EFAULT;
}
if (new_rlim.rlim_cur > new_rlim.rlim_max) {
return -EINVAL;
}
switch(resource){
case RLIMIT_FSIZE:
case RLIMIT_NOFILE:
@ -5595,12 +5595,8 @@ SYSCALL_DECLARE(setrlimit)
return syscall_generic_forwarding(__NR_setrlimit, ctx);
}
#ifdef POSTK_DEBUG_TEMP_FIX_3 /* If rlim_cur is greater than rlim_max, return -EINVAL (S64FX_19) */
memcpy(thread->proc->rlimit + mcresource, &new_rlim, sizeof(new_rlim));
#else /* POSTK_DEBUG_TEMP_FIX_3 */
if(copy_from_user(thread->proc->rlimit + mcresource, rlm, sizeof(struct rlimit)))
return -EFAULT;
#endif /* POSTK_DEBUG_TEMP_FIX_3 */
memcpy(thread->proc->rlimit + mcresource, &new_rlim,
sizeof(new_rlim));
return 0;
}