]> Cypherpunks repositories - gostls13.git/commitdiff
os: do not assume syscall.Write will write everything
authorRuss Cox <rsc@golang.org>
Thu, 15 Mar 2012 19:10:19 +0000 (15:10 -0400)
committerRuss Cox <rsc@golang.org>
Thu, 15 Mar 2012 19:10:19 +0000 (15:10 -0400)
Fixes #3323.

R=golang-dev, remyoudompheng, gri
CC=golang-dev
https://golang.org/cl/5837047

src/pkg/os/file_unix.go

index 6aa0280f4a69894c9407cd8978e4ce12a33a4aa4..6271c3189ef1d006f720291ec44eb63472d5bfc6 100644 (file)
@@ -173,7 +173,21 @@ func (f *File) pread(b []byte, off int64) (n int, err error) {
 // write writes len(b) bytes to the File.
 // It returns the number of bytes written and an error, if any.
 func (f *File) write(b []byte) (n int, err error) {
-       return syscall.Write(f.fd, b)
+       for {
+               m, err := syscall.Write(f.fd, b)
+               n += m
+
+               // If the syscall wrote some data but not all (short write)
+               // or it returned EINTR, then assume it stopped early for
+               // reasons that are uninteresting to the caller, and try again.
+               if 0 < m && m < len(b) || err == syscall.EINTR {
+                       b = b[m:]
+                       continue
+               }
+
+               return n, err
+       }
+       panic("not reached")
 }
 
 // pwrite writes len(b) bytes to the File starting at byte offset off.