Don't leak temporary file on failed multi-file ed-style patch

The previous fix worked fine with single-file ed-style patches, but
would still leak temporary files in the case of multi-file ed-style
patch. Fix that case as well, and extend the test case to check for
it.

* src/patch.c (main): Unlink TMPEDNAME if needed before moving to
  the next file in a patch.

This closes bug #53820:
https://savannah.gnu.org/bugs/index.php?53820

Fixes: 123eaff0d5d1 ("Fix arbitrary command execution in ed-style patches (CVE-2018-1000156)")
Fixes: 19599883ffb6 ("Don't leak temporary file on failed ed-style patch")

Gbp-Pq: Name 0007-Do_not_leak_temporary_file_on_failed_multi-file.patch
This commit is contained in:
Jean Delvare 2018-05-07 15:14:45 +02:00 committed by openKylinBot
parent 5ee73250df
commit c3fb4c48e5
2 changed files with 32 additions and 0 deletions

View File

@ -236,6 +236,7 @@ main (int argc, char **argv)
}
remove_if_needed (TMPOUTNAME, &TMPOUTNAME_needs_removal);
}
remove_if_needed (TMPEDNAME, &TMPEDNAME_needs_removal);
if (! skip_rest_of_patch && ! file_type)
{

View File

@ -38,3 +38,34 @@ EOF
check 'cat foo' <<EOF
foo
EOF
# Test the case where one ed-style patch modifies several files
cat > ed3.diff <<EOF
--- foo
+++ foo
1c
bar
.
--- baz
+++ baz
0a
baz
.
EOF
# Apparently we can't create a file with such a patch, while it works fine
# when the file name is provided on the command line
cat > baz <<EOF
EOF
check 'patch -e -i ed3.diff' <<EOF
EOF
check 'cat foo' <<EOF
bar
EOF
check 'cat baz' <<EOF
baz
EOF