forked from pool/patch
113fbdee3e
- ed-style-01-missing-input-files.patch: Allow input files to be missing for ed-style patches. - ed-style-02-fix-arbitrary-command-execution.patch, ed-style-03-update-test-Makefile.patch: Fix arbitrary command execution in ed-style patches. - ed-style-04-invoke-ed-directly.patch: Invoke ed directly instead of using the shell. - ed-style-05-minor-cleanups.patch: Minor cleanups in do_ed_script. - ed-style-06-fix-test-failure.patch: Fix 'ed-style' test failure. OBS-URL: https://build.opensuse.org/package/show/devel:tools/patch?expand=0&rev=58
96 lines
2.6 KiB
Diff
96 lines
2.6 KiB
Diff
From: Andreas Gruenbacher <agruen@gnu.org>
|
|
Date: Fri, 6 Apr 2018 20:32:46 +0200
|
|
Subject: Minor cleanups in do_ed_script
|
|
Git-commit: 2a32bf09f5e9572da4be183bb0dbde8164351474
|
|
Patch-mainline: yes
|
|
References: bsc#1088420, savannah#53566, CVE-2018-1000156
|
|
|
|
* src/pch.c (do_ed_script): Minor cleanups.
|
|
|
|
Backporting notes: adjusted because we don't have commit ff1d3a67da1e
|
|
("Use gnulib execute module") so the context is very different.
|
|
---
|
|
src/pch.c | 56 +++++++++++++++++++++++++++-----------------------------
|
|
1 file changed, 27 insertions(+), 29 deletions(-)
|
|
|
|
--- a/src/pch.c
|
|
+++ b/src/pch.c
|
|
@@ -2395,6 +2395,8 @@ do_ed_script (char const *inname, char c
|
|
char const *tmpname;
|
|
int tmpfd;
|
|
pid_t pid;
|
|
+ int exclusive = *outname_needs_removal ? 0 : O_EXCL;
|
|
+
|
|
|
|
if (! dry_run && ! skip_rest_of_patch)
|
|
{
|
|
@@ -2442,7 +2444,7 @@ do_ed_script (char const *inname, char c
|
|
break;
|
|
}
|
|
}
|
|
- if (!tmpfp)
|
|
+ if (dry_run || skip_rest_of_patch)
|
|
return;
|
|
if (fwrite ("w\nq\n", sizeof (char), (size_t) 4, tmpfp) == 0
|
|
|| fflush (tmpfp) != 0)
|
|
@@ -2451,35 +2453,31 @@ do_ed_script (char const *inname, char c
|
|
if (lseek (tmpfd, 0, SEEK_SET) == -1)
|
|
pfatal ("Can't rewind to the beginning of file %s", quotearg (tmpname));
|
|
|
|
- if (! dry_run && ! skip_rest_of_patch) {
|
|
- int exclusive = *outname_needs_removal ? 0 : O_EXCL;
|
|
+ if (inerrno != ENOENT)
|
|
+ {
|
|
*outname_needs_removal = true;
|
|
- if (inerrno != ENOENT)
|
|
- {
|
|
- *outname_needs_removal = true;
|
|
- copy_file (inname, outname, 0, exclusive, instat.st_mode, true);
|
|
- }
|
|
- fflush (stdout);
|
|
-
|
|
- pid = fork();
|
|
- if (pid == -1)
|
|
- pfatal ("Can't fork");
|
|
- else if (pid == 0)
|
|
- {
|
|
- dup2 (tmpfd, 0);
|
|
- assert (outname[0] != '!' && outname[0] != '-');
|
|
- execlp (editor_program, editor_program, "-", outname, (char *) NULL);
|
|
- _exit (2);
|
|
- }
|
|
- else
|
|
- {
|
|
- int wstatus;
|
|
- if (waitpid (pid, &wstatus, 0) == -1
|
|
- || ! WIFEXITED (wstatus)
|
|
- || WEXITSTATUS (wstatus) != 0)
|
|
- fatal ("%s FAILED", editor_program);
|
|
- }
|
|
- }
|
|
+ copy_file (inname, outname, 0, exclusive, instat.st_mode, true);
|
|
+ }
|
|
+ fflush (stdout);
|
|
+
|
|
+ pid = fork();
|
|
+ if (pid == -1)
|
|
+ pfatal ("Can't fork");
|
|
+ else if (pid == 0)
|
|
+ {
|
|
+ dup2 (tmpfd, 0);
|
|
+ assert (outname[0] != '!' && outname[0] != '-');
|
|
+ execlp (editor_program, editor_program, "-", outname, (char *) NULL);
|
|
+ _exit (2);
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ int wstatus;
|
|
+ if (waitpid (pid, &wstatus, 0) == -1
|
|
+ || ! WIFEXITED (wstatus)
|
|
+ || WEXITSTATUS (wstatus) != 0)
|
|
+ fatal ("%s FAILED", editor_program);
|
|
+ }
|
|
|
|
fclose (tmpfp);
|
|
safe_unlink (tmpname);
|