From 548bf91d816449f479c4aab44fbd5d14f1066c74 Mon Sep 17 00:00:00 2001 From: KOSAKI Motohiro Date: Wed, 19 May 2010 09:37:41 +0900 Subject: [PATCH] --- yaml --- r: 191963 b: refs/heads/master c: fa9dc265ace9774e62f0e31108e5f47911124bda h: refs/heads/master i: 191961: aa872fd366b3b9abcb470bda1f52956d8513093c 191959: 4cb58c2c234f293ef20d0509dc36b3c5966e451e v: v3 --- [refs] | 2 +- trunk/kernel/compat.c | 25 +++++++++++-------------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/[refs] b/[refs] index b4a2b64b023f..1f1882510ba9 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: cf77e988ddfc7f047ac1ddc72cadb5eee7e09293 +refs/heads/master: fa9dc265ace9774e62f0e31108e5f47911124bda diff --git a/trunk/kernel/compat.c b/trunk/kernel/compat.c index 7f40e9275fd9..5adab05a3172 100644 --- a/trunk/kernel/compat.c +++ b/trunk/kernel/compat.c @@ -495,29 +495,26 @@ asmlinkage long compat_sys_sched_getaffinity(compat_pid_t pid, unsigned int len, { int ret; cpumask_var_t mask; - unsigned long *k; - unsigned int min_length = cpumask_size(); - - if (nr_cpu_ids <= BITS_PER_COMPAT_LONG) - min_length = sizeof(compat_ulong_t); - if (len < min_length) + if ((len * BITS_PER_BYTE) < nr_cpu_ids) + return -EINVAL; + if (len & (sizeof(compat_ulong_t)-1)) return -EINVAL; if (!alloc_cpumask_var(&mask, GFP_KERNEL)) return -ENOMEM; ret = sched_getaffinity(pid, mask); - if (ret < 0) - goto out; + if (ret == 0) { + size_t retlen = min_t(size_t, len, cpumask_size()); - k = cpumask_bits(mask); - ret = compat_put_bitmap(user_mask_ptr, k, min_length * 8); - if (ret == 0) - ret = min_length; - -out: + if (compat_put_bitmap(user_mask_ptr, cpumask_bits(mask), retlen * 8)) + ret = -EFAULT; + else + ret = retlen; + } free_cpumask_var(mask); + return ret; }