Reader.Read is permitted to return EOF on short reads, which had not been anticipated by this code. There's probably more instances of this lurking...
TODO: tests for this.