Roland McGrath 40f0933d51 x86: ia32 syscall restart fix
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: Roland McGrath <roland@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
2008-03-11 17:11:54 +01:00
..
2007-10-17 21:19:04 +02:00
2008-01-30 13:33:14 +01:00
2008-02-26 12:55:49 +01:00
2007-10-11 11:17:01 +02:00
2007-10-11 11:17:24 +02:00
2007-10-19 11:53:33 -07:00
2007-10-13 10:01:23 -07:00
2008-01-30 13:31:31 +01:00
2008-01-31 22:05:47 +01:00
2008-01-30 13:33:32 +01:00
2008-02-19 16:18:28 +01:00
2007-10-11 11:17:01 +02:00
2008-01-30 13:31:19 +01:00
2008-02-19 16:18:28 +01:00
2008-02-19 16:18:29 +01:00
2008-02-26 12:55:50 +01:00
2008-03-07 16:39:14 +01:00
2008-02-13 16:20:35 +01:00
2008-02-19 16:18:29 +01:00
2008-01-30 13:33:10 +01:00
2007-10-11 11:17:24 +02:00
2007-10-13 10:01:23 -07:00
2007-10-11 11:17:01 +02:00
2007-10-11 11:17:24 +02:00
2008-01-30 13:33:19 +01:00
2008-01-30 13:30:31 +01:00
2008-02-14 23:30:20 +01:00
2007-10-11 11:17:01 +02:00
2008-03-11 17:11:54 +01:00
2008-03-07 16:39:14 +01:00
2007-10-11 11:17:01 +02:00
2007-10-11 11:17:24 +02:00
2008-01-30 13:32:40 +01:00
2008-01-30 13:33:24 +01:00
2008-02-19 16:18:28 +01:00
2007-10-11 11:17:01 +02:00
2008-03-11 17:11:54 +01:00
2008-03-07 16:39:14 +01:00
2007-10-20 01:13:56 +02:00
2007-10-17 08:42:55 -07:00
2008-02-08 09:22:29 -08:00
2008-02-29 18:55:39 +01:00
2008-01-30 13:31:52 +01:00
2008-02-06 22:39:44 +01:00
2008-01-30 13:33:24 +01:00
2007-10-11 11:17:24 +02:00
2008-01-30 13:31:42 +01:00
2008-02-04 16:47:54 +01:00
2007-10-11 11:17:01 +02:00
2008-01-30 13:31:10 +01:00