returns less than we wanted. Also, fix the case of small reads with an empty buffer not to leave garbled buffer pointers if we have to do more than one read.