|
@@ -7499,6 +7499,22 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
|
|
|
ret = get_errno(sys_sched_getaffinity(arg1, mask_size, mask));
|
|
|
|
|
|
if (!is_error(ret)) {
|
|
|
+ if (ret > arg2) {
|
|
|
+ /* More data returned than the caller's buffer will fit.
|
|
|
+ * This only happens if sizeof(abi_long) < sizeof(long)
|
|
|
+ * and the caller passed us a buffer holding an odd number
|
|
|
+ * of abi_longs. If the host kernel is actually using the
|
|
|
+ * extra 4 bytes then fail EINVAL; otherwise we can just
|
|
|
+ * ignore them and only copy the interesting part.
|
|
|
+ */
|
|
|
+ int numcpus = sysconf(_SC_NPROCESSORS_CONF);
|
|
|
+ if (numcpus > arg2 * 8) {
|
|
|
+ ret = -TARGET_EINVAL;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ ret = arg2;
|
|
|
+ }
|
|
|
+
|
|
|
if (copy_to_user(arg3, mask, ret)) {
|
|
|
goto efault;
|
|
|
}
|