diff options
author | Jean Delvare <jdelvare@suse.de> | 2018-05-07 15:14:45 +0200 |
---|---|---|
committer | Andreas Gruenbacher <agruen@gnu.org> | 2018-05-07 15:15:33 +0200 |
commit | 369dcccdfa6336e5a873d6d63705cfbe04c55727 (patch) | |
tree | 84d2ba462721ddbb77c7ad33424f6eb68f89152c | |
parent | 19599883ffb6a450d2884f081f8ecf68edbed7ee (diff) | |
download | patch-369dcccdfa6336e5a873d6d63705cfbe04c55727.tar.gz |
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")
-rw-r--r-- | src/patch.c | 1 | ||||
-rw-r--r-- | tests/ed-style | 31 |
2 files changed, 32 insertions, 0 deletions
diff --git a/src/patch.c b/src/patch.c index 9146597..81c7a02 100644 --- a/src/patch.c +++ b/src/patch.c @@ -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) { diff --git a/tests/ed-style b/tests/ed-style index 6b6ef9d..504e6e5 100644 --- a/tests/ed-style +++ b/tests/ed-style @@ -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 |