diff --git a/mm/usercopy.c b/mm/usercopy.c index 660717a1ea5c..1b86537d0094 100644 --- a/mm/usercopy.c +++ b/mm/usercopy.c @@ -164,6 +164,8 @@ static inline void check_page_span(const void *ptr, unsigned long n, const void *end = ptr + n - 1; struct page *endpage; bool is_reserved, is_cma; + const void * const stack = task_stack_page(current); + const void * const stackend = stack + THREAD_SIZE; /* * Sometimes the kernel data regions are not marked Reserved (see @@ -188,6 +190,10 @@ static inline void check_page_span(const void *ptr, unsigned long n, end <= (const void *)__bss_stop) return; + /* Allow stack region to span multiple pages */ + if (ptr >= stack && end <= stackend) + return; + /* Is the object wholly within one base page? */ if (likely(((unsigned long)ptr & (unsigned long)PAGE_MASK) == ((unsigned long)end & (unsigned long)PAGE_MASK)))