kernel: signal: check user buffer addresses...

in _user_set_signal_mask(), _user_sigaction(), _user_sigsuspend(), _user_set_signal_stack().
This commit is contained in:
Jérôme Duval
2018-01-06 17:15:18 +01:00
parent e04d859b34
commit 9572fa7340
+16 -12
View File
@@ -2267,9 +2267,10 @@ _user_set_signal_mask(int how, const sigset_t *userSet, sigset_t *userOldSet)
sigset_t set, oldSet; sigset_t set, oldSet;
status_t status; status_t status;
if ((userSet != NULL && user_memcpy(&set, userSet, sizeof(sigset_t)) < B_OK) if ((userSet != NULL && (!IS_USER_ADDRESS(userSet)
|| (userOldSet != NULL && user_memcpy(&oldSet, userOldSet, || user_memcpy(&set, userSet, sizeof(sigset_t)) < B_OK))
sizeof(sigset_t)) < B_OK)) || (userOldSet != NULL && (!IS_USER_ADDRESS(userOldSet)
|| user_memcpy(&oldSet, userOldSet, sizeof(sigset_t)) < B_OK)))
return B_BAD_ADDRESS; return B_BAD_ADDRESS;
status = sigprocmask_internal(how, userSet ? &set : NULL, status = sigprocmask_internal(how, userSet ? &set : NULL,
@@ -2291,10 +2292,11 @@ _user_sigaction(int signal, const struct sigaction *userAction,
struct sigaction act, oact; struct sigaction act, oact;
status_t status; status_t status;
if ((userAction != NULL && user_memcpy(&act, userAction, if ((userAction != NULL && (!IS_USER_ADDRESS(userAction)
sizeof(struct sigaction)) < B_OK) || user_memcpy(&act, userAction, sizeof(struct sigaction)) < B_OK))
|| (userOldAction != NULL && user_memcpy(&oact, userOldAction, || (userOldAction != NULL && (!IS_USER_ADDRESS(userOldAction)
sizeof(struct sigaction)) < B_OK)) || user_memcpy(&oact, userOldAction, sizeof(struct sigaction))
< B_OK)))
return B_BAD_ADDRESS; return B_BAD_ADDRESS;
status = sigaction_internal(signal, userAction ? &act : NULL, status = sigaction_internal(signal, userAction ? &act : NULL,
@@ -2351,8 +2353,10 @@ _user_sigsuspend(const sigset_t *userMask)
if (userMask == NULL) if (userMask == NULL)
return B_BAD_VALUE; return B_BAD_VALUE;
if (user_memcpy(&mask, userMask, sizeof(sigset_t)) < B_OK) if (!IS_USER_ADDRESS(userMask)
|| user_memcpy(&mask, userMask, sizeof(sigset_t)) < B_OK) {
return B_BAD_ADDRESS; return B_BAD_ADDRESS;
}
return sigsuspend_internal(&mask); return sigsuspend_internal(&mask);
} }
@@ -2385,10 +2389,10 @@ _user_set_signal_stack(const stack_t* newUserStack, stack_t* oldUserStack)
struct stack_t newStack, oldStack; struct stack_t newStack, oldStack;
bool onStack = false; bool onStack = false;
if ((newUserStack != NULL && user_memcpy(&newStack, newUserStack, if ((newUserStack != NULL && (!IS_USER_ADDRESS(newUserStack)
sizeof(stack_t)) < B_OK) || user_memcpy(&newStack, newUserStack, sizeof(stack_t)) < B_OK))
|| (oldUserStack != NULL && user_memcpy(&oldStack, oldUserStack, || (oldUserStack != NULL && (!IS_USER_ADDRESS(oldUserStack)
sizeof(stack_t)) < B_OK)) || user_memcpy(&oldStack, oldUserStack, sizeof(stack_t)) < B_OK)))
return B_BAD_ADDRESS; return B_BAD_ADDRESS;
if (thread->signal_stack_enabled) { if (thread->signal_stack_enabled) {