From 96e4d568195602afde3486c2d9de890a383a1c4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Anic=CC=81?= Date: Sun, 25 Feb 2024 10:35:18 +0100 Subject: [PATCH] std.tar add case sensitive file name test Like in issue #18089, this tar contains, same file name in two case sensitive name version. Unpack should fail on case insensitive file systems and succeed on case sensitive. $ tar tvf 18089.tar 18089/ 18089/alacritty/ 18089/alacritty/darkermatrix.yml 18089/alacritty/Darkermatrix.yml --- lib/std/tar/test.zig | 26 ++++++++++++++++++++++++++ lib/std/tar/testdata/18089.tar | Bin 0 -> 10240 bytes 2 files changed, 26 insertions(+) create mode 100644 lib/std/tar/testdata/18089.tar diff --git a/lib/std/tar/test.zig b/lib/std/tar/test.zig index a1d6acfc4b..912d0c3542 100644 --- a/lib/std/tar/test.zig +++ b/lib/std/tar/test.zig @@ -426,3 +426,29 @@ test "tar should not overwrite existing file" { try tar.pipeToFileSystem(root2.dir, fsb.reader(), .{ .mode_mode = .ignore, .strip_components = 0 }); } +test "tar case sensitivity" { + // Mimicking issue #18089, this tar contains, same file name in two case + // sensitive name version. Should fail on case insensitive file systems. + // + // $ tar tvf 18089.tar + // 18089/ + // 18089/alacritty/ + // 18089/alacritty/darkermatrix.yml + // 18089/alacritty/Darkermatrix.yml + // + const data = @embedFile("testdata/18089.tar"); + var fsb = std.io.fixedBufferStream(data); + + var root = std.testing.tmpDir(.{}); + defer root.cleanup(); + + tar.pipeToFileSystem(root.dir, fsb.reader(), .{ .mode_mode = .ignore, .strip_components = 1 }) catch |err| { + // on case insensitive fs we fail on overwrite existing file + try testing.expectEqual(error.PathAlreadyExists, err); + return; + }; + + // on case sensitive os both files are created + try testing.expect((try root.dir.statFile("alacritty/darkermatrix.yml")).kind == .file); + try testing.expect((try root.dir.statFile("alacritty/Darkermatrix.yml")).kind == .file); +} diff --git a/lib/std/tar/testdata/18089.tar b/lib/std/tar/testdata/18089.tar new file mode 100644 index 0000000000000000000000000000000000000000..c58b3eaea209b7a2e6b530f86d080bff3c68b89e GIT binary patch literal 10240 zcmeIyJr2S!42Izxr6&Np)CufdBm#ztpCJ?pZclazy8+YyE#eseO7oYxfOE3Ay zOrR7ALJ9co{3mtJzc%sY|BbnM&VL!xdX=`ZOYL!V+HO8^hmybd&Evbj{Rc{` z)cyTm^0%OktK<`h_wB*^&;S4X`=9?h|2of!nl~f=zR{(R00IagfB*srAb