mercurial/bundle2.py
changeset 35118 1fb0846ad792
parent 35117 589eed45a452
child 35119 764e3ad1cf54
--- a/mercurial/bundle2.py	Mon Nov 13 22:05:54 2017 -0800
+++ b/mercurial/bundle2.py	Mon Nov 13 21:48:35 2017 -0800
@@ -1198,13 +1198,21 @@
 
     headersize = struct.calcsize(_fpayloadsize)
     readexactly = changegroup.readexactly
+    read = fh.read
 
     chunksize = _unpack(_fpayloadsize, readexactly(fh, headersize))[0]
     indebug(ui, 'payload chunk size: %i' % chunksize)
 
+    # changegroup.readexactly() is inlined below for performance.
     while chunksize:
         if chunksize >= 0:
-            yield readexactly(fh, chunksize)
+            s = read(chunksize)
+            if len(s) < chunksize:
+                raise error.Abort(_('stream ended unexpectedly '
+                                    ' (got %d bytes, expected %d)') %
+                                  (len(s), chunksize))
+
+            yield s
         elif chunksize == flaginterrupt:
             # Interrupt "signal" detected. The regular stream is interrupted
             # and a bundle2 part follows. Consume it.
@@ -1213,7 +1221,13 @@
             raise error.BundleValueError(
                 'negative payload chunk size: %s' % chunksize)
 
-        chunksize = _unpack(_fpayloadsize, readexactly(fh, headersize))[0]
+        s = read(headersize)
+        if len(s) < headersize:
+            raise error.Abort(_('stream ended unexpectedly '
+                                ' (got %d bytes, expected %d)') %
+                              (len(s), chunksize))
+
+        chunksize = _unpack(_fpayloadsize, s)[0]
 
         # indebug() inlined for performance.
         if dolog: