Commit Graph

8 Commits

Author SHA1 Message Date
zeertzjq
c3c06723f0 vim-patch:9.2.0355: runtime(tar): missing path traversal checks in tar#Extract() (#39095)
Problem:  runtime(tar): missing path traversal checks in tar#Extract()
Solution: Add check for leading slash, however gnu tar should already
          detect this (q1uf3ng)

tar#Extract() did not check for ../ sequences or absolute paths,
unlike zip#Extract() which was patched in recent commits. Add the
same checks: ../ (relative traversal), leading slash (Unix), drive
letter and UNC/leading slash (Windows).

closes: vim/vim#19981

490b737f3e

Co-authored-by: q1uf3ng <q1uf3ng@protone.me>
2026-04-16 08:40:41 +08:00
zeertzjq
5ecff6c96f vim-patch:9.2.0330: tests: some patterns in tar and zip plugin tests not strict enough (#38947)
Problem:  Some patterns in tar and zip plugin tests not strict enough.
Solution: Use assert_equal() for lines that should match exactly. Match
          a literal dot properly (zeertzjq).

closes: vim/vim#19946

2fbc69c9ad
2026-04-11 07:26:35 +08:00
zeertzjq
ec8d352117 vim-patch:9.2.0326: runtime(tar): but with dotted path
Problem:  runtime(tar): but with dotted path
Solution: Do not strip everything after the first dot
          (Aaron Burrow)

tar#Extract was getting the extensionless basename by
stripping away everything starting with the leftmost
dot.  So if a directory had a dot or the file had an
'extra' dot then the code did the wrong thing.  For
example, if it was given:

  /tmp/foo.bar/baz.tar.gz

Then it would treat /tmp/foo as the extensionless
basename, but it actually should have grabbed:

  /tmp/foo.bar/baz

This patch fixes the issue by instead looking at the
rightmost dot(s).

This bug was discovered by ChatGPT 5.4.  I wrote the
patch and tested vim.

closes: vim/vim#19930

4a1bcc67b4

Co-authored-by: Aaron Burrow <burrows@fastmail.com>
2026-04-10 12:30:38 +08:00
zeertzjq
dc3b49d5a1 vim-patch:9.2.0325: runtime(tar): bug in zstd handling
Problem:  patch 9.2.0325: runtime(tar): bug in zstd handling
Solution: use correct --zstd argument, separated from other arguments,
          rework testing framework (Aaron Burrow).

The tar.vim plugin allows vim to read and manipulate zstd archives,
but it had a bug that caused extraction attempts to fail.
Specifically, if the archive has a .tar.zst or .tzst extension, then
the code was generating invalid extraction commands that looked like
this:

  tar --zstdpxf foo.tar.zst foo

When they should be like this:

  tar --zstd -pxf foo.tar.zst foo

This patch changes the flag manipulation logic so that --zstd isn't
glued to pxf.

The labor for this change was divided between ChatGPT 5.4 and me.
ChatGPT 5.4 identified the issue (from a code scan?), and I wrote
the patch and tested vim.

related: vim/vim#19930

00285c035a

Note: tests need the next patch to pass in Nvim.

Co-authored-by: Aaron Burrow <burrows@fastmail.com>
2026-04-10 12:30:31 +08:00
zeertzjq
056304ef5b vim-patch:9.2.0306: runtime(tar): some issues with lz4 support (#38826)
Problem:  runtime(tar): some issues with lz4 support
Solution: Fix bugs (see below) (Aaron Burrow)

The tar plugin allows users to extract files from tar archives that are
compressed with lz4. But, tar#Extract() builds malformed extraction commands
for lz4-compressed tar archives. This commit fixes three issues in that code.
The first affects archives with a .tlz4 extension and the other two affect
archives with .tar.lz4 extension (but one of these is symmetric to the issue
that .tlz4 archives had).

(1) When trying to extract .tlz4 archives the command created by
tar#Extract looked like this:

    tar -I lz4pxf foo.tlz4 foo

This isn't right.  It should be something like this:

    tar -I lz4 -pxf foo.tlz4 foo

This was happening because tar.plugin is just substituting on the
first - in "tar -pxf".  This works fine if we just add a simple flag for
extraction (eg, z for .tgz), but for lz4 we need to add "-I lz4".

I don't believe that there is an obvious good way to fix this without
reworking the way the command is generated.  Probably we should collect
the command and flags separately and the flags should be stored in a
set. Then put everything together into a string just before issuing it
as an extraction command.  Unfortunately, this might break things for users
because they have access to tar_extractcmd.

This patch just makes the substitution a little bit more clever so that it
does the right thing when substituting on a string like "tar -pxf".

(2) .tar.lz4 extractions had the same issue, which my patch fixes in
the same way.

(3) .tar.lz4 extractions had another issue.  There was a space missing
in the command generated by tar#Extract.  This meant that commands
looked like this (notice the lack of space between the archive and output
file names):

    tar -I lz4pxf foo.tar.lz4foo

This patch just puts a space where it should be.

Finally, I should note that ChatGPT 5.4 initially identified this issue
in the code and generated the test cases.  I reviewed the test cases,
wrote the patch, and actually ran vim against the tests (both with and
without the patch).

closes: vim/vim#19925

78954f86c2

Co-authored-by: Aaron Burrow <burrows@fastmail.com>
2026-04-06 13:43:28 +00:00
Justin M. Keyes
9c55674ba9 test(oldtest): skip 2 tests on s390x
Failures:
    From test_plugin_tar.vim:
    Found errors in Test_tar_evil():
    command line..script …/test/old/testdir/runtest.vim[659]..function RunTheTest[61]..Test_tar_evil line 12: Pattern '/etc/ax-pwn' does not match '/usr/bin/tar: Removing leading `/'' from member names'
    Caught exception in Test_tar_evil(): Vim(read):E484: Can't open file usr/bin/tar: Removing leading `/' from member names @ command line..script …/test/old/testdir/runtest.vim[659]..function
    RunTheTest[61]..Test_tar_evil[22]..<SNR>10_TarBrowseSelect[27]..tar#Read, line 114
    Found errors in Test_tar_path_traversal_with_nowrapscan():
    command line..script …/test/old/testdir/runtest.vim[659]..function RunTheTest[61]..Test_tar_path_traversal_with_nowrapscan[1]..<SNR>8_CopyFile line 2: Can't copy samples/evil.tar
    command line..script …/test/old/testdir/runtest.vim[659]..function RunTheTest[61]..Test_tar_path_traversal_with_nowrapscan line 14: Pattern '/etc/ax-pwn' does not match '/usr/bin/tar: Removing leading `/'' from
    member names'
    From test_search_stat.vim:
    Found errors in Test_search_stat_option():
    Run 1, 00:17:24 - 00:17:26 in  2.405525 seconds:
    command line..script …/test/old/testdir/runtest.vim[659]..function RunTheTest[61]..Test_search_stat_option line 31: Pattern 'fo\\*\\\\(bar\\\\?\\\\)\\\\?\\s\\+\\[2/>999\\]' does not match '\n/fo*\\(bar\\?\\)\\?\[
    occurs 63 times]\n\n/fo*\\(bar\\?\\)\\?\[  occurs 57 times][?/??]'
    command line..script …/test/old/testdir/runtest.vim[659]..function RunTheTest[61]..Test_search_stat_option line 32: Expected {'incomplete': 2, 'total': 1000} but got {'incomplete': 1, 'total': 980} - 3 equal items
    omitted
    command line..script …/test/old/testdir/runtest.vim[659]..function RunTheTest[61]..Test_search_stat_option line 52: Expected {'exact_match': 1, 'current': 27992, 'incomplete': 0, 'total': 28000} but got
    {'exact_match': 0, 'current': 18044, 'incomplete': 1, 'total': 18044} - 1 equal item omitted
    command line..script …/test/old/testdir/runtest.vim[659]..function RunTheTest[61]..Test_search_stat_option line 55: Expected {'incomplete': 0, 'total': 28000} but got {'incomplete': 1, 'total': 18143} - 3 equal
    items omitted
    command line..script …/test/old/testdir/runtest.vim[659]..function RunTheTest[61]..Test_search_stat_option line 65: Expected {'total': 28000, 'incomplete': 0} but got {'total': 18168, 'incomplete': 1} - 3 equal
    items omitted
    command line..script …/test/old/testdir/runtest.vim[659]..function RunTheTest[61]..Test_search_stat_option line 68: Expected {'exact_match': 1, 'current': 27991, 'total': 28000, 'incomplete': 0} but got
    {'exact_match': 0, 'current': 18167, 'total': 18167, 'incomplete': 1} - 1 equal item omitted
    Run 2, 00:17:28 - 00:17:32 in  3.437275 seconds:
    command line..script …/test/old/testdir/runtest.vim[700]..function RunTheTest[61]..Test_search_stat_option line 31: Pattern 'fo\\*\\\\(bar\\\\?\\\\)\\\\?\\s\\+\\[2/>999\\]' does not match '\n/fo*\\(bar\\?\\)\\?\[
    occurs 63 times]\n\n/fo*\\(bar\\?\\)\\?\[  occurs 57 times][?/??]'
    command line..script …/test/old/testdir/runtest.vim[700]..function RunTheTest[61]..Test_search_stat_option line 32: Expected {'incomplete': 2, 'total': 1000} but got {'incomplete': 1, 'total': 991} - 3 equal items
    omitted
    Run 3, 00:17:36 - 00:17:39 in  3.408885 seconds:
    command line..script …/test/old/testdir/runtest.vim[700]..function RunTheTest[61]..Test_search_stat_option line 31: Pattern 'fo\\*\\\\(bar\\\\?\\\\)\\\\?\\s\\+\\[2/>999\\]' does not match '\n/fo*\\(bar\\?\\)\\?\[
    occurs 63 times]\n\n/fo*\\(bar\\?\\)\\?\[  occurs 57 times][?/??]'
    command line..script …/test/old/testdir/runtest.vim[700]..function RunTheTest[61]..Test_search_stat_option line 32: Expected {'incomplete': 2, 'total': 1000} but got {'incomplete': 1, 'total': 994} - 3 equal items
    omitted
    Flaky test failed too often, giving up
