xen: Prevent buffer overflow in privcmd ioctl
The "call" variable comes from the user in privcmd_ioctl_hypercall().
It's an offset into the hypercall_page[] which has (PAGE_SIZE / 32)
elements. We need to put an upper bound on it to prevent an out of
bounds access.
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Signed-off-by: Juergen Gross <jgross@suse.com>
Obtained from: Linux
Linux commit: 42d8644bd77dd2d747e004e367cb0c895a606f39
Fixes: bf7313e3b7
("xen: implement the privcmd user-space device")
Submitted by: Elliott Mitchell <ehem+freebsd@m5p.com>
Reviewed by: royger
This commit is contained in:
parent
0fdf5bc531
commit
e99c0c8b79
@ -145,6 +145,9 @@ privcmd_hypercall(long op, long a1, long a2, long a3, long a4, long a5)
|
||||
register long __arg5 __asm__("r8") = (long)(a5);
|
||||
long __call = (long)&hypercall_page + (op * 32);
|
||||
|
||||
if (op >= PAGE_SIZE / 32)
|
||||
return -EINVAL;
|
||||
|
||||
__asm__ volatile (
|
||||
"call *%[call]"
|
||||
: "=a" (__res), "=D" (__ign1), "=S" (__ign2),
|
||||
|
@ -122,6 +122,9 @@ privcmd_hypercall(long op, long a1, long a2, long a3, long a4, long a5)
|
||||
{
|
||||
long __res, __ign1, __ign2, __ign3, __ign4, __ign5, __call;
|
||||
|
||||
if (op >= PAGE_SIZE / 32)
|
||||
return -EINVAL;
|
||||
|
||||
__call = (long)&hypercall_page + (op * 32);
|
||||
__asm__ volatile (
|
||||
"call *%[call]"
|
||||
|
Loading…
Reference in New Issue
Block a user