From: Ben Gras Date: Wed, 12 Jun 2013 18:42:41 +0000 (+0000) Subject: vfs: patch for unpause()/revive() race condition X-Git-Tag: v3.3.0~921 X-Git-Url: http://zhaoyanbai.com/repos/Bv9ARM.ch08.html?a=commitdiff_plain;h=8f2749cca841af071f3110ef340cde615778eabd;p=minix.git vfs: patch for unpause()/revive() race condition . 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 --- diff --git a/servers/vfs/pipe.c b/servers/vfs/pipe.c index f9a4cfb3c..8f4fd7036 100644 --- a/servers/vfs/pipe.c +++ b/servers/vfs/pipe.c @@ -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 */ + } }