On 22.08.12 10:21:07, Junxiao Bi wrote:
> If one kernel path is using KM_USER0 slot and is interrupted by
> the oprofile nmi, then in copy_from_user_nmi(), the KM_USER0 slot
> will be overwrite and cleared to zero at last, when the control
> return to the original kernel path, it will access an invalid
> virtual address and trigger a crash.
> 
> Cc: Robert Richter <[email protected]>
> Cc: Greg KH <[email protected]>
> Cc: [email protected]
> Signed-off-by: Junxiao Bi <[email protected]>
> 
> Hi, Please review this patch.
> 
> It is for linux-2.6.32.y stable branch not for mainline.

I am not sure if there will be any .32 stable release in the future,
but this could be at least for .34 or if there is one for .27 and .35.

> 
> Thanks,
> Junxiao.
> ---
>  arch/x86/oprofile/backtrace.c |    4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)

We should implement the perf version here, which does a:

        int type = in_nmi() ? KM_NMI : KM_IRQ0;

See arch/x86/kernel/cpu/perf_event.c.

-Robert

> 
> diff --git a/arch/x86/oprofile/backtrace.c b/arch/x86/oprofile/backtrace.c
> index 829edf0..b50a280 100644
> --- a/arch/x86/oprofile/backtrace.c
> +++ b/arch/x86/oprofile/backtrace.c
> @@ -71,9 +71,9 @@ copy_from_user_nmi(void *to, const void __user *from, 
> unsigned long n)
>               offset = addr & (PAGE_SIZE - 1);
>               size = min(PAGE_SIZE - offset, n - len);
>  
> -             map = kmap_atomic(page, KM_USER0);
> +             map = kmap_atomic(page, KM_NMI);
>               memcpy(to, map+offset, size);
> -             kunmap_atomic(map, KM_USER0);
> +             kunmap_atomic(map, KM_NMI);
>               put_page(page);
>  
>               len  += size;
> -- 
> 1.7.9.5
> 
> 

-- 
Advanced Micro Devices, Inc.
Operating System Research Center

--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to