Thread (19 messages) 19 messages, 6 authors, 2018-11-30

Re: [PULL] vhost: cleanups and fixes

From: "Michael S. Tsirkin" <mst@redhat.com>
Date: 2018-11-02 17:21:15
Also in: kvm, lkml

On Fri, Nov 02, 2018 at 10:10:45AM -0700, Linus Torvalds wrote:
On Fri, Nov 2, 2018 at 9:59 AM Michael S. Tsirkin [off-list ref] wrote:
quoted
Just for completeness I'd like to point out for vhost the copies are
done from the kernel thread.  So yes we can switch to copy_to/from_user
but for e.g. 32-bit userspace running on top of a 64 bit kernel it is
IIUC not sufficient - we must *also* do access_ok checks on control path
when addresses are passed to the kernel and when current points to the
correct task struct.
Don't you take over the VM with "use_mm()" when you do the copies?
Yes we do.
So
yes, it's a kernel thread, but it has a user VM, and though that
should have the user limits.

No?

          Linus
Here's what I meant: we have

#define access_ok(type, addr, size)                                     \
({                                                                      \
        WARN_ON_IN_IRQ();                                               \
        likely(!__range_not_ok(addr, size, user_addr_max()));           \
})

and

#define user_addr_max() (current->thread.addr_limit.seg)

it seems that it depends on current not on the active mm.

get_user and friends are similar:

ENTRY(__get_user_1)
        mov PER_CPU_VAR(current_task), %_ASM_DX
        cmp TASK_addr_limit(%_ASM_DX),%_ASM_AX
        jae bad_get_user
        sbb %_ASM_DX, %_ASM_DX          /* array_index_mask_nospec() */
        and %_ASM_DX, %_ASM_AX
        ASM_STAC
1:      movzbl (%_ASM_AX),%edx
        xor %eax,%eax
        ASM_CLAC
        ret
ENDPROC(__get_user_1)
EXPORT_SYMBOL(__get_user_1)

-- 
MST
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help