* Bernhard R. Link <brl...@debian.org> [190330 07:58]: > I'm looking into #901952 (pristine-tar failing to checkout out old files > with non-printable unicode characters) and think that might be solved > with the attached patches, by calling tar with --null and giving it > a copy of the manifest file that is unescaped and NUL-terminated. > > What I haven't looked into yet is whether it will break files > generated with 1.46, as that the format incompatibly without > changing the version of the delta (though perhaps that can be > mitigated by an additional variant at checkout time). > > What are your opinions on that? Is this worth trying to get into buster?
Attached version with some small fixes, more tests convering those changes (and compatibility with previous versions), and an additional variant run on checkout time to also handle files commited with 1.46. Bernhard R. Link -- F8AC 04D5 0B9B 064B 3383 C3DA AFFC 96D1 151D FFDC
>From c26122199aca7c2e08a8597d700d66b8734a3ad6 Mon Sep 17 00:00:00 2001 From: "Bernhard R. Link" <brl...@debian.org> Date: Fri, 29 Mar 2019 22:32:13 +0100 Subject: [PATCH 1/6] revert writing unquoted filenames to manifest this caused the filename to be unquoted two times, break with filenames containing newlines and changed the semantics of manifest files without changing the format version --- pristine-tar | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pristine-tar b/pristine-tar index 0fe132e..fe10340 100755 --- a/pristine-tar +++ b/pristine-tar @@ -664,7 +664,7 @@ sub genmanifest { chomp; # ./ or / in the manifest just confuses tar s/^\.?\/+//; - print OUT unquote_filename($_) . "\n" if length $_; + print OUT $_ . "\n" if length $_; } close IN; close OUT; -- 2.20.1
>From bf607f0cd6de861a461eec9f60998950267001ab Mon Sep 17 00:00:00 2001 From: "Bernhard R. Link" <brl...@debian.org> Date: Fri, 29 Mar 2019 22:44:25 +0100 Subject: [PATCH 2/6] change unquoting to match how tar quotes the filenames Tar also generates octal escape sequences (\123) for some unicode characters, especially when run in a non-unicode locale like with LC_ALL=C. Those were not yet unquoted. Vertical tab was unquoted improperly \x11 instead of \x0b. If there was a literal backslash in a filename followed by a character like a, b, n, r, t, v, then tar escapes that to e.g. \\b. The old unquote the \b it saw in that, which this fixes. With those changes the unquote matches what tar uses, which is a prerequisite for giving tar the unquoted filenames to work around the behaviour change in tar 1.30. Compared to versions <= 1.45 this does not change the result of recreating a tar (so ensures every delta produced by those is still useable) and only make pristine-tar able to handle more tarballs. (As unquote in those were only used to create dummy files for missing files in git, while tar was given the original manifest file ignoring wrongly unquoted files). As 1.46 wrote unquoted files to the manifest, this commit breaks using some delta files created with 1.46. A later commit will add a compatibility step for those. --- pristine-tar | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/pristine-tar b/pristine-tar index fe10340..f6754c8 100755 --- a/pristine-tar +++ b/pristine-tar @@ -362,15 +362,27 @@ Options: sub unquote_filename { my $filename = shift; - $filename =~ s/\\a/\a/g; - $filename =~ s/\\b/\b/g; - $filename =~ s/\\f/\f/g; - $filename =~ s/\\n/\n/g; - $filename =~ s/\\r/\r/g; - $filename =~ s/\\t/\t/g; - $filename =~ s/\\v/\x11/g; - $filename =~ s/\\\\/\\/g; + my $unquote_character = sub { + if (defined $2 and $2 eq "000") { + die "filenames with NUL bytes are not supported"; + } + return pack("C", oct($2)) if defined $2; + my %map_named_escapes = ( + a => "\a", + b => "\b", + f => "\f", + n => "\n", + r => "\r", + t => "\t", + v => "\x0b", + "\\" => "\\", + ); + return $map_named_escapes{$1}; + }; + # unquote by calling $unquote_character for each matched group: + # (do all in a single run, as the octal sequences might output anything) + $filename =~ s/\\([abfnrtv\\])|\\([0-7]{3})/$unquote_character->()/ge; return $filename; } -- 2.20.1
>From c4d5609decd4b81285e92950a343b822e21608dc Mon Sep 17 00:00:00 2001 From: "Bernhard R. Link" <brl...@debian.org> Date: Fri, 29 Mar 2019 22:56:52 +0100 Subject: [PATCH 3/6] send manifests file to tar NUL-terminated and unquoted (Closes: #901952) tar changed behavior in no longer unescaping filenames with --verbatim-files-from breaking reading all delta files and handling files with such filenames. (This also fixes #902115 properly this time). --- pristine-tar | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pristine-tar b/pristine-tar index f6754c8..1c6e02e 100755 --- a/pristine-tar +++ b/pristine-tar @@ -396,12 +396,14 @@ sub recreatetarball { my @manifest; open(IN, "<", $manifestfile) || die "$manifestfile: $!"; + open(OUT, ">", "$tempdir/manifest") || die "$tempdir/manifest: $!"; while (<IN>) { chomp; push @manifest, $_; + print OUT unquote_filename($_) . pack("C", 0); } close IN; - link($manifestfile, "$tempdir/manifest") || die "link $tempdir/manifest: $!"; + close OUT; # The manifest and source should have the same filenames, # but the manifest probably has all the files under a common @@ -528,7 +530,7 @@ sub recreatetarball_helper { 0, "--numeric-owner", "-C", "$tempdir/workdir", "--no-recursion", "--mode", - "0644", "--verbatim-files-from", + "0644", "--null", "--files-from", "$tempdir/manifest" ); if (exists $options{tar_format}) { -- 2.20.1
>From e780486dac93da865c964256add9f9eafcde8190 Mon Sep 17 00:00:00 2001 From: "Bernhard R. Link" <brl...@debian.org> Date: Sun, 31 Mar 2019 01:14:18 +0100 Subject: [PATCH 4/6] add more testcases for unquoting of filenames espcially testing if deltas of old version can still be used --- test/samples/bundles/doublebackslash.bundle | Bin 0 -> 3434 bytes test/samples/bundles/escaping.bundle | Bin 0 -> 20668 bytes test/samples/bundles/newlines.bundle | Bin 0 -> 2183 bytes test/samples/bundles/simpleescapes.bundle | Bin 0 -> 2660 bytes test/samples/bundles/unicode.bundle | Bin 0 -> 6753 bytes test/samples/bundles/verticaltab.bundle | Bin 0 -> 1408 bytes test/samples/tarballs/actualbackslash.tar | Bin 0 -> 10240 bytes test/samples/tarballs/doublebackslash.tar | Bin 0 -> 10240 bytes test/samples/tarballs/newlines.tar | Bin 0 -> 10240 bytes test/samples/tarballs/simpleescapes.tar | Bin 0 -> 10240 bytes test/samples/tarballs/unicode.tar | Bin 0 -> 10240 bytes test/samples/tarballs/verticaltab.tar | Bin 0 -> 10240 bytes test/test_recreate.sh | 53 ++++++++++++++++++++ test/test_roundtrip.sh | 26 ++++++++++ 14 files changed, 79 insertions(+) create mode 100644 test/samples/bundles/doublebackslash.bundle create mode 100644 test/samples/bundles/escaping.bundle create mode 100644 test/samples/bundles/newlines.bundle create mode 100644 test/samples/bundles/simpleescapes.bundle create mode 100644 test/samples/bundles/unicode.bundle create mode 100644 test/samples/bundles/verticaltab.bundle create mode 100644 test/samples/tarballs/actualbackslash.tar create mode 100644 test/samples/tarballs/doublebackslash.tar create mode 100644 test/samples/tarballs/newlines.tar create mode 100644 test/samples/tarballs/simpleescapes.tar create mode 100644 test/samples/tarballs/unicode.tar create mode 100644 test/samples/tarballs/verticaltab.tar create mode 100644 test/test_recreate.sh diff --git a/test/samples/bundles/doublebackslash.bundle b/test/samples/bundles/doublebackslash.bundle new file mode 100644 index 0000000000000000000000000000000000000000..71200d56790709f206278d4102140408efa0d886 GIT binary patch literal 3434 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 literal 0 HcmV?d00001 diff --git a/test/samples/bundles/escaping.bundle b/test/samples/bundles/escaping.bundle new file mode 100644 index 0000000000000000000000000000000000000000..7be281042bb5cb6f508945c21c2e6147737a982f GIT binary patch literal 20668 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 J_T4qoe*jK5G-?0< literal 0 HcmV?d00001 diff --git a/test/samples/bundles/newlines.bundle b/test/samples/bundles/newlines.bundle new file mode 100644 index 0000000000000000000000000000000000000000..af95e7dc217dca5b1f13e38ac5840f4bd5d06306 GIT binary patch literal 2183 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 literal 0 HcmV?d00001 diff --git a/test/samples/bundles/simpleescapes.bundle b/test/samples/bundles/simpleescapes.bundle new file mode 100644 index 0000000000000000000000000000000000000000..19f371317f5fa0db60a08ba6493403fccd99adb5 GIT binary patch literal 2660 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 Xg$_f8^hapm$blzf10K!rD#Skl&mh!C literal 0 HcmV?d00001 diff --git a/test/samples/bundles/unicode.bundle b/test/samples/bundles/unicode.bundle new file mode 100644 index 0000000000000000000000000000000000000000..517f5c8930295154f43f7c20cfadb953adf140bd GIT binary patch literal 6753 zcma)>Wl$VIkf;~eph1GW%i<6q1VV5P2@b&>7FgUZ$U=fG7B;vAcMnboPSC|IIKj!{ zdn9+S-n&=#<ECn=XKHGuyK3s|p6+30@DgOOwfA7K@N}_qvc|O%7PYjJ5CTd7ttEh> zKyz^c2_bQym5m_KTtxJ7BxG)5E+}pZWN^2(0rT5gn_GeToz1}>*6z6G7FO0`0#??7 z)&kZ-Hs<2uVxpE3;+7)ff|jCU!a!jg8=$zAnALyV>gsL}_ON%c=Jhal|KICYdMzuD zi>oF3N)-SApgwlO3|t>r%CI&rDkD+Iy0@mlvG(qW3zxh{^z*KgIu@(8U3A*cZ*m|R z`n!eKT}kp9JHLpM$7yhV$5k^RWO5$0u6-~(s)t?hZ`ZWk6Uxc;JpYwn!_NMLoK?SZ zU9vbMff8Zip0l4#jNYXL%hX*yukY9@SsEn_TM?E|A$U|Br;6Ll@DzZM=wGCeC;dpQ zvd6gKDR83}VK{t#>3_40yZi)ANG;mT8TkCQV|^AZ9*qDD)scxG!(g{vj#}Xou01C- z<?hCz?rmZ0&JvT_SWLSmdtI^x7)tL}*NrFldZRq=+-PNU*K~lIYa5Y{gQj=W#eI%j zK^_6E@;S$#W+}yZQ}B6HG>FLrnqcuX<%|iQtlzOr*z`=9qKL-_CL|053JGX)aKwmB z3yFT>SLQ(#j2pSc-vlRZCSQgGe1lHIlH?-^>4q!yTib6YN(}{sbb?nFUW52fs7YpF z89hXaZ=H7>YRy6GT*;(NPUB&`tjC9aWp(u|PX;%Njd>gLs@$2*nJFrdly^i3-y+XK zIez!)JEKfF#vHvLbojE>mZsb34|2MU;nd*!-2!)h9cHN9L^4z5{~YOA6oE}C7-+bk zJpnX%nW$*aP5e2gdbSV0bP5hwE+!b(<GiIkue3$hUeEetn8d$Esls+-T~>LUT~zz7 zoKM0F9x9o4b)`u6YOHU$EFxwiuGbI%OTRX)7V&|hXrWcz(Z^x~_O7yx0cgL|Mjc7D ziMnj5PxHyk$W¿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 literal 0 HcmV?d00001 diff --git a/test/samples/bundles/verticaltab.bundle b/test/samples/bundles/verticaltab.bundle new file mode 100644 index 0000000000000000000000000000000000000000..e5e8d176d5b5c7878300adab7155deb5f38a916c GIT binary patch literal 1408 zcma)6S5%V+6#f$kVu)n~l~$2B2#Ku!PY6j^GJ}zbEGG^!84^|iL5ea8G@?>b)MzR) z^c2M4fR-Q#2_RshBp5Xy$_A@)f<Qs5km6|{`p}0y+=uU+Z`|{pbMIzMG654FnTTN} z#c-mzNER0)lQ~R~%4R}jDuKx55V%Z`OCS><2Z+mIQ>i2}iOi;A61Y5peFT@u5!myY zf<$ftl1=8YAO{waOeC?Fc@9htg#+=Hkt31CA~D$%HW%bVAm`uGxP(YSVq^^0Hj$a| z|FgIIcz7d`0Ulm{006+3NB<HkMO@VFhlE2$KFZWRfdXjDnBgWn&-R`5!Lkf~Ub*h2 zSiY=pym?gV{#{6AXziH_mPc^D<E`q@%4be%gHZ3b9^iW~DQ3;$+Ue7mDMOxO^5==h zrhu6C6No7>9nyO{TwW8Dl@#m!LE}HC#MY9p;SF&jLWrBDCL(fC-od;uX0&b5#5J_& z%PRSyNI7T(Xa%Ph*KXn8$HI&aOIE0>LciJGUnnUU4J{ZN1iK>8un9$h?2mMoCeIWM zV{z;`i!FhzICJXR+-pv@t77iq2gs3e&&;c5O6u28XM*e%8^3~dT{f<d4!_;U@2;HD zgzKMJ-EiOEeY)_bs3IdM%SFTM^5Ipo9;RVk85MddVxj{G5}`mGPDoY}p?rI~4V-X# z)m#Ru@q$WR=$$)}W1VJaY99Av)TgES%+^lP^Oi1)btB3mkz7&j)<y{mPm;R|XF5~s z@nWr7atIDoZo;<Q$ES#4=i$+d7Ww+Xsn5j+0UhfKo9*1|5D37DXtWVOA|~p4hF9jw z?2@}ep;RgrohvcU&Me6+DS@)HV7JZn;5XVVg+53mita;Ad1_o}Q3||Hm1HKj;LIoi z;&Tz4s67X-_<1?&kDm-n_U+N~csI*F7H?>7ZB{pf-3me{rcH(G!?pD)1_l(ZHY5_2 z+SbvlQ1pVfmThYFCZ)=yZGfPp^vOF+&GxQ&gvVCU@w`W6IqeEPd<E4~=<suPz!I6{ zNbAwk9?`yd5A_dkMpZGQ5SH(Ak7If7o9_UBca^?asv0X*wHAh8tniSPZ}INyb@W-d zj-YH8W^}{TI3c#DX=1l=pgViX;AJ9*6~GyT-TM?y`7O2iwd{`5MVY7kfz2fL(%{+s zS9|OSy6zpQ9XS@ACCZw#aBG)q5`r&M>;|>7HwII^VsvKF(&6WC_ad%I=j<k>{m1FH zou!wjl7u_I4c?QMF1lKtOxt+!&_w^Mylp+>$8BG%Rz;fp(lDpIWs%S=n1$ORoZh8v zc#b~w=MTfxdXxCn(S42e43WXEuMviaB|8|60_~fsRqd6rh{eXn(8|ueuV|FVIlqE+ zTZZ)5+QwV+@qtgseQuPY+$Yv32`cw4N{m`R@?u=AD;aOl9+`VJ)%-B2;IW23>>Pix z!n|j8EXl*lruq%PNIL)W0}nX*aYY{NOo)kl4C^rOKveun+bN8CX$3F2=5uTei*iN# zJ8VZr{E@02M9Jfz{2hezXo0Su$$6UfyfG{z@UU1^>>KQ?zo3O?nnc49pNj3mYGB)t zG#SneQ5I%;Ix7(T572@Jfb4Kj8h`@;r`0Z%Qh16OA(I&c7=4{PO;2$0+S59_7c6An zrLOh+4b<IXHJ){(_y)p^Bw_r+w5Ngd^<@DO0^m7?s*yrg?i=5z&h&i7y6%3fMoj~H ze@9q*tqxG%kIMY%3-O<u^0VFA$?)$QwxcsxDUJ)ucRSZsQ`3$el~@<l$G@iUn)U`r k3&wL`idbj)M**;p{=I|K7wXKK_Hh~IgTncqquvkx0=j>90ssI2 literal 0 HcmV?d00001 diff --git a/test/samples/tarballs/actualbackslash.tar b/test/samples/tarballs/actualbackslash.tar new file mode 100644 index 0000000000000000000000000000000000000000..3ae7a0a8c2eabe88ef2dad90ff4d7300d502d8c7 GIT binary patch literal 10240 zcmeH|%}&EG499ckDR={#&vpmi1gUbmbR4<{bwT3sae83TN<*27n6$qyZezzuevace z`e+YB^fa`uf%ah%+e^jboD*5IEHxXAklI+bDQ7I(rLj_q!}eQQM|?jens~`6#<aGc zM}D)<NBefT^URz6vg)ym$72}NGs(*Mozx9gjqepv-`Cz&JKJ@J>b}u?<$@yfaMK6E z=86c6F_90$@KiLb%sH1vUFW)<WvTPvvi_B`R@ky-uJgY0`v1y*3a9i(mmnv&F#p<V zgZy82ql;$!%s>CN)V|~gp(x5_=bV4XJw9uerRH|Os(&~8T@JgA_0H?Ri(}&EkDk8G yZ9)_f009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009vAHv*qN_jVNk literal 0 HcmV?d00001 diff --git a/test/samples/tarballs/doublebackslash.tar b/test/samples/tarballs/doublebackslash.tar new file mode 100644 index 0000000000000000000000000000000000000000..7b3d04b4b2c486dbdb0ef7f8988c477223067226 GIT binary patch literal 10240 zcmeH~U2cOg49D}lQ|tyK-|(=TR6?O-bQ&!aq|%N*r`=QpQm3FSW5Rhc#7Rv4_D>1# z=A&%dt}<<Tu%@;>iQh74N-5$kw5bKBAe0LUKFTu=ekz34q>2A2^A*p7Gd+atyUxwM zx1OK;m#vL9cbmEDC&?c7-SKEo?z!N#wlvEmSA|uTeqqKGd0tqnEvuj}XLSXG9#*{} z{J0<m>h4^%_9<vi=wOeA)^f`I_q%sb`DdI;B0~c$8NYG<zw+<w;C`(L7UZ8ZEinH} z>N#-EIR91W4!d3HP2ei`hx`01IODyAHnq^jru<8|0FdndvT?i{=U?Dy9;c4}=_)h+ z<KutfJ(Pb=;XfdSrW@y<BmXI?Y_&1Q{9m8_4Z!T*hSm&`t^xkg59D8Ie_u$U+Q#{( z$bX6|TWyRn|HJF4Y3&vNc=VGc=f4sX`A<<a4EawXGsZv#Pyti`6+i`00aO4LKm||% QQ~(t~1yBK0;LjBJ1TM<RQUCw| literal 0 HcmV?d00001 diff --git a/test/samples/tarballs/newlines.tar b/test/samples/tarballs/newlines.tar new file mode 100644 index 0000000000000000000000000000000000000000..02c3a260a1cf56c2912dd3769100089637c85bcc GIT binary patch literal 10240 zcmeIz&5nXF5C`y{eG1=T`#sCSgHK{A6g2_6K{P(TZOn$G9yT>@Lc)J81%?6oYo`3T z`|i+%z3X;I?;1a_&j*iTtz~J9k&iK{nNV62k<?npywFBTcKH0Kygu=I8Ql<HIfO92 zW~VEE<)3q#CO1{i`pC$29s1s%$4yhas@)4BVU6OdRdpkzq}H_DRq^~=C|*?!t!6zT zd|Z)$zn!|(S5Zmv&8anrOy2ju=P8}{zvP;jDSp!%1q<*0=lWkl@5kfm{69NxT3{RZ z_%z1IN0F{&`@bR+{}*p8XK~5G*MEyxv_Nscpa238fB*y_009U<00Izz00bZa0SG_< X0uX=z1Rwwb2tWV=5P$##W-0Ih#pTxL literal 0 HcmV?d00001 diff --git a/test/samples/tarballs/simpleescapes.tar b/test/samples/tarballs/simpleescapes.tar new file mode 100644 index 0000000000000000000000000000000000000000..1290d7d9b83b24762fede9616b0d024d1e22c222 GIT binary patch literal 10240 zcmeIy-D<-i6bEqcwvO!`_5x)ZJ(^tXO$NnI(_OU9NFD6)ckCDedl96C75YCnCLTY3 zqM!bIwb>49zg>MqAL1x3ACkjbD{{$EmYg&~X=9wT<gDYoGGvU{Tz)C1BYqu{A9>1g z7}9BWs+r6G?rqxK)bpypsCj-LcDuMwuVi{FL*HB9S>3gYbPU@0wF=b8u5EpAQE@z6 z^@gyxDuEOa>7}YiedByJoTKvI|NZB5dH);9?*P?LRo~;r@Bi`q@9rO;7H`Y^T@N_l zBOkEkH$ImfWqGVC-hbVY5^{d%^IP2b`JWGn5g-5o2tWV=5P$##AOHafKmY;|fB*y_ Z009U<00Izz00bZa0SG_<0ucCbfgfBsQ@j8G literal 0 HcmV?d00001 diff --git a/test/samples/tarballs/unicode.tar b/test/samples/tarballs/unicode.tar new file mode 100644 index 0000000000000000000000000000000000000000..063f6c85702f27319101a5b87a9048ab4360b205 GIT binary patch literal 10240 zcmeH~PjAyO6u@)lQ{)4XV#kTo3h_x0s=U}8)!L+TQ&e$k4`WjfhyxOW6M_R1f~jK% zHn!7tDj?zBk~?VdEpUWbw3ht|Yf#airRX_%_KW>{e(%X0)~_$O!X?(K-xZ7tY0SSN z-6*9-CUu*ZTIm>=IF9Fegkqxg*l`Iqmgm2eS&O}H#H9YE48v$vn}0b^|7&mg=JJ^f z-E(cz58G`KM7Ov@eO@D|hC~ff#HzSPs)#pi#9XR-gf*C5_0hG3-ViLV5P=4lVUu@- zyeFiEE2u(m6q<jL!C7c{o;w})zuz<UO#It~816-kUv|tDkN-dTKN8)jJI_<_7yfsN zJ}=<^%O39Y=b!5TCC05@(DXwttS^JZwZpZehoi51FMkZ49X;Oo_V$UTwkEOKQ`>4Z z8BB)igW9o@-DE4-NMl@Kot5LCXa1+U#%EHuX^FFMC+ok19jwP4TPU$}#pAz3vS9i@ zAaH8@OVJ7ER0Oi1FIfL6acs!{|KR-e<o#yHx@oHCI*qTYeKq<#yl&o><465Z>unZ% zd^dg_jGs2{n8|h;>+Jp}jq6%$rmM-T^g$ZyXFVO7-$ySF-k-?&`QkJGpOOC&vhj5O zr^MCuA~#W9udMukW?+@KouZcgFo^W!&lG*X)#HN0<*q0}7!L%101yBIKmZ5;0U!Vb bfB+Bx0zd!=00AHX1b_e#00KZ@@d*3`PyrC4 literal 0 HcmV?d00001 diff --git a/test/samples/tarballs/verticaltab.tar b/test/samples/tarballs/verticaltab.tar new file mode 100644 index 0000000000000000000000000000000000000000..8d1c604312061d23c4104c7fd21dc9819bb8000b GIT binary patch literal 10240 zcmeIyT}s3-5C`x)>m|H_Nt$%XgJ)UNbXbM1l{SjUcj6+2>_h2NaAE&>nYPn>{lerU zejkp**u~-S%CYB3?ccPtwry33(&{Klr%dA<5qYv+^2Ygw)N%i%T#ooT=Qzof(>UhK z?DAzTf8N`&xuxe#KY9C<#?y)4^GnB?sE<0NXeii*d&^O?C2O4FK84`rd{TJ0=?!6V zn*=h?d4As1W%JLaG^Diay8nAG>AL={bzb?+GhNZ)&g=ht{$D)hw-krR9J?zFSGtq~ zZsm?IQCb~;zt#7@Bct@nxVxn9{QP$@#2^rW00bZa0SG_<0uX=z1Rwwb2tWV=5P$## WAOHafKmY;|fB*y_009X6tH2MuC07^# literal 0 HcmV?d00001 diff --git a/test/test_recreate.sh b/test/test_recreate.sh new file mode 100644 index 0000000..e6d4b5a --- /dev/null +++ b/test/test_recreate.sh @@ -0,0 +1,53 @@ +. $(dirname $0)/helper.sh + +assertCanRecreate() { + local bundle="$1" + local name="${bundle%.bundle}" + + cd "$TMPDIR" + silent_run git clone "$SAMPLES/bundles/$bundle" "$name" + cd "$name" + silent_run git config user.name 'Test User' + silent_run git config user.email 't...@example.com' + + for tarball in $(git ls-tree origin/pristine-tar | sed -n -e 's/.*\t\(.*\)\.id$/\1/p') ; do + echo "checking if '${name}.tar' can be created from '${tarball}.delta'..." + assertSuccess pristine-tar checkout "$tarball" + assertHashEquals "$SAMPLES/tarballs/${name}.tar" "$tarball" + done +} + +test_recreate_with_simpleescapes() { + # check if a tar with \a \b \f \r \t and single backslash in filenames + # can be created from deltas produces with old versions: + assertCanRecreate simpleescapes.bundle +} + +test_recreate_with_newlines() { + # check if a tar with newlines in filenames can be created from old deltas: + # (note 1.46 cannot handle that file, so no delta for that version) + assertCanRecreate newlines.bundle +} + +test_recreate_with_unicode() { + # check if a tar with unicode in filenames can be recreated from old deltas: + # there are deltas created with LC_ALL=C and with LC_ALL=en_US.utf8, as + # the first causes octal escapes in the manifest while the later does not: + assertCanRecreate unicode.bundle +} + +test_recreate_with_verticaltab() { + # check if a tar with \v in filenames can be recreated from old deltas: + # no delta for jessie (p-t 1.33, tar_1.27.1) or stretch (p-t 1.38, tar 1.29) + # as neither can create a delta for that file. + assertCanRecreate verticaltab.bundle +} + +test_recreate_with_doublebackslash() { + # check if a file with double backslashes in filenames can be recreated. + # (in this test there is no a b f r t v or n after the double backslash + # as no old version could handle those). + assertCanRecreate doublebackslash.bundle +} + +. shunit2 diff --git a/test/test_roundtrip.sh b/test/test_roundtrip.sh index ab6c240..b026f53 100644 --- a/test/test_roundtrip.sh +++ b/test/test_roundtrip.sh @@ -59,4 +59,30 @@ test_escaping() { assertWorksWithTarball $SAMPLES/tarballs/systemd_239.orig.tar.gz } +test_roundtrip_simpleescapes() { + assertWorksWithTarball $SAMPLES/tarballs/simpleescapes.tar +} + +test_roundtrip_newlines() { + assertWorksWithTarball $SAMPLES/tarballs/newlines.tar +} + +test_roundtrip_unicode() { + assertWorksWithTarball $SAMPLES/tarballs/unicode.tar +} + +test_roundtrip_verticaltab() { + assertWorksWithTarball $SAMPLES/tarballs/verticaltab.tar +} + +test_roundtrip_doublebackslash() { + assertWorksWithTarball $SAMPLES/tarballs/doublebackslash.tar +} + +test_roundtrip_complexbackslash() { + # a filename with backslash followed by a b. + # Older versions unescaped the \b in \\b: + assertWorksWithTarball $SAMPLES/tarballs/actualbackslash.tar +} + . shunit2 -- 2.20.1
>From e6f008f0d5cfe43314a9fe2a2a2dcf9fe442631f Mon Sep 17 00:00:00 2001 From: "Bernhard R. Link" <brl...@debian.org> Date: Sun, 31 Mar 2019 01:32:59 +0100 Subject: [PATCH 5/6] add compatibility for files with 1.46 version 1.46 changed the format of the manifest file to contain unescaped filenames (with the incomplete unquote implementation it had). To still be able to checkout tarballs from delta files created with 1.46, add another variant to try that assumes the filenames in the manifest file are already unquoted with that old implementation, so that the tarball is created with the same wrong filenames included so that the binary delta can be applied. --- pristine-tar | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/pristine-tar b/pristine-tar index 1c6e02e..13b5d1f 100755 --- a/pristine-tar +++ b/pristine-tar @@ -359,6 +359,21 @@ Options: "; } +sub old_unquote_filename { + my $filename = shift; + + $filename =~ s/\\a/\a/g; + $filename =~ s/\\b/\b/g; + $filename =~ s/\\f/\f/g; + $filename =~ s/\\n/\n/g; + $filename =~ s/\\r/\r/g; + $filename =~ s/\\t/\t/g; + $filename =~ s/\\v/\x11/g; # sic! + $filename =~ s/\\\\/\\/g; + + return $filename; +} + sub unquote_filename { my $filename = shift; @@ -400,11 +415,22 @@ sub recreatetarball { while (<IN>) { chomp; push @manifest, $_; - print OUT unquote_filename($_) . pack("C", 0); + if (defined $options{v1_46_compat}) { + # 1.46 wrote a manifest with some escapes removed: + print OUT $_ . pack("C", 0); + } else { + print OUT unquote_filename($_) . pack("C", 0); + } } close IN; close OUT; + my $unquote_filename = \&unquote_filename; + if (defined $options{v1_46_compat}) { + # but for processing, they are unquoted a second time: + $unquote_filename = \&old_unquote_filename; + } + # The manifest and source should have the same filenames, # but the manifest probably has all the files under a common # subdirectory. Check if it does. @@ -444,7 +470,7 @@ sub recreatetarball { # in the tarball, since it can easily vary. my $full_sweep = 0; foreach my $file (@manifest) { - my $unquoted_file = unquote_filename($file); + my $unquoted_file = $unquote_filename->($file); if (-l "$tempdir/workdir/$unquoted_file") { # Can't set timestamp of a symlink, so @@ -478,7 +504,7 @@ sub recreatetarball { # Set file times only after modifying of the directory content is # done. foreach my $file (@manifest) { - my $unquoted_file = unquote_filename($file); + my $unquoted_file = $unquote_filename->($file); if (-e "$tempdir/workdir/$unquoted_file") { utime(0, 0, "$tempdir/workdir/$unquoted_file") || die "utime: $file: $!"; } @@ -612,6 +638,14 @@ sub gentar { ); }; push @try, \&recreatetarball_longlink_100; + push @try, sub { + recreatetarball( + $delta->{manifest}, getcwd, + clobber_source => 0, + v1_46_compat => 1, + %opts + ); + }; push @try, sub { recreatetarball( $delta->{manifest}, getcwd, -- 2.20.1
>From 2898c28199170f47ae2ddc74e52dfbf78a0bf174 Mon Sep 17 00:00:00 2001 From: "Bernhard R. Link" <brl...@debian.org> Date: Fri, 29 Mar 2019 23:03:01 +0100 Subject: [PATCH 6/6] release nmu --- debian/changelog | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/debian/changelog b/debian/changelog index acac066..5abfe10 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,13 @@ +pristine-tar (1.46+nmu1) unstable; urgency=medium + + * Non-maintainer upload. + * no longer write unescaped filenames into the manifest + (reverthing the previous fix of #902115) + * create a unescaped and NUL-terminated copy of the manifest file + to be given to tar using --null (Closes: #902115, #901952) + + -- Bernhard R. Link <brl...@debian.org> Sun, 31 Mar 2019 03:05:14 +0200 + pristine-tar (1.46) unstable; urgency=medium * refresh packaging (debhelper 12, std-ver 4.3.0) -- 2.20.1