gdb/gdb-6.3-ia32el-fix-waitpid-...

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;
}