changeset 8016:baaa832fd253

raise RevlogError when parser can't parse the revlog index Initial patch and test thanks to Nicolas Dumazet.
author Benoit Boissinot <benoit.boissinot@ens-lyon.org>
date Mon, 06 Apr 2009 19:48:11 +0200
parents 47b0a881638f
children 685ce2f7ee35 cb77c0fbec39
files mercurial/revlog.py tests/test-verify tests/test-verify.out
diffstat 3 files changed, 37 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/revlog.py	Tue Mar 31 07:56:28 2009 +0200
+++ b/mercurial/revlog.py	Mon Apr 06 19:48:11 2009 +0200
@@ -450,7 +450,10 @@
         if self.version == REVLOGV0:
             self._io = revlogoldio()
         if i:
-            d = self._io.parseindex(f, self._inline)
+            try:
+                d = self._io.parseindex(f, self._inline)
+            except (ValueError, IndexError), e:
+                raise RevlogError(_("index %s is corrupted") % (self.indexfile))
             self.index, self.nodemap, self._chunkcache = d
 
         # add the magic null revision at -1 (if it hasn't been done already)
--- a/tests/test-verify	Tue Mar 31 07:56:28 2009 +0200
+++ b/tests/test-verify	Mon Apr 06 19:48:11 2009 +0200
@@ -1,7 +1,8 @@
 #!/bin/sh
 
 echo % prepare repo
-hg init
+hg init a
+cd a
 echo "some text" > FOO.txt
 echo "another text" > bar.txt
 echo "more text" > QUICK.txt
@@ -23,4 +24,22 @@
 echo % verify
 hg verify
 
+cd ..
+
+echo % test revlog corruption
+hg init b
+cd b
+
+touch a
+hg add a
+hg ci -m a
+
+echo 'corrupted' > b
+head -c 20 .hg/store/data/a.i > start
+cat start b > .hg/store/data/a.i
+
+echo
+echo % verify
+hg verify
+
 exit 0
--- a/tests/test-verify.out	Tue Mar 31 07:56:28 2009 +0200
+++ b/tests/test-verify.out	Mon Apr 06 19:48:11 2009 +0200
@@ -29,3 +29,16 @@
 3 files, 1 changesets, 0 total revisions
 9 integrity errors encountered!
 (first damaged changeset appears to be 0)
+% test revlog corruption
+
+% verify
+checking changesets
+checking manifests
+crosschecking files in changesets and manifests
+checking files
+ a@0: broken revlog! (index data/a.i is corrupted)
+warning: orphan revlog 'data/a.i'
+1 files, 1 changesets, 0 total revisions
+1 warnings encountered!
+1 integrity errors encountered!
+(first damaged changeset appears to be 0)