2026-03-29 13:36:56 +02:00
zeertzjq
6dd0a7d60a vim-patch:9.1.2135: tests: tar plugin does not consider 'nowrapscan' (#37752)
Problem:  search() is used to check for the message from tar that
          indicates leading slashes found in the tar archive, or to
          check for the leading slashes themselves. However, if
          'nowrapscan' is in effect these searches are limited to the
          last line and don't find any results. This causes the warning
          message from tar to be seen in the buffer, the "Path Traversal
          Attack Detected" message to be omitted, and editing actions
          can fail. This can be seen, for example, when editing
          src/testdir/samples/evil.tar.
Solution: Use the 'w' flag for search() (Kevin Goodsell)

closes: vim/vim#19333

18d844e365

Co-authored-by: Kevin Goodsell <kevin-opensource@omegacrash.net>
2026-02-06 20:25:14 +08:00
zeertzjq
77c6cae25b vim-patch:9.1.1552: [security]: path traversal issue in tar.vim
Problem:  [security]: path traversal issue in tar.vim
          (@ax)
Solution: warn the user for such things, drop leading /, don't
          forcefully overwrite files when writing temporary files,
          refactor autoload/tar.vim

tar.vim: drop leading / in path names

A tar archive containing files with leading `/` may cause confusions as
to where the content is extracted.  Let's make sure we drop the leading
`/` and use a relative path instead.

Also while at it, had to refactor it quite a bit and increase the
minimum supported Vim version to v9. Also add a test for some basic tar
functionality

closes: vim/vim#17733

87757c6b0a

Co-authored-by: Christian Brabandt <cb@256bit.org>
2025-07-18 08:40:23 +08:00