diff options
-rw-r--r-- | kernel/sched.c | 10 |
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 | ||