]> Zhao Yanbai Git Server - minix.git/commitdiff
vfs: patch for unpause()/revive() race condition 45/645/2
authorBen Gras <ben@minix3.org>
Wed, 12 Jun 2013 18:42:41 +0000 (18:42 +0000)
committerBen Gras <ben@minix3.org>
Fri, 14 Jun 2013 21:58:43 +0000 (23:58 +0200)
. unpause() and revive() can race - revive() can run during
  a device i/o unblock, causing two sendnb()s to occur, and the
  2nd one to fail
. this can easily happen when a process is blocking on tty and
  is then killed by a signal - tty cancels the i/o and then
  kills the process by a signal

Change-Id: Ia319acaedfa336b78c030a2c4af7246959bdcf87

servers/vfs/pipe.c

index f9a4cfb3c5d746d8d8b2066ac54d2f42a04c29f1..8f4fd703695b88d078a8224d75be738f57ba4eca 100644 (file)
@@ -640,13 +640,14 @@ void unpause(endpoint_t proc_e)
                panic("VFS: unknown block reason: %d", blocked_on);
   }
 
-  rfp->fp_blocked_on = FP_BLOCKED_ON_NONE;
-
   if ((blocked_on == FP_BLOCKED_ON_PIPE || blocked_on == FP_BLOCKED_ON_POPEN)&&
        !wasreviving) {
        susp_count--;
   }
 
-  replycode(proc_e, status);   /* signal interrupted call */
+  if(rfp->fp_blocked_on != FP_BLOCKED_ON_NONE) {
+       rfp->fp_blocked_on = FP_BLOCKED_ON_NONE;
+       replycode(proc_e, status);      /* signal interrupted call */
+  }
 }