Merge pull request #767 from dhylands/fix-short-read

Deal with reading a buffer less than what was allocated.
This commit is contained in:
Damien George 2014-07-22 11:01:24 +01:00
commit 3e0bce3587
1 changed files with 6 additions and 4 deletions

View File

@ -97,7 +97,7 @@ STATIC mp_obj_t stream_read(uint n_args, const mp_obj_t *args) {
} }
int error; int error;
mp_int_t out_sz = o->type->stream_p->read(o, p, more_bytes, &error); mp_int_t out_sz = o->type->stream_p->read(o, p, more_bytes, &error);
if (out_sz == -1) { if (out_sz < 0) {
vstr_cut_tail_bytes(&vstr, more_bytes); vstr_cut_tail_bytes(&vstr, more_bytes);
if (is_nonblocking_error(error)) { if (is_nonblocking_error(error)) {
// With non-blocking streams, we read as much as we can. // With non-blocking streams, we read as much as we can.
@ -113,11 +113,13 @@ STATIC mp_obj_t stream_read(uint n_args, const mp_obj_t *args) {
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, "[Errno %d]", error)); nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, "[Errno %d]", error));
} }
if (out_sz == 0) { if (out_sz < more_bytes) {
// Finish reading. // Finish reading.
// TODO what if we have read only half a non-ASCII char? // TODO what if we have read only half a non-ASCII char?
vstr_cut_tail_bytes(&vstr, more_bytes); vstr_cut_tail_bytes(&vstr, more_bytes - out_sz);
break; if (out_sz == 0) {
break;
}
} }
// count chars from bytes just read // count chars from bytes just read