-
Notifications
You must be signed in to change notification settings - Fork 18.8k
Description
What version of Go are you using (go version)?
$ go version go version go1.12.6 darwin/amd64
Does this issue reproduce with the latest release?
It does.
What operating system and processor architecture are you using (go env)?
go env Output
$ go env GOARCH="amd64" GOBIN="" GOCACHE="/Users/danielcormier/Library/Caches/go-build" GOEXE="" GOFLAGS="" GOHOSTARCH="amd64" GOHOSTOS="darwin" GOOS="darwin" GOPATH="/Users/danielcormier/go" GOPROXY="" GORACE="" GOROOT="/usr/local/Cellar/go/1.12.6/libexec" GOTMPDIR="" GOTOOLDIR="/usr/local/Cellar/go/1.12.6/libexec/pkg/tool/darwin_amd64" GCCGO="gccgo" CC="clang" CXX="clang++" CGO_ENABLED="1" GOMOD="" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/84/_6l41bt970l9fmsrwc_p1gv00000gn/T/go-build636168797=/tmp/go-build -gno-record-gcc-switches -fno-common"
What did you do?
According to the docs for io.Reader:
When Read encounters an error or end-of-file condition after successfully reading n > 0 bytes, it returns the number of bytes read. It may return the (non-nil) error from the same call or return the error (and n == 0) from a subsequent call. An instance of this general case is that a Reader returning a non-zero number of bytes at the end of the input stream may return either err == EOF or err == nil. The next Read should return 0, EOF.
In the case where an io.Reader implementation returns a non-zero number of bytes read and io.EOF on a Read() call, a bufio.Reader buffering from one of these io.Reader implementations may return io.EOF even when it still has buffered data that has not been read. Specifically, this may happen when a slice with a zero length is given to (*bufio.Reader).Read() if it is not the first call to that method.
Here is a test showing the problem.
What did you expect to see?
That last (*bufio.Reader).Read() call should not have returned io.EOF unless there was no more buffered content.
What did you see instead?
(*bufio.Reader).Read() returned io.EOF even though there was more buffered content available for reading.