diff --git a/tests/bundles/test-revlog-diff-relative-to-nullrev.sh b/tests/bundles/test-revlog-diff-relative-to-nullrev.sh new file mode 100755 --- /dev/null +++ b/tests/bundles/test-revlog-diff-relative-to-nullrev.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# +# Make sure to patch mercurial to create the delta against nullrev +# if deltainfo is None: +#- deltainfo = self._fullsnapshotinfo(fh, revinfo, target_rev) +#+ deltainfo = self._builddeltainfo(revinfo, nullrev, fh) + +cd "`dirname \"$0\"`" +export HGRCPATH= +export HGMODULEPOLICY=py + +rm -rf nullrev-diff +../../hg init nullrev-diff --config format.revlog-compression=zlib +cd nullrev-diff +echo hi > a +../../../hg commit -Am root-B +../../../hg debugdeltachain a +rm -rf .hg/cache/ .hg/wcache/ +cd .. + +tar cf test-revlog-diff-relative-to-nullrev.tar nullrev-diff + +rm -rf nullrev-diff diff --git a/tests/bundles/test-revlog-diff-relative-to-nullrev.tar b/tests/bundles/test-revlog-diff-relative-to-nullrev.tar new file mode 100644 index 0000000000000000000000000000000000000000..28d0754dc9d18310896fae6d75a4c00634f07c59 GIT binary patch literal 30720 zc%1E=U5MON6vwmFg*HlC5p|{7M)BLun0u3(>{=^Z3+j{AClOrmPI5C7CzDL`QM-y1 z#g)GJAi`p?R4w=*8M_nkYjX0l6#~Rx&3|~0jXHU1Y@kJf{YX$V?iQ4 zI-dnZK}dZ`5*pNRcu~l*{x0wLD-^fg{^eS=7jvL{`>Tqsf&F>VVgDfXd{*o%=-&Q> zD4>5XWZ2(lyCd6YK_O!#2G&$H+y1(evcIk%RgmODM$e(o?QeP^a}CdAqU9RYs4=n1 zT;@~9WKKxMcxpIabq^AQCiMe0dnnG#5plUs9Vmbd{hKtTg$04`{eSE&6!8B%Sj_&k zY!@;{p8rQkPy2sa0sqg3HNwE$qYcT?bWCzEJ;$wMW7j`&@!s*rHXr@v$p>CMx#RdB z`?B7tW;KpdA3y!~ z^S|Br*Jr11n$peqmZ^oY-{m{ULYvYtqqY&uqRldi4bF&j@6aq5o!$#;bkL3ya7AbMrsak^gBb2L1B@ zNrr+HJX}GlMGTD^SW)B=OEZW$f_0sk6q6CHLabqk?W>W@_;1vxTV-*!zw`w_p8m1g zvHsVS`Y-680|Tx2UyW~-bo@Vg-Q7oaJ@ecb%DVGket%c=!yS{KTx@@N690Fse^t6h z7(M;c#Fo#G-8Sfc_0ALbYg~PCfYPp`DLkn5_P^>(71X9-2D8rc!;hTB>;e>|eX?-7_y7_;v79^Og;~ zuS(yLq5rvJU@>Fl#(#t$|6eBN3q26s`;!d)N3Q9WE7Yh*P0Mzc*aynZ|K-&BAIq@= z0R8g-i$Z&@CyPSM^~++@p|&fSwjW=k_>;FyigN2o89c{IW)b}tHb#E_k30H5NC*A% zpw;M+#RWCrLM-=b1BK9`|3Y{E&5~dL zN%wy=M4-faRh?|EKe78#>mhA)B8U) z0{ve;n9QP)1J(R~B_sZ`z$k8v?)QIcNQd~(1z9w_M#B!F`rn^q#DCAL#}mHJ>HmLp zeE(m^D(IgJ3+&&cHGRJQ)BRsnCb0j93-FzN000000000000000000000000000000 M000000DzUnf3O+GNdN!< diff --git a/tests/test-revlog.t b/tests/test-revlog.t --- a/tests/test-revlog.t +++ b/tests/test-revlog.t @@ -32,6 +32,7 @@ Unknown version is rejected Test for CVE-2016-3630 + $ mkdir test2; cd test2 $ hg init >>> import codecs @@ -52,3 +53,37 @@ Test for CVE-2016-3630 >>> rl = revlog.revlog(tvfs, target=(KIND_OTHER, b'test'), radix=b'a') >>> rl.revision(1) mpatchError(*'patch cannot be decoded'*) (glob) + + $ cd .. + + +Regression test for support for the old repos with strange diff encoding. +Apparently it used to be possible (maybe it's still possible, but we don't know how) +to create commits whose diffs are encoded relative to a nullrev. +This test checks that a repo with that encoding can still be read. + +This is what we did to produce the repo in test-revlog-diff-relative-to-nullrev.tar: + +- tweak the code in mercurial/revlogutils/deltas.py to produce such "trivial" deltas: +> if deltainfo is None: +> - deltainfo = self._fullsnapshotinfo(fh, revinfo, target_rev) +> + deltainfo = self._builddeltainfo(revinfo, nullrev, fh) +- hg init +- echo hi > a +- hg commit -Am_ +- remove some cache files + + $ tar --force-local -xf "$TESTDIR"/bundles/test-revlog-diff-relative-to-nullrev.tar + $ cd nullrev-diff + $ hg debugdeltachain a + rev chain# chainlen prev delta size rawsize chainsize ratio lindist extradist extraratio readsize largestblk rddensity srchunks + 0 1 2 -1 p1 15 3 15 5.00000 15 0 0.00000 15 15 1.00000 1 +#if rhg + $ hg cat --config rhg.cat=true -r 0 a + abort: corrupted revlog + [255] +#else + $ hg cat --config rhg.cat=true -r 0 a + hi +#endif + $ cd ..