Patchwork [3,of,5,V2] bundle2: make sure the unbundler refuse non bundle2 stream

login
register
mail settings
Submitter Pierre-Yves David
Date March 20, 2014, 6:39 p.m.
Message ID <9793c682d01acbaace36.1395340784@marginatus.alto.octopoid.net>
Download mbox | patch
Permalink /patch/4009/
State Accepted
Commit 88db3e6153196e2731a71f0044223659edf63b7e
Headers show

Comments

Pierre-Yves David - March 20, 2014, 6:39 p.m.
# HG changeset patch
# User Pierre-Yves David <pierre-yves.david@fb.com>
# Date 1395185734 25200
#      Tue Mar 18 16:35:34 2014 -0700
# Node ID 9793c682d01acbaace3604a2d517b0b12d64d58e
# Parent  82f930ee78d4cdb25789e0b78a61b3dec99990d3
bundle2: make sure the unbundler refuse non bundle2 stream

We now make use of the magic string at the beginning of the file.

Patch

diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py
--- a/mercurial/bundle2.py
+++ b/mercurial/bundle2.py
@@ -60,11 +60,11 @@  Binary format is as follow
   Currently forced to 0 in the current state of the implementation
 """
 
 import util
 import changegroup
-
+from i18n import _
 
 _magicstring = 'HG20'
 
 class bundler(object):
     """represent an outgoing bundle2 container
@@ -91,14 +91,17 @@  class unbundler(object):
     """interpret a bundle2 stream
 
     (this will eventually yield parts)"""
 
     def __init__(self, fp):
-        # assume the magic string is ok and drop it
-        # to be obviously fixed soon.
         self._fp = fp
-        self._readexact(4)
+        header = self._readexact(4)
+        magic, version = header[0:2], header[2:4]
+        if magic != 'HG':
+            raise util.Abort(_('not a Mercurial bundle'))
+        if version != '20':
+            raise util.Abort(_('unknown bundle version %s') % version)
 
     def _unpack(self, format):
         """unpack this struct format from the stream"""
         data = self._readexact(struct.calcsize(format))
         return _unpack(format, data)
diff --git a/tests/test-bundle2.t b/tests/test-bundle2.t
--- a/tests/test-bundle2.t
+++ b/tests/test-bundle2.t
@@ -36,10 +36,13 @@  Create an extension to test bundle2 API
 
 The extension requires a repo (currently unused)
 
   $ hg init main
   $ cd main
+  $ touch a
+  $ hg add a
+  $ hg commit -m 'a'
 
 Test simple generation of empty bundle
 
   $ hg bundle2
   HG20\x00\x00\x00\x00 (no-eol) (esc)
@@ -47,5 +50,13 @@  Test simple generation of empty bundle
 Test parsing of an empty bundle
 
   $ hg bundle2 | hg unbundle2
   options count: 0
   parts count:   0
+
+Test old style bundle are detected and refused
+
+  $ hg bundle --all ../bundle.hg
+  1 changesets found
+  $ hg unbundle2 < ../bundle.hg
+  abort: unknown bundle version 10
+  [255]