From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 18B6D1FF187 for ; Mon, 8 Sep 2025 17:04:44 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id BA7CB1570E; Mon, 8 Sep 2025 17:04:46 +0200 (CEST) From: Filip Schauer To: pve-devel@lists.proxmox.com Date: Mon, 8 Sep 2025 17:02:06 +0200 Message-ID: <20250908150224.155373-4-f.schauer@proxmox.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250908150224.155373-1-f.schauer@proxmox.com> References: <20250908150224.155373-1-f.schauer@proxmox.com> MIME-Version: 1.0 X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1757343829441 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.139 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment KAM_LOTSOFHASH 0.25 Emails with lots of hash-like gibberish RCVD_IN_VALIDITY_CERTIFIED_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_RPBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_SAFE_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pve-devel] [PATCH proxmox v4 03/15] proxmox-oci: add tests for whiteout handling X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox VE development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" Test extracting OCI images with whiteout special cases. Test cases inspired by: https://github.com/containerd/containerd/blob/4312e076a8a3/pkg/archive/tar_test.go Signed-off-by: Filip Schauer --- Introduced in v4 proxmox-oci/Cargo.toml | 3 + proxmox-oci/tests/extract_whiteouts.rs | 92 ++++++++++++++++++ .../oci_test_whiteout_current_directory.tar | Bin 0 -> 8704 bytes .../oci_test_whiteout_dead_symlink_parent.tar | Bin 0 -> 8704 bytes .../oci_test_whiteout_root_breakout.tar | Bin 0 -> 7168 bytes ...oci_test_whiteout_root_parent_breakout.tar | Bin 0 -> 7168 bytes .../oci_test_whiteout_symlink.tar | Bin 0 -> 8704 bytes 7 files changed, 95 insertions(+) create mode 100644 proxmox-oci/tests/extract_whiteouts.rs create mode 100644 proxmox-oci/tests/oci_image_data/oci_test_whiteout_current_directory.tar create mode 100644 proxmox-oci/tests/oci_image_data/oci_test_whiteout_dead_symlink_parent.tar create mode 100644 proxmox-oci/tests/oci_image_data/oci_test_whiteout_root_breakout.tar create mode 100644 proxmox-oci/tests/oci_image_data/oci_test_whiteout_root_parent_breakout.tar create mode 100644 proxmox-oci/tests/oci_image_data/oci_test_whiteout_symlink.tar diff --git a/proxmox-oci/Cargo.toml b/proxmox-oci/Cargo.toml index 4daff6ab..b162bf4f 100644 --- a/proxmox-oci/Cargo.toml +++ b/proxmox-oci/Cargo.toml @@ -20,3 +20,6 @@ thiserror = "1" zstd.workspace = true proxmox-io.workspace = true + +[dev-dependencies] +proxmox-sys.workspace = true diff --git a/proxmox-oci/tests/extract_whiteouts.rs b/proxmox-oci/tests/extract_whiteouts.rs new file mode 100644 index 00000000..71ec4dea --- /dev/null +++ b/proxmox-oci/tests/extract_whiteouts.rs @@ -0,0 +1,92 @@ +use std::fs::remove_dir_all; + +use proxmox_oci::{parse_and_extract_image, Arch}; +use proxmox_sys::fs::make_tmp_dir; + +#[test] +fn test_whiteout_root_breakout() { + let extract_dir = make_tmp_dir("/tmp/", None).unwrap(); + + parse_and_extract_image( + &"tests/oci_image_data/oci_test_whiteout_root_breakout.tar".into(), + &extract_dir, + Some(&Arch::Amd64), + ) + .unwrap(); + + // Check that the whiteout did not remove the root directory + assert!(extract_dir.exists()); + + // Cleanup + remove_dir_all(extract_dir).unwrap(); +} + +#[test] +fn test_whiteout_root_parent_breakout() { + let extract_dir = make_tmp_dir("/tmp/", None).unwrap(); + + parse_and_extract_image( + &"tests/oci_image_data/oci_test_whiteout_root_parent_breakout.tar".into(), + &extract_dir, + Some(&Arch::Amd64), + ) + .unwrap(); + + // Check that the whiteout did not remove the root directory + assert!(extract_dir.exists()); + + // Cleanup + remove_dir_all(extract_dir).unwrap(); +} + +#[test] +fn test_whiteout_current_directory() { + let extract_dir = make_tmp_dir("/tmp/", None).unwrap(); + + parse_and_extract_image( + &"tests/oci_image_data/oci_test_whiteout_current_directory.tar".into(), + &extract_dir, + Some(&Arch::Amd64), + ) + .unwrap(); + + assert!(!extract_dir.join("etc").exists()); + + // Cleanup + remove_dir_all(extract_dir).unwrap(); +} + +#[test] +fn test_whiteout_symlink() { + let extract_dir = make_tmp_dir("/tmp/", None).unwrap(); + + parse_and_extract_image( + &"tests/oci_image_data/oci_test_whiteout_symlink.tar".into(), + &extract_dir, + Some(&Arch::Amd64), + ) + .unwrap(); + + assert!(extract_dir.join("etc/passwd").exists()); + assert!(!extract_dir.join("localetc").exists()); + + // Cleanup + remove_dir_all(extract_dir).unwrap(); +} + +#[test] +fn test_whiteout_dead_symlink_parent() { + let extract_dir = make_tmp_dir("/tmp/", None).unwrap(); + + parse_and_extract_image( + &"tests/oci_image_data/oci_test_whiteout_dead_symlink_parent.tar".into(), + &extract_dir, + Some(&Arch::Amd64), + ) + .unwrap(); + + assert!(extract_dir.join("etc/passwd").exists()); + + // Cleanup + remove_dir_all(extract_dir).unwrap(); +} diff --git a/proxmox-oci/tests/oci_image_data/oci_test_whiteout_current_directory.tar b/proxmox-oci/tests/oci_image_data/oci_test_whiteout_current_directory.tar new file mode 100644 index 0000000000000000000000000000000000000000..56b34cfd774b74b8410839bb48333a38409b70d9 GIT binary patch literal 8704 zcmeHLO^6&t6mB*q#3g!342vKc1`LtSPO9p4Rdp|tlb4`}#RLxti(9`lz0A)tGaIrA zYd}yC&DoGcSn(o)H&34Q5IiafdhsfF^&%b&@m0@cC$r;j;?B&%V%MR6URS+(^Z7*(IeFrpN z=kf2<6ysuA+aUPmzr~*dDdK-1J76gOh7zk%sbfF{aw3>ad7PwPLP`@Qq@!SgE5ekv z95|;$0+&h%pK!~q-o@e&|M&@Lgm-L@p+XqY?dM$1Cv#>V6>_6&*t=lDPK@$utd z-219Fb3_3M3OoUoKuTCDXyUnZi2}*EW&&G^`@j=rg-nEuDL9kr*gC^}0ua5qaOvk? z=70F{C$semiDuyBN%F#TzsGkQwbhl?dc9WHCr-(jaPF4K%GQx{3zbXfXBIzr`TiS! z{(5fi=;te^PPC)w{`@zuM#qLiRJ=^j14H=Nf+4Dj2PzE}OgP|H#lW>pxC8?>rkW^W zK&3(%%?T5!L1-KB+6mY<{>6X``uLX=3j9wm>I2OI|7X7p_}8GBN?FRZrHNoj?x`lR zaUMj>ElG*dNcSKGc;cAQQgDt}#vzf;Tc6{-ej3dV>@J=r`-u=ffw{cB<=a zkTR?Z7f7aAUpsb@S7XnCn6-U9N0aULK~iO0r_yWzk+|2=BqcewE^MSY{x3bJ#G(F_t!x= z04$P?!A1e4rxVQ2xuw4O`X@yisd2^3}#izmpg$D``6dpL# G9{2}Zftk|) literal 0 HcmV?d00001 diff --git a/proxmox-oci/tests/oci_image_data/oci_test_whiteout_dead_symlink_parent.tar b/proxmox-oci/tests/oci_image_data/oci_test_whiteout_dead_symlink_parent.tar new file mode 100644 index 0000000000000000000000000000000000000000..b1b5094689402cce0433174f79c4595c10dae392 GIT binary patch literal 8704 zcmeHLU5Hdw93K=H8)k*T@*$~h?Bl_9JfHX6yDu7)U}~C5LLuw<+`YOpv(DTVM_baO zAYADo>Y-?%5A&&njE$_fC=7)xq8@w*q`)2`33^Df?SJo#wzKQBqq8eW_dMLW_dn<3 zcmC)6e&>JwYN)KLt1|Oi5EPD3CjNyo{dcOZ{*Dn5B-6v^6;-42k!mC>0IAclV&qV+ zPOj7bZc=-dtbcV-67J2{Hi-Rled~`YO4t9U?0}~AR}9ukVro2PJ>_}MNyM#2fwDeB z#Bt(dC#AHOAdh=SaxN&>0aWz_30w=r@%pnV)QG>KT%igk6kmC-+X=xQtbfOxY=NiA z{6FXafoxAtzN!apQ9fxa)v#R3_w|s6Vr$WwP;RRYTd?Hi@bFNmWds#g?Jb!?S%-zN zCNx`fV z#%e#XlpA5K@QAXKDWxUkwGB1yoBQY^t3PdwZo&yG?KC`S|EL$U^b z0OQjM@H+hVCy+D;`~^5wRu1eBhZ{p(YZjg&fKvya(@X$DBb*b+X(N@4>Eswuz&hbH zwH#qfg+)GPK2yeUYuvwGH|BvENkAtv>1nurez03(F)$yP>LeG+cvx{PsHKi6t&ugv zC*X2VBdwiKm=i%2p^SQ#IAwyF*r}*vhv$y$Xts%@>BoF|ph^EbrBw@%v8ext{v+5p z)AgTwBGvyE?wnI|qW`j@2gAtfXrxjX`=asc8kyG>DRt?oEp9^SI_!4=us`janQ{N?4XTMr_$WX~J>#+Utea^lXh z=a-$SWmg=3=KQJ4dsg2bOy2v`XCHm|=ecu#UB=Jmf4@7o>+kdLp4k55YnL9luW)G7 zAFH4E`IE`h6NfKNzPjbHFSFwp-&&u^&FRF_&f4-o6aPC6>ROCAJO5|g{}^K_|690o zPR%j@FTDPK%zrrPcb7+^{s`_`{oCV!0KOiv(rm32;Q-&gSypT*N+ja+SDPL`v#xjD z_dl%s`s~7Qb1c)fW~WmN-aC|ev+G3n#_kPAj&vW{ICkj#i)+_*xm>m@7iErqasNw? zt~s{(^H)xd-?iwSolD1_dw5Ca)NP+G&veb{oYKzP_dr-Oc3&aBx3}NsdTY+cf6Axv zA7d<1{$H<~Z>W9}|F_8hG!i>Eo(#EWYN!$5Ps`|ZntGfP*Vl785Ys1-`6xWod_v2; z0eQS$xO;)px2)3fAG7fv(P{BN#&Fk6&;O1c-$n-q@<|qVL$U>~W`Og!fC?x-+C~Ry RmDB^N2T~8D9=Ihv@DEuzwG;pV literal 0 HcmV?d00001 diff --git a/proxmox-oci/tests/oci_image_data/oci_test_whiteout_root_breakout.tar b/proxmox-oci/tests/oci_image_data/oci_test_whiteout_root_breakout.tar new file mode 100644 index 0000000000000000000000000000000000000000..36e25851148064fdc39d0fee90bdd5762e187989 GIT binary patch literal 7168 zcmeHL%ZeLE6m35+X2`5;jCT=D7J)BPMW!8aU7_vwhl6sDMkko_JV>}+TF=Uf? zX^1fd@&oya{6Gx;iF`tqxm8j|mNN2;qmc=5*P_*Zse9`_>eRU<)343=LAKF>U~q)8 z_zPqC_f6UK9U~%0*5MoVYG(X++~^UwwC-Bba~NmAt!wW+>6=vlaZeLoZfYCEyu4fe zF-2|t-^&hIsK0ewIa~(kC^gD)jhPqHV?|sUj0s-DgHVd8@|H{M5n&2Di<~x$yK;rc zvHt80XvA+Ae?tWc%Fo`DoRE^ztg|*ISNO9a{=o5ny4C6AW83os{goe$t9qDsJLIz{ z9e7viy^|vkl3X7h^((6znDF4y&=s|VEawlC$L`N+2{r&P~taz)U8mC-B_gnrtm> z^z%O!@xP`+=P!}4{Wkm)!j|zbIBM~~BAr(%{`kk+x4(b+Yw!9E&kz<$Ifton0TFHq z6h=FQgAiJ1!%JIg*npCIg(TB)<5DAm2pEwDXRmjDfA!k_vWv3o^v)f$ee)0YV$eJM z?y%qQ_030j#myh?<4^CSSJ$53`{|Q=*M9zd`^)@vc=y@UhiL1T%Cf!R{@l)PU1@l& zu?sS=fd6%m)fH<+vVR-?sVJB64^2jk{}t)HQgPycJ+i&3@wPc0P04=XN;c#1k=KoP zk$VZ83A;${626CV7pX4d1uaWL;h11wPp9{)aZ`^@B7N>BI;|s>=KX4T{CGNJRM$<2 z!dYX`qy{6O(Qed9R2jmzm4j(h7LHV%t|(n5EM?Af?X^^f2%)&P*a72vhdB<$y5KR) z2o4KgBBr>Y5(zl0IEB+IPYdkBb8Cl<DPxWV{?;TH2kNn(FH6>iWK_$p>X#-R&%OAQ&8> zPQ1c6ef>~2xyOh|(pl$A^=fK-zpBj`Txz;j^c=?V=9=33Li6)<{#D-)E|!%BF)p8X z{+Ocn{J%&B%$&bRURY+OVT36{xz@(B;JGANGR+ZIG&fdR61byMGR3^l9aYo@NFQqE zcpT54eE^O44C6gi5S8NiKFJA*m-WV&oa4`o_#4On%eD3Ot{K~YQF~kOkA1fX&qF6z z_fC9e$KKT5MJYjqZz8ox_(P0)NcRxWs1Sq_!r0@9dcUaZa(n>lPqxzhvWim&#c2Qe zL}Of*b%?^aGAvLZ?7^DdfjRKwDye|b6(Kw=9H>1>S|FNGR8K%^Qj9E;!C1f^Cp zs&nhDM<`&;92F2s=Q!t-IW3G*7;7WAl))KE16E>A1S8nb!oQ^aWBk(=|8v55q2h%9 z%J%)xJOTg~CJp19l2wL0JeWXsn#nNWf19flzKVWr%Z) zCD)vq96KJMN}rgX?gKNOoIZsAt;OhV2LDYRnvc8)gw{^#h(zPXJ$EA-kmbanM#_Uo{}yS+OY^auHs>vHu^x&0H`esk&8 zW_JJ1O7GQ;-+%n??X4fa`(yk1m2s!@%WtdqI^SRD{#s*aN1zxv|2&JleYRecx98!X zay(oAF^2Dr7XM9RzUbVu>i@K`$7cQi6~j-q2C3_J#i@$kwDtU`7BVS6w-zoMv#&`H z`nXN#S<3x-dAm9f|A?OY{>K=;HCy~I??g^4zwD+i{y|EC<1c_N&QONBhbMaNT^oTm N0&N7^2z*@;cn3S&@<;#x literal 0 HcmV?d00001 diff --git a/proxmox-oci/tests/oci_image_data/oci_test_whiteout_symlink.tar b/proxmox-oci/tests/oci_image_data/oci_test_whiteout_symlink.tar new file mode 100644 index 0000000000000000000000000000000000000000..7e6835cab889566cdf1d8dc1a42b69642b9d0463 GIT binary patch literal 8704 zcmeHL-D_M$6u(Kdl$bo!hEVjuuoMlZ+0OUeSrC0Fg`j95ML`M8d}eRDA8~h6l9oV0 z{D3?Og28|WKVF0iz6t&VN?QyFeG)_p;;RUKlGd5K+nSBtW|K_{#XApo?>&3Y%$YOu z`^}l7N>x=q869W?zEJ?8@ax<5->tIdI|PWMXpA1HSFO$$>kV1+F7-NA@Z7h1lk2s= zhh(qP^{*EtqU@lyL5R!l)*oV!t^Y&W0d4EAq*e@AV2ISxafCP!MiL+ew}v2zfmFc8 zmRT875JP7PHc&IHsWMWU4jzZ~CtIKqzJ0q36^Jmr``(lz#4wM>dd6f2f7-$X-;s+C+}44nwlvNef3yS!k%BqtXZN{N;YuW<50#pJ6x$tPtwXY*xQ zNt~@W@)zL5eBIlp#=2T@$(*+g19ab6)2yv4Z)}n|KR|G!NmK>R9T6I92_Wh*5vX6rozLh%O zbiexvq~_lLygyYY<}M}+t)cEWi`WSvIOA3d<6#DcWJDN?Bw@tH0>uhqOtdrrN+hHM zkj26xU~vqv=IGz9Tl0W8PMuC?GS&+H!T64ViMg{%OR1cSjmE}uj$v$L=vRUPg#^rde3L~MNCW^%I7T!s7 z-h%a7ELMQ|Kc!?wX-~aA*P%ef2KfVpSVlQyRzM4lLR@j@6CbT(M|`4$bE(HO{<-of zvQ``Zdp(dk?983;k09EHf5;)s@ZTYv`zn5B_3+`%>)#an2b8Sa=;g_&8*>{FME%nP z1E73)O3U^2^))cQhBo^?8vXeAXy27D-+S)E7x<}{o(H#|cye|1>U8nxJI^lN{B?-l z9v&XPe(l)E(CM3>{eJnz+b<3t;y?WO+N;<4M*H9S`fpAMSE(u!{4>ey%7=u|24f__J{ZRaGi;Mp7?3=YJl_92->LDlD`QKG=dsIsE{|@z^R$*uF#gO}!hFS^!wu(-# zrN=FKeY2*+SXNKyVsH35-lV^Kd8Y3|d5W`yE40!ORKoA hq+8%#1vm%uAP;gYyXq=a&LWUSAd5g2fk!9;{{UmyntT8N literal 0 HcmV?d00001 -- 2.47.2 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel