]> Zhao Yanbai Git Server - minix.git/commitdiff
VFS: fix interruption of blocking pipe operations 54/954/2
authorDavid van Moolenbroek <david@minix3.org>
Wed, 28 Aug 2013 11:08:16 +0000 (13:08 +0200)
committerLionel Sambuc <lionel@minix3.org>
Tue, 18 Feb 2014 10:25:03 +0000 (11:25 +0100)
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

index 83cc7fe668d0c052d26ce931f076587375d5faaf..57c2378b8565c9c97e72a344b7b344fbca4bab8c 100644 (file)
@@ -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 */