Conventionally a read() system call will return the number of bytes
copied, and will only return -EFOO if the number of bytes copied was
zero.
Lots of parts of the kernel break this, but it's usually device drivers
and scruffy pseudo files, in which case a partial file read doesn't
make much sense. This doesn't make the broken behaviour right, but at
least we have a bit of a weaselly excuse in that case.
I just went by the read man page:
EFAULT buf is outside your accessible address space.