patch: display a nice error for invalid base85 data stable
authorPatrick Mezard <patrick@mezard.eu>
Sat, 21 Apr 2012 19:58:18 +0200
branchstable
changeset 16522 a8065323c003
parent 16521 592701c8eac6
child 16523 727068417b95
patch: display a nice error for invalid base85 data Before, import was terminating with a traceback. Now it says: $ hg import --no-commit ../bad.patch applying ../bad.patch abort: could not decode binary patch: bad base85 character at position 66
mercurial/base85.c
mercurial/patch.py
tests/test-import-git.t
--- a/mercurial/base85.c	Thu Apr 26 14:24:46 2012 +0200
+++ b/mercurial/base85.c	Sat Apr 21 19:58:18 2012 +0200
@@ -109,7 +109,7 @@
 			if (c < 0)
 				return PyErr_Format(
 					PyExc_ValueError,
-					"Bad base85 character at position %d", i);
+					"bad base85 character at position %d", i);
 			acc = acc * 85 + c;
 		}
 		if (i++ < len)
@@ -118,13 +118,13 @@
 			if (c < 0)
 				return PyErr_Format(
 					PyExc_ValueError,
-					"Bad base85 character at position %d", i);
+					"bad base85 character at position %d", i);
 			/* overflow detection: 0xffffffff == "|NsC0",
 			 * "|NsC" == 0x03030303 */
 			if (acc > 0x03030303 || (acc *= 85) > 0xffffffff - c)
 				return PyErr_Format(
 					PyExc_ValueError,
-					"Bad base85 sequence at position %d", i);
+					"bad base85 sequence at position %d", i);
 			acc += c;
 		}
 
--- a/mercurial/patch.py	Thu Apr 26 14:24:46 2012 +0200
+++ b/mercurial/patch.py	Sat Apr 21 19:58:18 2012 +0200
@@ -1051,7 +1051,11 @@
                 l = ord(l) - ord('A') + 1
             else:
                 l = ord(l) - ord('a') + 27
-            dec.append(base85.b85decode(line[1:-1])[:l])
+            try:
+                dec.append(base85.b85decode(line[1:-1])[:l])
+            except ValueError, e:
+                raise PatchError(_('could not decode binary patch: %s')
+                                 % str(e))
             line = lr.readline()
             self.hunk.append(line)
         text = zlib.decompress(''.join(dec))
--- a/tests/test-import-git.t	Thu Apr 26 14:24:46 2012 +0200
+++ b/tests/test-import-git.t	Sat Apr 21 19:58:18 2012 +0200
@@ -362,6 +362,25 @@
   A binary2
     text2
   R text2
+
+Invalid base85 content
+  $ hg rollback
+  repository tip rolled back to revision 15 (undo import)
+  working directory now based on revision 15
+  $ hg revert -aq
+  $ hg import -d "1000000 0" -m invalid-binary - <<"EOF"
+  > diff --git a/text2 b/binary2
+  > rename from text2
+  > rename to binary2
+  > index 78981922613b2afb6025042ff6bd878ac1994e85..10efcb362e9f3b3420fcfbfc0e37f3dc16e29757
+  > GIT binary patch
+  > literal 5
+  > Mc$`b*O.$Pw00T?_*Z=?k
+  > 
+  > EOF
+  applying patch from stdin
+  abort: could not decode binary patch: bad base85 character at position 6
+  [255]
   $ cd ..
 
 Consecutive import with renames (issue2459)