lkml.org 
[lkml]   [2022]   [Apr]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.17 15/22] x86: __memcpy_flushcache: fix wrong alignment if size > 2^32
    Date
    From: Mikulas Patocka <mpatocka@redhat.com>

    [ Upstream commit a6823e4e360fe975bd3da4ab156df7c74c8b07f3 ]

    The first "if" condition in __memcpy_flushcache is supposed to align the
    "dest" variable to 8 bytes and copy data up to this alignment. However,
    this condition may misbehave if "size" is greater than 4GiB.

    The statement min_t(unsigned, size, ALIGN(dest, 8) - dest); casts both
    arguments to unsigned int and selects the smaller one. However, the
    cast truncates high bits in "size" and it results in misbehavior.

    For example:

    suppose that size == 0x100000001, dest == 0x200000002
    min_t(unsigned, size, ALIGN(dest, 8) - dest) == min_t(0x1, 0xe) == 0x1;
    ...
    dest += 0x1;

    so we copy just one byte "and" dest remains unaligned.

    This patch fixes the bug by replacing unsigned with size_t.

    Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/x86/lib/usercopy_64.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    diff --git a/arch/x86/lib/usercopy_64.c b/arch/x86/lib/usercopy_64.c
    index 0402a749f3a0..0ae6cf804197 100644
    --- a/arch/x86/lib/usercopy_64.c
    +++ b/arch/x86/lib/usercopy_64.c
    @@ -119,7 +119,7 @@ void __memcpy_flushcache(void *_dst, const void *_src, size_t size)

    /* cache copy and flush to align dest */
    if (!IS_ALIGNED(dest, 8)) {
    - unsigned len = min_t(unsigned, size, ALIGN(dest, 8) - dest);
    + size_t len = min_t(size_t, size, ALIGN(dest, 8) - dest);

    memcpy((void *) dest, (void *) source, len);
    clean_cache_range((void *) dest, len);
    --
    2.35.1
    \
     
     \ /
      Last update: 2022-04-26 21:03    [W:5.253 / U:0.720 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site