34 lines
1.0 KiB
Diff
34 lines
1.0 KiB
Diff
|
Index: gdb-6.3/gdb/linux-nat.c
|
||
|
===================================================================
|
||
|
--- gdb-6.3.orig/gdb/linux-nat.c 2006-06-15 07:27:02.000000000 -0300
|
||
|
+++ gdb-6.3/gdb/linux-nat.c 2006-06-15 07:27:06.000000000 -0300
|
||
|
@@ -157,12 +157,28 @@ static int
|
||
|
my_waitpid (int pid, int *status, int flags)
|
||
|
{
|
||
|
int ret;
|
||
|
+ int old_status = status ? *status : 0;
|
||
|
+
|
||
|
do
|
||
|
{
|
||
|
ret = waitpid (pid, status, flags);
|
||
|
}
|
||
|
while (ret == -1 && errno == EINTR);
|
||
|
|
||
|
+ if (ret == 0 && status != 0)
|
||
|
+ {
|
||
|
+ /* waitpid() running within ia32el (on multi-threaded processes
|
||
|
+ only?) modifies status even when it returns zero, and this
|
||
|
+ breaks the assumption in linux_nat_wait(), and perhaps
|
||
|
+ elsewhere, that it remains unchanged in this case. We
|
||
|
+ restore the old value before returning zero, such that the
|
||
|
+ assumption holds. */
|
||
|
+ if (*status != 0 && *status != old_status)
|
||
|
+ warning ("waitpid: non-zero status %x for zero return value",
|
||
|
+ *status);
|
||
|
+ *status = old_status;
|
||
|
+ }
|
||
|
+
|
||
|
return ret;
|
||
|
}
|
||
|
|