If you take the position that the semantics of read() are 'read data from this endless stream', then EOF is an error indicating that this model no longer applies.
Except in that model it would be fine to return an error as soon as soon as you know there is an EOF while in the real world you do want to read right up to the EOF because EOF is usually not an error condition but expected, even with streams of indeterminate length.
Doesn't bother me at all.