12308: Avoid returning partial reads before EOF.
authorTom Clegg <tom@tomclegg.ca>
Tue, 21 Jan 2020 16:34:57 +0000 (11:34 -0500)
committerTom Clegg <tom@tomclegg.ca>
Thu, 30 Jan 2020 00:03:54 +0000 (19:03 -0500)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom@tomclegg.ca>

lib/mount/fs.go

index 5b6fc0012f59a00b5da9f93be19906675be164f4..774948f574607b04f8548837720e6ba5c06c7c2f 100644 (file)
@@ -320,6 +320,16 @@ func (fs *keepFS) Read(path string, buf []byte, ofst int64, fh uint64) (n int) {
                return fs.errCode(err)
        }
        n, err := f.Read(buf)
+       for err == nil && n < len(buf) {
+               // f is an io.Reader ("If some data is available but
+               // not len(p) bytes, Read conventionally returns what
+               // is available instead of waiting for more") -- but
+               // our caller requires us to either fill buf or reach
+               // EOF.
+               done := n
+               n, err = f.Read(buf[done:])
+               n += done
+       }
        if err != nil && err != io.EOF {
                log.Printf("error reading %q: %s", path, err)
                return fs.errCode(err)