diff --git a/read.c b/read.c
index 6a1cc29ce889cd9ffd671706c19cf045cfba3c0f..38cba0058f11e152576b86b901abbeaf806efef7 100644
--- a/read.c
+++ b/read.c
@@ -114,6 +114,7 @@ oop_read *oop_rd_new(oop_source *oop, oop_readable *ra, char *buf, size_t bufsz)
   rd->allocbuf= 0;
   rd->used= 0;
   rd->alloc= buf ? bufsz : 0;
+  rd->discard= 0;
   rd->neednotcheck= 0;
   rd->displacedchar= -1;
   rd->style= *OOP_RD_STYLE_IMMED;
@@ -235,7 +236,11 @@ static void *on_process(oop_source *oop, oop_read *rd, int try_read) {
   
   if (rd->discard) {
     rd->used -= rd->discard;
-    rd->neednotcheck -= rd->discard;
+    if (rd->neednotcheck > rd->discard) {
+      rd->neednotcheck -= rd->discard;
+    } else {
+      rd->neednotcheck= 0;
+    }
     memmove(buf, buf + rd->discard, rd->used);
     rd->discard= 0;
   }