From e22f9e26ec9c260037b4892e37c776092673442e Mon Sep 17 00:00:00 2001 From: Gary Coady Date: Fri, 17 Jan 2025 08:40:10 +0100 Subject: [PATCH] Look for first matching file which is a _file_ in zip archive. It is possible that the requested path in the zip can be found as a file, in addition to directory/symlink. The outcome if we don't filter by file type is confusing for the user, as the install can appear to succeed, but the result is an empty file. --- Changes.md | 3 +++ precious.toml | 14 ++++++++++++-- ubi/src/installer.rs | 14 +++++++++++--- ubi/test-data/no-shared-root.tar.gz | Bin 185 -> 206 bytes ubi/test-data/project | 1 + ubi/test-data/project-with-one-file.tar.gz | Bin 143 -> 155 bytes ubi/test-data/project.AppImage | 1 + ubi/test-data/project.bz | Bin 14 -> 39 bytes ubi/test-data/project.bz2 | Bin 14 -> 39 bytes ubi/test-data/project.exe | 1 + ubi/test-data/project.gz | Bin 28 -> 23 bytes ubi/test-data/project.pyz | Bin 196 -> 215 bytes ubi/test-data/project.tar | Bin 10240 -> 10240 bytes ubi/test-data/project.tar.bz | Bin 189 -> 191 bytes ubi/test-data/project.tar.bz2 | Bin 189 -> 191 bytes ubi/test-data/project.tar.gz | Bin 166 -> 181 bytes ubi/test-data/project.tar.xz | Bin 216 -> 220 bytes ubi/test-data/project.xz | Bin 32 -> 60 bytes ubi/test-data/project.zip | Bin 484 -> 487 bytes 19 files changed, 29 insertions(+), 5 deletions(-) diff --git a/Changes.md b/Changes.md index 7145a34..c44b8fd 100644 --- a/Changes.md +++ b/Changes.md @@ -1,5 +1,8 @@ ## $NEXT +- Fixed a bug where `ubi` where zip files containing a directory that matched the expected + executable name caused `ubi` to extract the directory instead of the actual executable, resulting + in a 0-length file. Based on a PR #89 from @fiadliel (Gary Coady). - Added a new `UbiBuilder::rename_exe_to` method, along with a `--rename-exe-to` CLI flag. When this is set, the installed executable will use the name given here, instead of the name that it has in the downloaded file. This is useful for projects that do releases where the executable name diff --git a/precious.toml b/precious.toml index ccdf029..868e32c 100644 --- a/precious.toml +++ b/precious.toml @@ -1,4 +1,15 @@ -exclude = ["target"] +exclude = [ + "target", + "**/*.AppImage", + "**/*.bz", + "**/*.bz2", + "**/*.exe", + "**/*.gz", + "**/*.pyz", + "**/*.tar", + "**/*.tar.*", + "**/*.xz", +] [commands.clippy] type = "lint" @@ -97,7 +108,6 @@ labels = ["default", "fast-tidy"] [commands.typos] type = "lint" include = "**/*" -exclude = "**/*.tar.gz" cmd = "typos" invoke = "once" ok-exit-codes = 0 diff --git a/ubi/src/installer.rs b/ubi/src/installer.rs index 03f3f4c..e17c442 100644 --- a/ubi/src/installer.rs +++ b/ubi/src/installer.rs @@ -120,7 +120,7 @@ impl ExeInstaller { for i in 0..zip.len() { let mut zf = zip.by_index(i)?; let path = PathBuf::from(zf.name()); - if path.ends_with(&self.exe) { + if zf.is_file() && path.ends_with(&self.exe) { let mut buffer: Vec = Vec::with_capacity(usize::try_from(zf.size())?); zf.read_to_end(&mut buffer)?; self.create_install_dir()?; @@ -442,10 +442,18 @@ mod tests { archive_path: PathBuf::from(archive_path), })?; - assert!(install_path.exists()); assert!(install_path.is_file()); + // Testing the installed file's length is a shortcut to make sure we install the file we + // expected to install. + let meta = install_path.metadata()?; + let expect_len = if install_path.extension().unwrap_or_default() == "pyz" { + fs::metadata(archive_path)?.len() + } else { + 3 + }; + assert_eq!(meta.len(), expect_len); #[cfg(target_family = "unix")] - assert!(install_path.metadata()?.permissions().mode() & 0o111 != 0); + assert!(meta.permissions().mode() & 0o111 != 0); } Ok(()) diff --git a/ubi/test-data/no-shared-root.tar.gz b/ubi/test-data/no-shared-root.tar.gz index 879dba6b8ca7451f737d32de7178854c54dabd66..6fd5dba8d6629fe86f6c6fb9e490e5884c8ff6fe 100644 GIT binary patch literal 206 zcmV;<05Sg`iwFR&D2!(S1MSpJ3c@fDhT$9~Cuk>0o2~_2y730J7F6&DZNcN)B1%Pz zx`;)5pUo^Xkby6gC|1EqBg@jZnkB%aPU$rKXiC+`DnDqg^17+T zvbXQm`Hza?`Dz>Z4SbZpl{SBGE%|@LCI9_lw=Rn+&>d~S-X{l>%L`D^1u5~U^3 zJa_&)|MFB0Jpu+4#k0w1Je@?FMX)>i_W$|+-}D*ltYiNH0000000000004N`8F=-! I-2f;60H3^Kxc~qF literal 185 zcmb2|=3oE==C_x8xegf!I6SoU^1Glm*({d3?By}(D_Sca@NeC_UsLIY)0S?IN59QB zpKxH(kJLMPbH%Dtg}YX5>Hq8(6ZkVB^s&h6IlOT`Gyi2O9bTGmmApjqQO-u+ozkP43?@H#8aWY)EKm7HP8!qoFKYjl@{cFy? j6`K!R-ITrj>$vUmINQIB5ch#eyF%7ySB<(DG#D5F>FijT diff --git a/ubi/test-data/project b/ubi/test-data/project index e69de29..f8e020b 100644 --- a/ubi/test-data/project +++ b/ubi/test-data/project @@ -0,0 +1 @@ +exe \ No newline at end of file diff --git a/ubi/test-data/project-with-one-file.tar.gz b/ubi/test-data/project-with-one-file.tar.gz index 4ebeb2dba7422bb7961b8e3ca8bfcfbfdd1ecbc0..65a511e31608f19b0f065d3ed77420d63abfd7f4 100644 GIT binary patch literal 155 zcmb2|=3scO(UZ=={Pv!dtT|p(IKs>_TZzhSX%>&qlC+!{l2=( z61i4oF16aOp}ICxb!V+z=TV_e+=i+8=gvG;n)NDNcxHaE`6@4S{hRao-rw8%f5o!B zebYZ*@E83b!G6wi-<$Qb7ySNvb&tQ=E3L9ye}4WuT>GPpl>r&ZS1~xRzTd;3!N33j DrrbjS literal 143 zcmb2|=3oE==C>Cextbk#S|7@!`Yn(=tMXh>b4s38*!%d{EhWKS-H{&u^FNDms(hFg zw(7F4%S~hVi|1=5=3LzUEo_hQ*+^TJslV2DuIW#m5j-jJZqc5)yT48CS1z0T?DtzE oJ<i6e=j1Ws9Y%CIzaj8qGbbZ%yv%)r3V*uccV;Gn>u$k5aids5_~lOrDwmk$8OqzTpl literal 14 TcmZ>Y%CHnKaY%CIzaj8qGbbZ%yv%)r3V*uccV;Gn>u$k5aids5_~lOrDwmk$8OqzTpl literal 14 TcmZ>Y%CHnKa`7-}_Fn73%J5-ZayByq0|Nj;W(AG_ literal 28 ccmb2|=HReg8=u0!Tu_vsm6}|_z{~&x0A=n4VE_OC diff --git a/ubi/test-data/project.pyz b/ubi/test-data/project.pyz index 0874936116f518c41d96b63b72c1c13a791183b4..afa70be82a14d645578ab6996043201d3933c5ea 100644 GIT binary patch literal 215 zcmWIWW@Zs#U|`^2;Al3Ax-dE1M;pk~2V!mp8HV`y+{Dbh_;|g7%Fqx_24(@Ro^%i{ zt>9*0WO>2NzyKz^J$-{u_?|g)`NEb*K@3ezi_Yv3;#KXxGG|VWZ0n~#i{^;9s`~2b zbx7$k1b8zt$uZ-yQ37Z$0|O%vFKGm^Q0!-g*pFs+fHx}}NGT%_1_J2<5QhN(T4*vR literal 196 zcmWIWW@Zs#00F0Xt*FcYFTU~tvO$;|h~wjP6EpMT|g27}%#+1p7jQ^QaD^fQbvi?;B E0EKW4J^%m! delta 39 vcmZn&Xb9L)!!of(l*inV!NAbO%-n!M!CW6ESk#{ZiY*d8cOR8Rl_<#!8F diff --git a/ubi/test-data/project.tar.bz b/ubi/test-data/project.tar.bz index 2278c4f9751619c8429e6c27eb14fc329f3e53e5..30feb3d0a5297cd118d9e244ac6aaec758c5a9a0 100644 GIT binary patch literal 191 zcmV;w06_mjT4*^jL0KkKS@eha$^Za#|AfJS0ti3>|9}7p5deB|-ar5Z00=MuxuJ$e z1k(a!F*IN@Nt%Gr0iXZ~sDPMUVXSfxg0`1T9rf*WVGh7-JhavSv6i zL?Xe9s}{92=EEj=;yeU9QkS7%^otS77eF#9CC{Dlf*8*1A|Zqns?a0=JE$;WDJtNY r$dDY6gGPp9@HGtwLtxmnCL1C2D%=%fHDoxVAI02}P81|0cV-TNDx67B diff --git a/ubi/test-data/project.tar.bz2 b/ubi/test-data/project.tar.bz2 index 2278c4f9751619c8429e6c27eb14fc329f3e53e5..30feb3d0a5297cd118d9e244ac6aaec758c5a9a0 100644 GIT binary patch literal 191 zcmV;w06_mjT4*^jL0KkKS@eha$^Za#|AfJS0ti3>|9}7p5deB|-ar5Z00=MuxuJ$e z1k(a!F*IN@Nt%Gr0iXZ~sDPMUVXSfxg0`1T9rf*WVGh7-JhavSv6i zL?Xe9s}{92=EEj=;yeU9QkS7%^otS77eF#9CC{Dlf*8*1A|Zqns?a0=JE$;WDJtNY r$dDY6gGPp9@HGtwLtxmnCL1C2D%=%fHDoxVAI02}P81|0cV-TNDx67B diff --git a/ubi/test-data/project.tar.gz b/ubi/test-data/project.tar.gz index 8eec8b888e60f0bc2c2e736c83d702e2f59a49a7..917cda0e0471f08757fdfe3de38b8e4bfeb3f3aa 100644 GIT binary patch literal 181 zcmb2|=3uy|(UZ=={Pyxgt|kMKwuiB&);XA;f41(p%Zj>?8BWvh^B8w4Dd{fy{DAQbdyu1C+ zD>V53*?$o)_|Lr3H~aqmUevGuhqC|Qu6k&F?0{ygl@#akkO$maj8tcSP-LawOGsfrcHCR%!m&_GgAgPdA|V(b5f^ z>2Ih26-t2Tnct@{JT@I0u90OeIe!W1VyI$l2BA7N`S=`1Ap54>j2GD5)>FUI@ma~q;O!VAoVEeE13{4kZvYmh=`8>N001EX>?bH<*UU`k b00FfDfKUJcAm`ULvBYQl0ssI200dcDNU2N# delta 169 zcmV;a09OCp0oVbM908Y+9Up&@f2|B)7zwDiTfs|2!ZVfP$^Y)ez_d5SE;hyI3`=qAobzgeF83B$y9!FbpQah7OWkm%ADM200FZB XfKUJcJp_*9vBYQl0ssI200dcDIQvW& diff --git a/ubi/test-data/project.xz b/ubi/test-data/project.xz index ea28d9e05f69d458ccfaf4aa985d30d366bfbc25..838d242bd488c42a15960ab01f3aa8d7855a8b85 100644 GIT binary patch literal 60 zcmexsUKJ6=z`*kC+7>q^21Q0O1_p)_{ill=8JJQlQW+Qm6yrLVo)JIBz$nekt-n)1 Pe%t3-MxYu7mdGdo8@v#T literal 32 kcmexsUKJ6=z`*kC+7>qkAdtE5qA0)Zb1fr?!x9+<0JCTbcmMzZ diff --git a/ubi/test-data/project.zip b/ubi/test-data/project.zip index c91340c1ed69ea2be476a21fefeac35e75c8fc6a..fdfa396b172f55a2b5b96c38062c7c0d32c222dc 100644 GIT binary patch literal 487 zcmWIWW@h1H0D)tTMp0k}l;B{HVJIld&q_@$(GLybWMJN+-jlu^h)XND85mh!Ff%ZK zi2%3>ThUD5K{6pJGY?|QRGPG>Fzm6a#!k?@Vf1(+PY#OF7kxg?#G7aKqpot(q<1rD_#}E@4 kfo5%K>_9US?th@cSo|K~&B_MU0Sr23hMz$C28hD|04P3T9smFU literal 484 zcmWIWW@h1H0D%X)*M@-^P=bR&hM}M+KPxr4L_aiylY!ZIZG6h+%|U6U72FJrEH9WD z7{EjT+=RzyCh#Dckd&DRF~yQpQ-sk>fw~FoB#>bN HAPxfnS&U!y