• R
    x86: ia32 syscall restart fix · 40f0933d
    Roland McGrath 提交于
    The code to restart syscalls after signals depends on checking for a
    negative orig_ax, and for particular negative -ERESTART* values in ax.
    These fields are 64 bits and for a 32-bit task they get zero-extended.
    The syscall restart behavior is lost, a regression from a native 32-bit
    kernel and from 64-bit tasks' behavior.
    
    This patch fixes the problem by doing sign-extension where it matters.
    
    For orig_ax, the only time the value should be -1 but winds up as
    0x0ffffffff is via a 32-bit ptrace call. So the patch changes ptrace to
    sign-extend the 32-bit orig_eax value when it's stored; it doesn't
    change the checks on orig_ax, though it uses the new current_syscall()
    inline to better document the subtle importance of the used of
    signedness there.
    
    The ax value is stored a lot of ways and it seems hard to get them all
    sign-extended at their origins. So for that, we use the
    current_syscall_ret() to sign-extend it only for 32-bit tasks at the
    time of the -ERESTART* comparisons.
    Signed-off-by: NRoland McGrath <roland@redhat.com>
    Signed-off-by: NIngo Molnar <mingo@elte.hu>
    40f0933d
ptrace.c 38.2 KB