From 1d8816c36bbb638cd9e5319f820d2b2cf22a9822 Mon Sep 17 00:00:00 2001
From: Dave Hylands <dhylands@gmail.com>
Date: Mon, 21 Jul 2014 16:51:07 -0700
Subject: [PATCH] Deal with reading a buffer less than what was allocated.

With this fix, file_long_read now passes.
---
 py/stream.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/py/stream.c b/py/stream.c
index 4c8b8a570..5b5fa90df 100644
--- a/py/stream.c
+++ b/py/stream.c
@@ -97,7 +97,7 @@ STATIC mp_obj_t stream_read(uint n_args, const mp_obj_t *args) {
             }
             int 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);
                 if (is_nonblocking_error(error)) {
                     // 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));
             }
 
-            if (out_sz == 0) {
+            if (out_sz < more_bytes) {
                 // Finish reading.
                 // TODO what if we have read only half a non-ASCII char?
-                vstr_cut_tail_bytes(&vstr, more_bytes);
-                break;
+                vstr_cut_tail_bytes(&vstr, more_bytes - out_sz);
+                if (out_sz == 0) {
+                    break; 
+                }
             }
 
             // count chars from bytes just read
-- 
GitLab