lkml.org 
[lkml]   [2021]   [Feb]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH V2.1] mm/highmem: Add VM_BUG_ON() to mem*_page() calls
    Date
    From: Ira Weiny <ira.weiny@intel.com>

    Add VM_BUG_ON bounds checks to ensure the newly lifted and created page
    memory operations do not result in corrupted data in neighbor pages.[1][2]

    [1] https://lore.kernel.org/lkml/20201210053502.GS1563847@iweiny-DESK2.sc.intel.com/
    [2] https://lore.kernel.org/lkml/20210209110931.00f00e47d9a0529fcee2ff01@linux-foundation.org/

    Suggested-by: Matthew Wilcox <willy@infradead.org>
    Suggested-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Ira Weiny <ira.weiny@intel.com>

    ---
    Changes from V2:
    Actually, really do VM_BUG_ON... <sigh>
    Clean up commit message
    ---
    include/linux/highmem.h | 5 +++++
    1 file changed, 5 insertions(+)

    diff --git a/include/linux/highmem.h b/include/linux/highmem.h
    index 0b5d89621cb9..44170f312ae7 100644
    --- a/include/linux/highmem.h
    +++ b/include/linux/highmem.h
    @@ -283,6 +283,7 @@ static inline void memcpy_page(struct page *dst_page, size_t dst_off,
    char *dst = kmap_local_page(dst_page);
    char *src = kmap_local_page(src_page);

    + VM_BUG_ON(dst_off + len > PAGE_SIZE || src_off + len > PAGE_SIZE);
    memcpy(dst + dst_off, src + src_off, len);
    kunmap_local(src);
    kunmap_local(dst);
    @@ -295,6 +296,7 @@ static inline void memmove_page(struct page *dst_page, size_t dst_off,
    char *dst = kmap_local_page(dst_page);
    char *src = kmap_local_page(src_page);

    + VM_BUG_ON(dst_off + len > PAGE_SIZE || src_off + len > PAGE_SIZE);
    memmove(dst + dst_off, src + src_off, len);
    kunmap_local(src);
    kunmap_local(dst);
    @@ -305,6 +307,7 @@ static inline void memset_page(struct page *page, size_t offset, int val,
    {
    char *addr = kmap_local_page(page);

    + VM_BUG_ON(offset + len > PAGE_SIZE);
    memset(addr + offset, val, len);
    kunmap_local(addr);
    }
    @@ -314,6 +317,7 @@ static inline void memcpy_from_page(char *to, struct page *page,
    {
    char *from = kmap_local_page(page);

    + VM_BUG_ON(offset + len > PAGE_SIZE);
    memcpy(to, from + offset, len);
    kunmap_local(from);
    }
    @@ -323,6 +327,7 @@ static inline void memcpy_to_page(struct page *page, size_t offset,
    {
    char *to = kmap_local_page(page);

    + VM_BUG_ON(offset + len > PAGE_SIZE);
    memcpy(to + offset, from, len);
    kunmap_local(to);
    }
    --
    2.28.0.rc0.12.gb6a658bd00c9
    \
     
     \ /
      Last update: 2021-02-10 18:52    [W:4.166 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site