diff --git a/src/modules/_Stdio/buffer.cmod b/src/modules/_Stdio/buffer.cmod
index 8b0c1ccabad012a49cf3afd8ed8fb5403ad8768b..2232d6856b125491e4d42071a7bfa767731fe35e 100644
--- a/src/modules/_Stdio/buffer.cmod
+++ b/src/modules/_Stdio/buffer.cmod
@@ -579,27 +579,19 @@ PIKECLASS IOBuffer
 
   static LONGEST io_read_number( IOBuffer *io, size_t len )
   {
-    size_t i;
     LONGEST res;
     if( !io_avail(io, len) )
       return -1;
-    if( len > SIZEOF_INT_TYPE )
-    {
-      unsigned int extra = len-SIZEOF_INT_TYPE;
-      /* ensure only 0:s */
-      for( i=0; i<extra; i++ )
-      {
-        if( io_read_byte_uc(io) )
-          Pike_error("Integer (%dbit) overflow.\n", SIZEOF_INT_TYPE*8);
-      }
-      len=SIZEOF_INT_TYPE;
-    }
-    if( len == SIZEOF_INT_TYPE )
-    {
-      if( *io_read_pointer(io) > 127 )
-        Pike_error("Signed (%dbit) overflow.\n", SIZEOF_INT_TYPE*8);
-    }
-    return io_read_number_uc( io, len );
+						  /* ensure only leading 0:s */
+    for (; UNLIKELY(len > SIZEOF_INT_TYPE); len--)
+      if( UNLIKELY(io_read_byte_uc(io)) )
+        Pike_error("Integer (%dbit) overflow.\n", SIZEOF_INT_TYPE*8);
+
+    res = io_read_number_uc( io, len );
+
+    if ( UNLIKELY(res < 0) )
+      Pike_error("Signed (%dbit) overflow.\n", SIZEOF_INT_TYPE*8);
+    return res;
   }
 
   static struct object *io_read_bignum( IOBuffer *io, size_t len )