Fix write()'s sigpipe case (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 3 May 2016 21:00:59 +0000 (17:00 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 3 May 2016 21:00:59 +0000 (17:00 -0400)
We were checking errno for every non-zero return, instead of every negative
return.  It's possible that the kernel spuriously sets errno but doesn't
return -1, in which case the user should not look at errno.  Likewise, an
application could have set errno = EPIPE.

And thanks to mtaufen for spotting the typo in read.c.

Rebuild glibc, but it's not urgent.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/read.c
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/write.c

index 96d3683..7716577 100644 (file)
@@ -22,7 +22,7 @@
 #include <stddef.h>
 #include <ros/syscall.h>
 
-/* Write NBYTES of BUF to FD.  Return the number written, or -1.  */
+/* Read NBYTES of FD to buf.  Return the number read, or -1.  */
 ssize_t
 __libc_read (int fd, void *buf, size_t nbytes)
 {
index 9d44807..248b03a 100644 (file)
@@ -33,7 +33,7 @@ ssize_t __libc_write(int fd, const void *buf, size_t nbytes)
 {
        int ret = ros_syscall(SYS_write, fd, buf, nbytes, 0, 0, 0);
 
-       if (unlikely((ret != 0) && (errno == EPIPE))) {
+       if (unlikely((ret < 0) && (errno == EPIPE))) {
                sigset_t mask;
 
                sigprocmask(0, NULL, &mask);