From 8f2749cca841af071f3110ef340cde615778eabd Mon Sep 17 00:00:00 2001 From: Ben Gras Date: Wed, 12 Jun 2013 18:42:41 +0000 Subject: [PATCH] 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 --- servers/vfs/pipe.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) 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 */ + } } -- 2.44.0