Commit 7d783796 authored by Anton Blanchard's avatar Anton Blanchard Committed by Linus Torvalds

[PATCH] Backward compatibility for compat sched_getaffinity

The follow patch special cases the NR_CPUS <= BITS_PER_COMPAT_LONG case.
Without this patch, a 32bit task would be required to have a 64bit
cpumask no matter what value of NR_CPUS are used.

With this patch a compat long sized bitmask is allowed if NR_CPUS is
small enough to fit within it.

Of course applications should be using the glibc wrappers that use an
opaque cpu_mask_t type, but there could be older applications using the
syscalls directly.
Signed-off-by: default avatarAnton Blanchard <anton@samba.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 2d3399ab
......@@ -446,8 +446,12 @@ asmlinkage long compat_sys_sched_getaffinity(compat_pid_t pid, unsigned int len,
int ret;
cpumask_t mask;
unsigned long *k;
unsigned int min_length = sizeof(cpumask_t);
if (len < sizeof(cpumask_t))
if (NR_CPUS <= BITS_PER_COMPAT_LONG)
min_length = sizeof(compat_ulong_t);
if (len < min_length)
return -EINVAL;
ret = sched_getaffinity(pid, &mask);
......@@ -455,11 +459,11 @@ asmlinkage long compat_sys_sched_getaffinity(compat_pid_t pid, unsigned int len,
return ret;
k = cpus_addr(mask);
ret = compat_put_bitmap(user_mask_ptr, k, sizeof(cpumask_t) * 8);
ret = compat_put_bitmap(user_mask_ptr, k, min_length * 8);
if (ret)
return ret;
return sizeof(cpumask_t);
return min_length;
}
static int get_compat_itimerspec(struct itimerspec *dst,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment