aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/sched.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/kernel/sched.c b/kernel/sched.c
index 7ca934588ec4..c89db3bbd01f 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -6717,7 +6717,9 @@ SYSCALL_DEFINE3(sched_getaffinity, pid_t, pid, unsigned int, len,
6717 int ret; 6717 int ret;
6718 cpumask_var_t mask; 6718 cpumask_var_t mask;
6719 6719
6720 if (len < cpumask_size()) 6720 if (len < nr_cpu_ids)
6721 return -EINVAL;
6722 if (len & (sizeof(unsigned long)-1))
6721 return -EINVAL; 6723 return -EINVAL;
6722 6724
6723 if (!alloc_cpumask_var(&mask, GFP_KERNEL)) 6725 if (!alloc_cpumask_var(&mask, GFP_KERNEL))
@@ -6725,10 +6727,12 @@ SYSCALL_DEFINE3(sched_getaffinity, pid_t, pid, unsigned int, len,
6725 6727
6726 ret = sched_getaffinity(pid, mask); 6728 ret = sched_getaffinity(pid, mask);
6727 if (ret == 0) { 6729 if (ret == 0) {
6728 if (copy_to_user(user_mask_ptr, mask, cpumask_size())) 6730 int retlen = min(len, cpumask_size());
6731
6732 if (copy_to_user(user_mask_ptr, mask, retlen))
6729 ret = -EFAULT; 6733 ret = -EFAULT;
6730 else 6734 else
6731 ret = cpumask_size(); 6735 ret = retlen;
6732 } 6736 }
6733 free_cpumask_var(mask); 6737 free_cpumask_var(mask);
6734 6738