changed debian/source/format to native
This commit is contained in:
parent
a8895a0e0d
commit
60e21582e9
|
@ -1,23 +0,0 @@
|
|||
From: Bruno Haible <bruno@clisp.org>
|
||||
Date: Sat, 7 Apr 2018 12:34:03 +0200
|
||||
Subject: [PATCH] Fix 'ed-style' test failure.
|
||||
|
||||
* tests/ed-style: Remove '?' line from expected output.
|
||||
---
|
||||
tests/ed-style | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
diff --git a/tests/ed-style b/tests/ed-style
|
||||
index d8c0689..6b6ef9d 100644
|
||||
--- a/tests/ed-style
|
||||
+++ b/tests/ed-style
|
||||
@@ -31,8 +31,7 @@ r !echo bar
|
||||
,p
|
||||
EOF
|
||||
|
||||
-check 'patch -e foo -i ed2.diff 2> /dev/null || echo "Status: $?"' <<EOF
|
||||
-?
|
||||
+check 'patch -e foo -i ed2.diff > /dev/null 2> /dev/null || echo "Status: $?"' <<EOF
|
||||
Status: 2
|
||||
EOF
|
||||
|
|
@ -1,47 +0,0 @@
|
|||
From: Andreas Gruenbacher <agruen@gnu.org>
|
||||
Date: Fri, 28 Jun 2019 00:30:25 +0200
|
||||
Subject: Abort when cleaning up fails
|
||||
|
||||
When a fatal error triggers during cleanup, another attempt will be made to
|
||||
clean up, which will likely lead to the same fatal error. So instead, bail out
|
||||
when that happens.
|
||||
src/patch.c (cleanup): Bail out when called recursively.
|
||||
(main): There is no need to call output_files() before cleanup() as cleanup()
|
||||
already does that.
|
||||
---
|
||||
src/patch.c | 8 ++++++--
|
||||
1 file changed, 6 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/patch.c b/src/patch.c
|
||||
index cb401ec..fe60b56 100644
|
||||
--- a/src/patch.c
|
||||
+++ b/src/patch.c
|
||||
@@ -680,7 +680,6 @@ main (int argc, char **argv)
|
||||
}
|
||||
if (outstate.ofp && (ferror (outstate.ofp) || fclose (outstate.ofp) != 0))
|
||||
write_fatal ();
|
||||
- output_files (NULL);
|
||||
cleanup ();
|
||||
delete_files ();
|
||||
if (somefailed)
|
||||
@@ -1976,7 +1975,6 @@ void
|
||||
fatal_exit (int sig)
|
||||
{
|
||||
cleanup ();
|
||||
-
|
||||
if (sig)
|
||||
exit_with_signal (sig);
|
||||
|
||||
@@ -1996,6 +1994,12 @@ remove_if_needed (char const *name, bool *needs_removal)
|
||||
static void
|
||||
cleanup (void)
|
||||
{
|
||||
+ static bool already_cleaning_up;
|
||||
+
|
||||
+ if (already_cleaning_up)
|
||||
+ return;
|
||||
+ already_cleaning_up = true;
|
||||
+
|
||||
remove_if_needed (TMPINNAME, &TMPINNAME_needs_removal);
|
||||
remove_if_needed (TMPOUTNAME, &TMPOUTNAME_needs_removal);
|
||||
remove_if_needed (TMPPATNAME, &TMPPATNAME_needs_removal);
|
|
@ -1,85 +0,0 @@
|
|||
From: Andreas Gruenbacher <agruen@gnu.org>
|
||||
Date: Thu, 27 Jun 2019 11:10:43 +0200
|
||||
Subject: Don't crash when RLIMIT_NOFILE is set to RLIM_INFINITY
|
||||
|
||||
* src/safe.c (min_cached_fds): Define minimum number of cached dir file
|
||||
descriptors.
|
||||
(max_cached_fds): Change type to rlim_t to allow storing RLIM_INFINITY.
|
||||
(init_dirfd_cache): Set max_cached_fds to RLIM_INFINITY when RLIMIT_NOFILE is
|
||||
RLIM_INFINITY. Set the initial hash table size to min_cached_fds, independent
|
||||
of RLIMIT_NOFILE: patches commonly only affect one or a few files, so a small
|
||||
hash table will usually suffice; if needed, the hash table will grow.
|
||||
(insert_cached_dirfd): Don't shrink the cache when max_cached_fds is
|
||||
RLIM_INFINITY.
|
||||
---
|
||||
src/safe.c | 36 +++++++++++++++++++++++-------------
|
||||
1 file changed, 23 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/src/safe.c b/src/safe.c
|
||||
index 5a7202f..f147b0e 100644
|
||||
--- a/src/safe.c
|
||||
+++ b/src/safe.c
|
||||
@@ -67,7 +67,8 @@ struct cached_dirfd {
|
||||
};
|
||||
|
||||
static Hash_table *cached_dirfds = NULL;
|
||||
-static size_t max_cached_fds;
|
||||
+static rlim_t min_cached_fds = 8;
|
||||
+static rlim_t max_cached_fds;
|
||||
LIST_HEAD (lru_list);
|
||||
|
||||
static size_t hash_cached_dirfd (const void *entry, size_t table_size)
|
||||
@@ -98,11 +99,17 @@ static void init_dirfd_cache (void)
|
||||
{
|
||||
struct rlimit nofile;
|
||||
|
||||
- max_cached_fds = 8;
|
||||
if (getrlimit (RLIMIT_NOFILE, &nofile) == 0)
|
||||
- max_cached_fds = MAX (nofile.rlim_cur / 4, max_cached_fds);
|
||||
+ {
|
||||
+ if (nofile.rlim_cur == RLIM_INFINITY)
|
||||
+ max_cached_fds = RLIM_INFINITY;
|
||||
+ else
|
||||
+ max_cached_fds = MAX (nofile.rlim_cur / 4, min_cached_fds);
|
||||
+ }
|
||||
+ else
|
||||
+ max_cached_fds = min_cached_fds;
|
||||
|
||||
- cached_dirfds = hash_initialize (max_cached_fds,
|
||||
+ cached_dirfds = hash_initialize (min_cached_fds,
|
||||
NULL,
|
||||
hash_cached_dirfd,
|
||||
compare_cached_dirfds,
|
||||
@@ -148,20 +155,23 @@ static void insert_cached_dirfd (struct cached_dirfd *entry, int keepfd)
|
||||
if (cached_dirfds == NULL)
|
||||
init_dirfd_cache ();
|
||||
|
||||
- /* Trim off the least recently used entries */
|
||||
- while (hash_get_n_entries (cached_dirfds) >= max_cached_fds)
|
||||
+ if (max_cached_fds != RLIM_INFINITY)
|
||||
{
|
||||
- struct cached_dirfd *last =
|
||||
- list_entry (lru_list.prev, struct cached_dirfd, lru_link);
|
||||
- if (&last->lru_link == &lru_list)
|
||||
- break;
|
||||
- if (last->fd == keepfd)
|
||||
+ /* Trim off the least recently used entries */
|
||||
+ while (hash_get_n_entries (cached_dirfds) >= max_cached_fds)
|
||||
{
|
||||
- last = list_entry (last->lru_link.prev, struct cached_dirfd, lru_link);
|
||||
+ struct cached_dirfd *last =
|
||||
+ list_entry (lru_list.prev, struct cached_dirfd, lru_link);
|
||||
if (&last->lru_link == &lru_list)
|
||||
break;
|
||||
+ if (last->fd == keepfd)
|
||||
+ {
|
||||
+ last = list_entry (last->lru_link.prev, struct cached_dirfd, lru_link);
|
||||
+ if (&last->lru_link == &lru_list)
|
||||
+ break;
|
||||
+ }
|
||||
+ remove_cached_dirfd (last);
|
||||
}
|
||||
- remove_cached_dirfd (last);
|
||||
}
|
||||
|
||||
/* Only insert if the parent still exists. */
|
|
@ -1,104 +0,0 @@
|
|||
From: Andreas Gruenbacher <agruen@gnu.org>
|
||||
Date: Mon, 15 Jul 2019 16:21:48 +0200
|
||||
Subject: Don't follow symlinks unless --follow-symlinks is given
|
||||
|
||||
* src/inp.c (plan_a, plan_b), src/util.c (copy_to_fd, copy_file,
|
||||
append_to_file): Unless the --follow-symlinks option is given, open files with
|
||||
the O_NOFOLLOW flag to avoid following symlinks. So far, we were only doing
|
||||
that consistently for input files.
|
||||
* src/util.c (create_backup): When creating empty backup files, (re)create them
|
||||
with O_CREAT | O_EXCL to avoid following symlinks in that case as well.
|
||||
---
|
||||
src/inp.c | 12 ++++++++++--
|
||||
src/util.c | 14 +++++++++++---
|
||||
2 files changed, 21 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/src/inp.c b/src/inp.c
|
||||
index 32d0919..22d7473 100644
|
||||
--- a/src/inp.c
|
||||
+++ b/src/inp.c
|
||||
@@ -238,8 +238,13 @@ plan_a (char const *filename)
|
||||
{
|
||||
if (S_ISREG (instat.st_mode))
|
||||
{
|
||||
- int ifd = safe_open (filename, O_RDONLY|binary_transput, 0);
|
||||
+ int flags = O_RDONLY | binary_transput;
|
||||
size_t buffered = 0, n;
|
||||
+ int ifd;
|
||||
+
|
||||
+ if (! follow_symlinks)
|
||||
+ flags |= O_NOFOLLOW;
|
||||
+ ifd = safe_open (filename, flags, 0);
|
||||
if (ifd < 0)
|
||||
pfatal ("can't open file %s", quotearg (filename));
|
||||
|
||||
@@ -340,6 +345,7 @@ plan_a (char const *filename)
|
||||
static void
|
||||
plan_b (char const *filename)
|
||||
{
|
||||
+ int flags = O_RDONLY | binary_transput;
|
||||
int ifd;
|
||||
FILE *ifp;
|
||||
int c;
|
||||
@@ -353,7 +359,9 @@ plan_b (char const *filename)
|
||||
|
||||
if (instat.st_size == 0)
|
||||
filename = NULL_DEVICE;
|
||||
- if ((ifd = safe_open (filename, O_RDONLY | binary_transput, 0)) < 0
|
||||
+ if (! follow_symlinks)
|
||||
+ flags |= O_NOFOLLOW;
|
||||
+ if ((ifd = safe_open (filename, flags, 0)) < 0
|
||||
|| ! (ifp = fdopen (ifd, binary_transput ? "rb" : "r")))
|
||||
pfatal ("Can't open file %s", quotearg (filename));
|
||||
if (TMPINNAME_needs_removal)
|
||||
diff --git a/src/util.c b/src/util.c
|
||||
index f8f0dfa..bfa6d7f 100644
|
||||
--- a/src/util.c
|
||||
+++ b/src/util.c
|
||||
@@ -393,7 +393,7 @@ create_backup (char const *to, const struct stat *to_st, bool leave_original)
|
||||
|
||||
try_makedirs_errno = ENOENT;
|
||||
safe_unlink (bakname);
|
||||
- while ((fd = safe_open (bakname, O_CREAT | O_WRONLY | O_TRUNC, 0666)) < 0)
|
||||
+ while ((fd = safe_open (bakname, O_CREAT | O_EXCL | O_WRONLY | O_TRUNC, 0666)) < 0)
|
||||
{
|
||||
if (errno != try_makedirs_errno)
|
||||
pfatal ("Can't create file %s", quotearg (bakname));
|
||||
@@ -584,10 +584,13 @@ create_file (char const *file, int open_flags, mode_t mode,
|
||||
static void
|
||||
copy_to_fd (const char *from, int tofd)
|
||||
{
|
||||
+ int from_flags = O_RDONLY | O_BINARY;
|
||||
int fromfd;
|
||||
ssize_t i;
|
||||
|
||||
- if ((fromfd = safe_open (from, O_RDONLY | O_BINARY, 0)) < 0)
|
||||
+ if (! follow_symlinks)
|
||||
+ from_flags |= O_NOFOLLOW;
|
||||
+ if ((fromfd = safe_open (from, from_flags, 0)) < 0)
|
||||
pfatal ("Can't reopen file %s", quotearg (from));
|
||||
while ((i = read (fromfd, buf, bufsize)) != 0)
|
||||
{
|
||||
@@ -630,6 +633,8 @@ copy_file (char const *from, char const *to, struct stat *tost,
|
||||
else
|
||||
{
|
||||
assert (S_ISREG (mode));
|
||||
+ if (! follow_symlinks)
|
||||
+ to_flags |= O_NOFOLLOW;
|
||||
tofd = create_file (to, O_WRONLY | O_BINARY | to_flags, mode,
|
||||
to_dir_known_to_exist);
|
||||
copy_to_fd (from, tofd);
|
||||
@@ -645,9 +650,12 @@ copy_file (char const *from, char const *to, struct stat *tost,
|
||||
void
|
||||
append_to_file (char const *from, char const *to)
|
||||
{
|
||||
+ int to_flags = O_WRONLY | O_APPEND | O_BINARY;
|
||||
int tofd;
|
||||
|
||||
- if ((tofd = safe_open (to, O_WRONLY | O_BINARY | O_APPEND, 0)) < 0)
|
||||
+ if (! follow_symlinks)
|
||||
+ to_flags |= O_NOFOLLOW;
|
||||
+ if ((tofd = safe_open (to, to_flags, 0)) < 0)
|
||||
pfatal ("Can't reopen file %s", quotearg (to));
|
||||
copy_to_fd (from, tofd);
|
||||
if (close (tofd) != 0)
|
|
@ -1,34 +0,0 @@
|
|||
From: Andreas Gruenbacher <agruen@gnu.org>
|
||||
Date: Fri, 6 Apr 2018 19:36:15 +0200
|
||||
Subject: Invoke ed directly instead of using the shell
|
||||
|
||||
* src/pch.c (do_ed_script): Invoke ed directly instead of using a shell
|
||||
command to avoid quoting vulnerabilities.
|
||||
---
|
||||
src/pch.c | 6 ++----
|
||||
1 file changed, 2 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/pch.c b/src/pch.c
|
||||
index 4fd5a05..16e001a 100644
|
||||
--- a/src/pch.c
|
||||
+++ b/src/pch.c
|
||||
@@ -2459,9 +2459,6 @@ do_ed_script (char const *inname, char const *outname,
|
||||
*outname_needs_removal = true;
|
||||
copy_file (inname, outname, 0, exclusive, instat.st_mode, true);
|
||||
}
|
||||
- sprintf (buf, "%s %s%s", editor_program,
|
||||
- verbosity == VERBOSE ? "" : "- ",
|
||||
- outname);
|
||||
fflush (stdout);
|
||||
|
||||
pid = fork();
|
||||
@@ -2470,7 +2467,8 @@ do_ed_script (char const *inname, char const *outname,
|
||||
else if (pid == 0)
|
||||
{
|
||||
dup2 (tmpfd, 0);
|
||||
- execl ("/bin/sh", "sh", "-c", buf, (char *) 0);
|
||||
+ assert (outname[0] != '!' && outname[0] != '-');
|
||||
+ execlp (editor_program, editor_program, "-", outname, (char *) NULL);
|
||||
_exit (2);
|
||||
}
|
||||
else
|
|
@ -1,98 +0,0 @@
|
|||
From: Jean Delvare <jdelvare@suse.de>
|
||||
Date: Thu, 3 May 2018 14:31:55 +0200
|
||||
Subject: Don't leak temporary file on failed ed-style patch
|
||||
|
||||
Now that we write ed-style patches to a temporary file before we
|
||||
apply them, we need to ensure that the temporary file is removed
|
||||
before we leave, even on fatal error.
|
||||
|
||||
* src/pch.c (do_ed_script): Use global TMPEDNAME instead of local
|
||||
tmpname. Don't unlink the file directly, instead tag it for removal
|
||||
at exit time.
|
||||
* src/patch.c (cleanup): Unlink TMPEDNAME at exit.
|
||||
|
||||
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)")
|
||||
---
|
||||
src/common.h | 2 ++
|
||||
src/patch.c | 1 +
|
||||
src/pch.c | 11 +++++------
|
||||
3 files changed, 8 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/src/common.h b/src/common.h
|
||||
index ec50b40..22238b5 100644
|
||||
--- a/src/common.h
|
||||
+++ b/src/common.h
|
||||
@@ -94,10 +94,12 @@ XTERN char const *origsuff;
|
||||
XTERN char const * TMPINNAME;
|
||||
XTERN char const * TMPOUTNAME;
|
||||
XTERN char const * TMPPATNAME;
|
||||
+XTERN char const * TMPEDNAME;
|
||||
|
||||
XTERN bool TMPINNAME_needs_removal;
|
||||
XTERN bool TMPOUTNAME_needs_removal;
|
||||
XTERN bool TMPPATNAME_needs_removal;
|
||||
+XTERN bool TMPEDNAME_needs_removal;
|
||||
|
||||
#ifdef DEBUGGING
|
||||
XTERN int debug;
|
||||
diff --git a/src/patch.c b/src/patch.c
|
||||
index fe60b56..13cd43b 100644
|
||||
--- a/src/patch.c
|
||||
+++ b/src/patch.c
|
||||
@@ -2003,6 +2003,7 @@ cleanup (void)
|
||||
remove_if_needed (TMPINNAME, &TMPINNAME_needs_removal);
|
||||
remove_if_needed (TMPOUTNAME, &TMPOUTNAME_needs_removal);
|
||||
remove_if_needed (TMPPATNAME, &TMPPATNAME_needs_removal);
|
||||
+ remove_if_needed (TMPEDNAME, &TMPEDNAME_needs_removal);
|
||||
remove_if_needed (TMPREJNAME, &TMPREJNAME_needs_removal);
|
||||
output_files (NULL);
|
||||
}
|
||||
diff --git a/src/pch.c b/src/pch.c
|
||||
index 16e001a..6b72ab3 100644
|
||||
--- a/src/pch.c
|
||||
+++ b/src/pch.c
|
||||
@@ -2392,7 +2392,6 @@ do_ed_script (char const *inname, char const *outname,
|
||||
file_offset beginning_of_this_line;
|
||||
size_t chars_read;
|
||||
FILE *tmpfp = 0;
|
||||
- char const *tmpname;
|
||||
int tmpfd;
|
||||
pid_t pid;
|
||||
|
||||
@@ -2404,12 +2403,13 @@ do_ed_script (char const *inname, char const *outname,
|
||||
invalid commands and treats the next line as a new command, which
|
||||
can lead to arbitrary command execution. */
|
||||
|
||||
- tmpfd = make_tempfile (&tmpname, 'e', NULL, O_RDWR | O_BINARY, 0);
|
||||
+ tmpfd = make_tempfile (&TMPEDNAME, 'e', NULL, O_RDWR | O_BINARY, 0);
|
||||
if (tmpfd == -1)
|
||||
- pfatal ("Can't create temporary file %s", quotearg (tmpname));
|
||||
+ pfatal ("Can't create temporary file %s", quotearg (TMPEDNAME));
|
||||
+ TMPEDNAME_needs_removal = true;
|
||||
tmpfp = fdopen (tmpfd, "w+b");
|
||||
if (! tmpfp)
|
||||
- pfatal ("Can't open stream for file %s", quotearg (tmpname));
|
||||
+ pfatal ("Can't open stream for file %s", quotearg (TMPEDNAME));
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
@@ -2449,7 +2449,7 @@ do_ed_script (char const *inname, char const *outname,
|
||||
write_fatal ();
|
||||
|
||||
if (lseek (tmpfd, 0, SEEK_SET) == -1)
|
||||
- pfatal ("Can't rewind to the beginning of file %s", quotearg (tmpname));
|
||||
+ pfatal ("Can't rewind to the beginning of file %s", quotearg (TMPEDNAME));
|
||||
|
||||
if (! dry_run && ! skip_rest_of_patch) {
|
||||
int exclusive = *outname_needs_removal ? 0 : O_EXCL;
|
||||
@@ -2482,7 +2482,6 @@ do_ed_script (char const *inname, char const *outname,
|
||||
}
|
||||
|
||||
fclose (tmpfp);
|
||||
- safe_unlink (tmpname);
|
||||
|
||||
if (ofp)
|
||||
{
|
|
@ -1,73 +0,0 @@
|
|||
From: Jean Delvare <jdelvare@suse.de>
|
||||
Date: Mon, 7 May 2018 15:14:45 +0200
|
||||
Subject: 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")
|
||||
---
|
||||
src/patch.c | 1 +
|
||||
tests/ed-style | 31 +++++++++++++++++++++++++++++++
|
||||
2 files changed, 32 insertions(+)
|
||||
|
||||
diff --git a/src/patch.c b/src/patch.c
|
||||
index 13cd43b..183814c 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
|
|
@ -1,22 +0,0 @@
|
|||
From: "Laszlo Boszormenyi (GCS)" <gcs@debian.org>
|
||||
Date: Sat, 14 May 2022 02:38:24 +0800
|
||||
Subject: backupmode
|
||||
|
||||
---
|
||||
patch.man | 3 ---
|
||||
1 file changed, 3 deletions(-)
|
||||
|
||||
diff --git a/patch.man b/patch.man
|
||||
index e919eae..24dc152 100644
|
||||
--- a/patch.man
|
||||
+++ b/patch.man
|
||||
@@ -260,9 +260,6 @@ mentioned previously.
|
||||
Make backup files.
|
||||
That is, when patching a file,
|
||||
rename or copy the original instead of removing it.
|
||||
-When backing up a file that does not exist,
|
||||
-an empty, unreadable backup file is created
|
||||
-as a placeholder to represent the nonexistent file.
|
||||
See the
|
||||
.B \-V
|
||||
or
|
|
@ -1,29 +0,0 @@
|
|||
From: Andreas Gruenbacher <agruen@gnu.org>
|
||||
Date: Fri, 6 Apr 2018 11:34:51 +0200
|
||||
Subject: Allow input files to be missing for ed-style patches
|
||||
|
||||
* src/pch.c (do_ed_script): Allow input files to be missing so that new
|
||||
files will be created as with non-ed-style patches.
|
||||
---
|
||||
src/pch.c | 8 +++++---
|
||||
1 file changed, 5 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/pch.c b/src/pch.c
|
||||
index bc6278c..0c5cc26 100644
|
||||
--- a/src/pch.c
|
||||
+++ b/src/pch.c
|
||||
@@ -2394,9 +2394,11 @@ do_ed_script (char const *inname, char const *outname,
|
||||
|
||||
if (! dry_run && ! skip_rest_of_patch) {
|
||||
int exclusive = *outname_needs_removal ? 0 : O_EXCL;
|
||||
- assert (! inerrno);
|
||||
- *outname_needs_removal = true;
|
||||
- copy_file (inname, outname, 0, exclusive, instat.st_mode, true);
|
||||
+ if (inerrno != ENOENT)
|
||||
+ {
|
||||
+ *outname_needs_removal = true;
|
||||
+ copy_file (inname, outname, 0, exclusive, instat.st_mode, true);
|
||||
+ }
|
||||
sprintf (buf, "%s %s%s", editor_program,
|
||||
verbosity == VERBOSE ? "" : "- ",
|
||||
outname);
|
|
@ -1,207 +0,0 @@
|
|||
From: Andreas Gruenbacher <agruen@gnu.org>
|
||||
Date: Fri, 6 Apr 2018 12:14:49 +0200
|
||||
Subject: Fix arbitrary command execution in ed-style patches
|
||||
(CVE-2018-1000156)
|
||||
|
||||
* src/pch.c (do_ed_script): Write ed script to a temporary file instead
|
||||
of piping it to ed: this will cause ed to abort on invalid commands
|
||||
instead of rejecting them and carrying on.
|
||||
* tests/ed-style: New test case.
|
||||
* tests/Makefile.am (TESTS): Add test case.
|
||||
---
|
||||
src/pch.c | 91 ++++++++++++++++++++++++++++++++++++++++---------------
|
||||
tests/Makefile.am | 1 +
|
||||
tests/ed-style | 41 +++++++++++++++++++++++++
|
||||
3 files changed, 108 insertions(+), 25 deletions(-)
|
||||
create mode 100644 tests/ed-style
|
||||
|
||||
diff --git a/src/pch.c b/src/pch.c
|
||||
index 0c5cc26..4fd5a05 100644
|
||||
--- a/src/pch.c
|
||||
+++ b/src/pch.c
|
||||
@@ -33,6 +33,7 @@
|
||||
# include <io.h>
|
||||
#endif
|
||||
#include <safe.h>
|
||||
+#include <sys/wait.h>
|
||||
|
||||
#define INITHUNKMAX 125 /* initial dynamic allocation size */
|
||||
|
||||
@@ -2389,24 +2390,28 @@ do_ed_script (char const *inname, char const *outname,
|
||||
static char const editor_program[] = EDITOR_PROGRAM;
|
||||
|
||||
file_offset beginning_of_this_line;
|
||||
- FILE *pipefp = 0;
|
||||
size_t chars_read;
|
||||
+ FILE *tmpfp = 0;
|
||||
+ char const *tmpname;
|
||||
+ int tmpfd;
|
||||
+ pid_t pid;
|
||||
+
|
||||
+ if (! dry_run && ! skip_rest_of_patch)
|
||||
+ {
|
||||
+ /* Write ed script to a temporary file. This causes ed to abort on
|
||||
+ invalid commands such as when line numbers or ranges exceed the
|
||||
+ number of available lines. When ed reads from a pipe, it rejects
|
||||
+ invalid commands and treats the next line as a new command, which
|
||||
+ can lead to arbitrary command execution. */
|
||||
+
|
||||
+ tmpfd = make_tempfile (&tmpname, 'e', NULL, O_RDWR | O_BINARY, 0);
|
||||
+ if (tmpfd == -1)
|
||||
+ pfatal ("Can't create temporary file %s", quotearg (tmpname));
|
||||
+ tmpfp = fdopen (tmpfd, "w+b");
|
||||
+ if (! tmpfp)
|
||||
+ pfatal ("Can't open stream for 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;
|
||||
- copy_file (inname, outname, 0, exclusive, instat.st_mode, true);
|
||||
- }
|
||||
- sprintf (buf, "%s %s%s", editor_program,
|
||||
- verbosity == VERBOSE ? "" : "- ",
|
||||
- outname);
|
||||
- fflush (stdout);
|
||||
- pipefp = popen(buf, binary_transput ? "wb" : "w");
|
||||
- if (!pipefp)
|
||||
- pfatal ("Can't open pipe to %s", quotearg (buf));
|
||||
- }
|
||||
for (;;) {
|
||||
char ed_command_letter;
|
||||
beginning_of_this_line = file_tell (pfp);
|
||||
@@ -2417,14 +2422,14 @@ do_ed_script (char const *inname, char const *outname,
|
||||
}
|
||||
ed_command_letter = get_ed_command_letter (buf);
|
||||
if (ed_command_letter) {
|
||||
- if (pipefp)
|
||||
- if (! fwrite (buf, sizeof *buf, chars_read, pipefp))
|
||||
+ if (tmpfp)
|
||||
+ if (! fwrite (buf, sizeof *buf, chars_read, tmpfp))
|
||||
write_fatal ();
|
||||
if (ed_command_letter != 'd' && ed_command_letter != 's') {
|
||||
p_pass_comments_through = true;
|
||||
while ((chars_read = get_line ()) != 0) {
|
||||
- if (pipefp)
|
||||
- if (! fwrite (buf, sizeof *buf, chars_read, pipefp))
|
||||
+ if (tmpfp)
|
||||
+ if (! fwrite (buf, sizeof *buf, chars_read, tmpfp))
|
||||
write_fatal ();
|
||||
if (chars_read == 2 && strEQ (buf, ".\n"))
|
||||
break;
|
||||
@@ -2437,13 +2442,49 @@ do_ed_script (char const *inname, char const *outname,
|
||||
break;
|
||||
}
|
||||
}
|
||||
- if (!pipefp)
|
||||
+ if (!tmpfp)
|
||||
return;
|
||||
- if (fwrite ("w\nq\n", sizeof (char), (size_t) 4, pipefp) == 0
|
||||
- || fflush (pipefp) != 0)
|
||||
+ if (fwrite ("w\nq\n", sizeof (char), (size_t) 4, tmpfp) == 0
|
||||
+ || fflush (tmpfp) != 0)
|
||||
write_fatal ();
|
||||
- if (pclose (pipefp) != 0)
|
||||
- fatal ("%s FAILED", editor_program);
|
||||
+
|
||||
+ 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;
|
||||
+ *outname_needs_removal = true;
|
||||
+ if (inerrno != ENOENT)
|
||||
+ {
|
||||
+ *outname_needs_removal = true;
|
||||
+ copy_file (inname, outname, 0, exclusive, instat.st_mode, true);
|
||||
+ }
|
||||
+ sprintf (buf, "%s %s%s", editor_program,
|
||||
+ verbosity == VERBOSE ? "" : "- ",
|
||||
+ outname);
|
||||
+ fflush (stdout);
|
||||
+
|
||||
+ pid = fork();
|
||||
+ if (pid == -1)
|
||||
+ pfatal ("Can't fork");
|
||||
+ else if (pid == 0)
|
||||
+ {
|
||||
+ dup2 (tmpfd, 0);
|
||||
+ execl ("/bin/sh", "sh", "-c", buf, (char *) 0);
|
||||
+ _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);
|
||||
|
||||
if (ofp)
|
||||
{
|
||||
diff --git a/tests/Makefile.am b/tests/Makefile.am
|
||||
index 6b6df63..16f8693 100644
|
||||
--- a/tests/Makefile.am
|
||||
+++ b/tests/Makefile.am
|
||||
@@ -32,6 +32,7 @@ TESTS = \
|
||||
crlf-handling \
|
||||
dash-o-append \
|
||||
deep-directories \
|
||||
+ ed-style \
|
||||
empty-files \
|
||||
false-match \
|
||||
fifo \
|
||||
diff --git a/tests/ed-style b/tests/ed-style
|
||||
new file mode 100644
|
||||
index 0000000..d8c0689
|
||||
--- /dev/null
|
||||
+++ b/tests/ed-style
|
||||
@@ -0,0 +1,41 @@
|
||||
+# Copyright (C) 2018 Free Software Foundation, Inc.
|
||||
+#
|
||||
+# Copying and distribution of this file, with or without modification,
|
||||
+# in any medium, are permitted without royalty provided the copyright
|
||||
+# notice and this notice are preserved.
|
||||
+
|
||||
+. $srcdir/test-lib.sh
|
||||
+
|
||||
+require cat
|
||||
+use_local_patch
|
||||
+use_tmpdir
|
||||
+
|
||||
+# ==============================================================
|
||||
+
|
||||
+cat > ed1.diff <<EOF
|
||||
+0a
|
||||
+foo
|
||||
+.
|
||||
+EOF
|
||||
+
|
||||
+check 'patch -e foo -i ed1.diff' <<EOF
|
||||
+EOF
|
||||
+
|
||||
+check 'cat foo' <<EOF
|
||||
+foo
|
||||
+EOF
|
||||
+
|
||||
+cat > ed2.diff <<EOF
|
||||
+1337a
|
||||
+r !echo bar
|
||||
+,p
|
||||
+EOF
|
||||
+
|
||||
+check 'patch -e foo -i ed2.diff 2> /dev/null || echo "Status: $?"' <<EOF
|
||||
+?
|
||||
+Status: 2
|
||||
+EOF
|
||||
+
|
||||
+check 'cat foo' <<EOF
|
||||
+foo
|
||||
+EOF
|
|
@ -1,25 +0,0 @@
|
|||
From: Andreas Gruenbacher <agruen@gnu.org>
|
||||
Date: Mon, 12 Feb 2018 16:48:24 +0100
|
||||
Subject: Fix segfault with mangled rename patch
|
||||
|
||||
http://savannah.gnu.org/bugs/?53132
|
||||
* src/pch.c (intuit_diff_type): Ensure that two filenames are specified
|
||||
for renames and copies (fix the existing check).
|
||||
---
|
||||
src/pch.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/pch.c b/src/pch.c
|
||||
index ff9ed2c..bc6278c 100644
|
||||
--- a/src/pch.c
|
||||
+++ b/src/pch.c
|
||||
@@ -974,7 +974,8 @@ intuit_diff_type (bool need_header, mode_t *p_file_type)
|
||||
if ((pch_rename () || pch_copy ())
|
||||
&& ! inname
|
||||
&& ! ((i == OLD || i == NEW) &&
|
||||
- p_name[! reverse] &&
|
||||
+ p_name[reverse] && p_name[! reverse] &&
|
||||
+ name_is_valid (p_name[reverse]) &&
|
||||
name_is_valid (p_name[! reverse])))
|
||||
{
|
||||
say ("Cannot %s file without two valid file names\n", pch_rename () ? "rename" : "copy");
|
|
@ -1,21 +0,0 @@
|
|||
From: "Laszlo Boszormenyi (GCS)" <gcs@debian.org>
|
||||
Date: Sat, 14 May 2022 02:38:24 +0800
|
||||
Subject: m-merge
|
||||
|
||||
---
|
||||
src/patch.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/patch.c b/src/patch.c
|
||||
index 0fe6d72..cb401ec 100644
|
||||
--- a/src/patch.c
|
||||
+++ b/src/patch.c
|
||||
@@ -719,7 +719,7 @@ reinitialize_almost_everything (void)
|
||||
}
|
||||
|
||||
static char const shortopts[] = "bB:cd:D:eEfF:g:i:l"
|
||||
-#if 0 && defined ENABLE_MERGE
|
||||
+#if defined ENABLE_MERGE
|
||||
"m"
|
||||
#endif
|
||||
"nNo:p:r:RstTuvV:x:Y:z:Z";
|
|
@ -1,24 +0,0 @@
|
|||
From: "Laszlo Boszormenyi (GCS)" <gcs@debian.org>
|
||||
Date: Sat, 14 May 2022 02:38:24 +0800
|
||||
Subject: path_max
|
||||
|
||||
---
|
||||
src/util.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/src/util.c b/src/util.c
|
||||
index b1c7266..f8f0dfa 100644
|
||||
--- a/src/util.c
|
||||
+++ b/src/util.c
|
||||
@@ -54,6 +54,11 @@
|
||||
|
||||
#include <safe.h>
|
||||
|
||||
+/* make GNU/Hurd happy */
|
||||
+#ifndef PATH_MAX
|
||||
+# define PATH_MAX 8192
|
||||
+#endif
|
||||
+
|
||||
static void makedirs (char const *);
|
||||
|
||||
typedef struct
|
|
@ -1,13 +0,0 @@
|
|||
path_max
|
||||
558485-backupmode
|
||||
m-merge
|
||||
Fix_segfault_with_mangled_rename_patch.patch
|
||||
Allow_input_files_to_be_missing_for_ed-style_patches.patch
|
||||
Fix_arbitrary_command_execution_in_ed-style_patches.patch
|
||||
0001-Fix-ed-style-test-failure.patch
|
||||
0002-Abort_when_cleaning_up_fails.patch
|
||||
0003-Do_not_crash_when_RLIMIT_NOFILE_is_set_to_RLIM_INFINITY.patch
|
||||
0004-CVE-2019-13636.patch
|
||||
0005-CVE-2019-13638.patch
|
||||
0006-Do_not_leak_temporary_file.patch
|
||||
0007-Do_not_leak_temporary_file_on_failed_multi-file.patch
|
|
@ -1 +1 @@
|
|||
3.0 (quilt)
|
||||
3.0 (native)
|
||||
|
|
Loading…
Reference in New Issue