When a process forks, VFS is informed on behalf of the child. This is
correct, because otherwise signals to the new child could get lost.
However, that means that the parent is not blocked from being killed
by a signal while the child is blocked on this VFS call. As a result,
by the time that the VFS reply comes in, the parent may already be
dead, and the child may thus have been assigned a new parent: INIT.
Previously, PM would blindly reply to the parent when the VFS reply
for the fork came in. Thus, it could end up sending a reply to INIT,
even though INIT did not issue the fork(2) call. This could end up
satisfying a different call from INIT (typically waitpid(2)) and then
cause an error when that other call was complete.
It would be possible to set VFS_CALL on both forking parent and child.
This patch instead adds a flag (NEW_PARENT) to note that a process's
parent has changed during a VFS call.
Change-Id: Iad930b2e441db54fe6f7d2fd011f0f6a26e2923d
- introduce PROC_STOPPED flag, which tracks whether the process is
stopped on PROC_STOP in the kernel, rather than implicitly deriving
this from PM_SIG_PENDING;
- make the process resumption test based on current state rather than
state transitions;
- add and clarify several flag checks in the signal handling code;
- add test79 to test signal handling robustness.
Change-Id: Ic8c7527095035b300b56f2ab1b9dd190bd4bf001