From 1e7b45c682c73790e20ea992ff153bef5ac8f0fc Mon Sep 17 00:00:00 2001 From: David van Moolenbroek Date: Wed, 28 Aug 2013 13:08:16 +0200 Subject: [PATCH] VFS: fix interruption of blocking pipe operations POSIX states that when interrupted, partially successful pipe operations should return the partial result rather than EINTR. VFS previously wouldn't look at the partial result, and not clear it either, which would result in a panic upon the next pipe operation. Change-Id: Ia1eb72b4b77394051444e63a1390d49bb315eb04 --- servers/vfs/pipe.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/servers/vfs/pipe.c b/servers/vfs/pipe.c index 83cc7fe66..57c2378b8 100644 --- a/servers/vfs/pipe.c +++ b/servers/vfs/pipe.c @@ -548,6 +548,15 @@ void unpause(void) switch (blocked_on) { case FP_BLOCKED_ON_PIPE:/* process trying to read or write a pipe */ + /* If the operation succeeded partially, return the bytes + * processed so far, and clear the remembered state. Otherwise, + * return EINTR as usual. + */ + if (fp->fp_cum_io_partial > 0) { + status = fp->fp_cum_io_partial; + + fp->fp_cum_io_partial = 0; + } break; case FP_BLOCKED_ON_LOCK:/* process trying to set a lock with FCNTL */