|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] memory corruption in HYPERVISOR_physdev_op()
>>> On 15.10.12 at 12:58, Ian Campbell <Ian.Campbell@xxxxxxxxxx> wrote:
> On Mon, 2012-10-15 at 11:48 +0100, Jan Beulich wrote:
>> >>> On 15.10.12 at 12:27, Ian Campbell <Ian.Campbell@xxxxxxxxxx> wrote:
>> > On Fri, 2012-09-14 at 14:24 +0300, Dan Carpenter wrote:
>> >> My static analyzer complains about potential memory corruption in
>> >> HYPERVISOR_physdev_op()
>> >>
>> >> arch/x86/include/asm/xen/hypercall.h
>> >> 389 static inline int
>> >> 390 HYPERVISOR_physdev_op(int cmd, void *arg)
>> >> 391 {
>> >> 392 int rc = _hypercall2(int, physdev_op, cmd, arg);
>> >> 393 if (unlikely(rc == -ENOSYS)) {
>> >> 394 struct physdev_op op;
>> >> 395 op.cmd = cmd;
>> >> 396 memcpy(&op.u, arg, sizeof(op.u));
>> >> 397 rc = _hypercall1(int, physdev_op_compat, &op);
>> >> 398 memcpy(arg, &op.u, sizeof(op.u));
>> >> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>> >> Some of the arg buffers are not as large as sizeof(op.u) which is either
>> >> 12 or 16 depending on the size of longs in struct physdev_apic.
>> >
>> > Nasty!
>>
>> Wasn't it that pv-ops expects Xen 4.0.1 or newer anyway? If so,
>> what does this code exist for in the first place (it's framed by
>> #if CONFIG_XEN_COMPAT <= 0x030002 in the Xenified kernel)?
>
> I think the 4.0.1 or newer requirement is for dom0 only. I guess physdev
> op is only used in dom0 though? Or does passthrough need it?
No, it's only platform_op that is Dom0-only.
>> > I can see the memory corruption but how does it relate to ret ==
>> > -ENOSYS?
>>
>> The (supposedly) corrupting code site inside an
>>
>> if (unlikely(rc == -ENOSYS)) {
>
> Ah, for some reason I assumed this was in the eventual caller, even
> though it was staring me right in the face in the full quote.
I think Dan's reference was to an eventual caller - it would see
the -ENOSYS, as the compat call wouldn't return anything else
than the modern one, and the modern one (to enter the code
in question) must have returned -ENOSYS.
>> Fixing this other than by removing the broken code would be
>> pretty hard I'm afraid (and I tend to leave the code untouched
>> altogether in the Xenified tree).
>
> Given that it is compat code the list of subops which needs to supported
> in this case is small and finite so a simple lookup table or even switch
> stmt for the size might be an option.
Ugly, particularly for an inline function. But possible of course.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |