• Thomas Gleixner's avatar
    x86/fpu: Fix copy_xstate_to_kernel() gap handling · 96258950
    Thomas Gleixner authored
    The gap handling in copy_xstate_to_kernel() is wrong when XSAVES is in
    use.
    
    Using init_fpstate for copying the init state of features which are
    not set in the xstate header is only correct for the legacy area, but
    not for the extended features area because when XSAVES is in use then
    init_fpstate is in compacted form which means the xstate offsets which
    are used to copy from init_fpstate are not valid.
    
    Fortunately, this is not a real problem today because all extended
    features in use have an all-zeros init state, but it is wrong
    nevertheless and with a potentially dynamically sized init_fpstate this
    would result in an access outside of the init_fpstate.
    
    Fix this by keeping track of the last copied state in the target buffer and
    explicitly zero it when there is a feature or alignment gap.
    
    Use the compacted offset when accessing the extended feature space in
    init_fpstate.
    
    As this is not a functional issue on older kernels this is intentionally
    not tagged for stable.
    
    Fixes: b8be15d5 ("x86/fpu/xstate: Re-enable XSAVES")
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
    Reviewed-by: default avatarBorislav Petkov <bp@suse.de>
    Link: https://lkml.kernel.org/r/20210623121451.294282032@linutronix.de
    96258950
xstate.c 39.4 KB