head 1.2; access; symbols pkgsrc-2026Q3:1.1.0.66 pkgsrc-2026Q3-base:1.1 pkgsrc-2026Q2:1.1.0.64 pkgsrc-2026Q2-base:1.1 pkgsrc-2026Q1:1.1.0.62 pkgsrc-2026Q1-base:1.1 pkgsrc-2025Q4:1.1.0.60 pkgsrc-2025Q4-base:1.1 pkgsrc-2025Q3:1.1.0.58 pkgsrc-2025Q3-base:1.1 pkgsrc-2025Q2:1.1.0.56 pkgsrc-2025Q2-base:1.1 pkgsrc-2025Q1:1.1.0.54 pkgsrc-2025Q1-base:1.1 pkgsrc-2024Q4:1.1.0.52 pkgsrc-2024Q4-base:1.1 pkgsrc-2024Q3:1.1.0.50 pkgsrc-2024Q3-base:1.1 pkgsrc-2024Q2:1.1.0.48 pkgsrc-2024Q2-base:1.1 pkgsrc-2024Q1:1.1.0.46 pkgsrc-2024Q1-base:1.1 pkgsrc-2023Q4:1.1.0.44 pkgsrc-2023Q4-base:1.1 pkgsrc-2023Q3:1.1.0.42 pkgsrc-2023Q3-base:1.1 pkgsrc-2023Q2:1.1.0.40 pkgsrc-2023Q2-base:1.1 pkgsrc-2023Q1:1.1.0.38 pkgsrc-2023Q1-base:1.1 pkgsrc-2022Q4:1.1.0.36 pkgsrc-2022Q4-base:1.1 pkgsrc-2022Q3:1.1.0.34 pkgsrc-2022Q3-base:1.1 pkgsrc-2022Q2:1.1.0.32 pkgsrc-2022Q2-base:1.1 pkgsrc-2022Q1:1.1.0.30 pkgsrc-2022Q1-base:1.1 pkgsrc-2021Q4:1.1.0.28 pkgsrc-2021Q4-base:1.1 pkgsrc-2021Q3:1.1.0.26 pkgsrc-2021Q3-base:1.1 pkgsrc-2021Q2:1.1.0.24 pkgsrc-2021Q2-base:1.1 pkgsrc-2021Q1:1.1.0.22 pkgsrc-2021Q1-base:1.1 pkgsrc-2020Q4:1.1.0.20 pkgsrc-2020Q4-base:1.1 pkgsrc-2020Q3:1.1.0.18 pkgsrc-2020Q3-base:1.1 pkgsrc-2020Q2:1.1.0.16 pkgsrc-2020Q2-base:1.1 pkgsrc-2020Q1:1.1.0.12 pkgsrc-2020Q1-base:1.1 pkgsrc-2019Q4:1.1.0.14 pkgsrc-2019Q4-base:1.1 pkgsrc-2019Q3:1.1.0.10 pkgsrc-2019Q3-base:1.1 pkgsrc-2019Q2:1.1.0.8 pkgsrc-2019Q2-base:1.1 pkgsrc-2019Q1:1.1.0.6 pkgsrc-2019Q1-base:1.1 pkgsrc-2018Q4:1.1.0.4 pkgsrc-2018Q4-base:1.1 pkgsrc-2018Q3:1.1.0.2; locks; strict; comment @ * @; 1.2 date 2026.10.26.16.47.06; author wiz; state dead; branches; next 1.1; commitid Cq4CtWp7jzeFt01H; 1.1 date 2018.10.18.19.26.16; author leot; state Exp; branches 1.1.2.1; next ; commitid Ugghw0l1TCiyAtWA; 1.1.2.1 date 2018.10.18.19.26.16; author spz; state dead; branches; next 1.1.2.2; commitid 6HhEWZJwlzV5sIWA; 1.1.2.2 date 2018.10.20.16.12.15; author spz; state Exp; branches; next ; commitid 6HhEWZJwlzV5sIWA; desc @@ 1.2 log @patch: update to 2.8.1. Changes in version 2.8.1: * Prevent creation of out-of-tree files (CVE-2026-115207). Changes in version 2.8: * The --follow-symlinks option now applies to output files as well as input. * 'patch' now supports file timestamps after 2038 even on traditional GNU/Linux platforms where time_t defaults to 32 bits. * 'patch' no longer creates files with names containing newlines, as encouraged by POSIX.1-2024. * Patches can no longer contain NUL ('\0') bytes in diff directive lines. These bytes would otherwise cause unpredictable behavior. * Patches can now contain sequences of spaces and tabs around line numbers and in other places where POSIX requires support for these sequences. * --enable-gcc-warnings no longer uses expensive static checking. Use --enable-gcc-warnings=expensive if you still want it. * Fix undefined or ill-defined behavior in unusual cases, such as very large sizes, possible stack overflow, I/O errors, memory exhaustion, races with other processes, and signals arriving at inopportune moments. * Remove old "Plan B" code, designed for machines with 16-bit pointers. * Assume C99 or later; previously it assumed C89 or later. * Port to current GCC, Autoconf, Gnulib, etc. @ text @$NetBSD: patch-src_pch.c,v 1.1 2018/10/18 19:26:16 leot Exp $ - fixes: CVE-2018-6951 CVE-2018-6952 CVE-2018-1000156 - bugs: 53132 53133 53566 https://savannah.gnu.org/bugs/index.php? - commit ids: f290f48a62 9c986353e4 123eaff0d5 https://git.savannah.gnu.org/cgit/patch.git/diff/?id= --- src/pch.c.orig 2018-10-09 17:01:21.566749708 +0000 +++ src/pch.c @@@@ -33,6 +33,7 @@@@ # include #endif #include +#include #define INITHUNKMAX 125 /* initial dynamic allocation size */ @@@@ -974,7 +975,8 @@@@ intuit_diff_type (bool need_header, mode 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"); @@@@ -2113,7 +2115,7 @@@@ pch_swap (void) } if (p_efake >= 0) { /* fix non-freeable ptr range */ if (p_efake <= i) - n = p_end - i + 1; + n = p_end - p_ptrn_lines; else n = -i; p_efake += n; @@@@ -2388,22 +2390,27 @@@@ do_ed_script (char const *inname, char c 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) { - int exclusive = *outname_needs_removal ? 0 : O_EXCL; - assert (! inerrno); - *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)); - } + 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)); + } for (;;) { char ed_command_letter; beginning_of_this_line = file_tell (pfp); @@@@ -2414,14 +2421,14 @@@@ do_ed_script (char const *inname, char c } 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; @@@@ -2434,13 +2441,49 @@@@ do_ed_script (char const *inname, char c 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) { @ 1.1 log @patch: Backport patches for several security fixes pkgsrc changes: - Remove custom and no longer needed do-patch target, it was fixed upstream - Minor cosmetic improvements pointed out by pkglint Changes: - Backport patches for CVE-2018-6951, CVE-2018-6952 and CVE-2018-1000156 Patch provided by Attila Fülöp via NetBSD/pkgsrc#33, thanks! Bump PKGREVISION @ text @d1 1 a1 1 $NetBSD$ @ 1.1.2.1 log @file patch-src_pch.c was added on branch pkgsrc-2018Q3 on 2018-10-20 16:12:15 +0000 @ text @d1 155 @ 1.1.2.2 log @Pullup ticket #5847 - requested by bsiegert devel/patch: security patches Revisions pulled up: - devel/patch/Makefile 1.45 - devel/patch/distinfo 1.13 - devel/patch/patches/patch-src_pch.c 1.1 - devel/patch/patches/patch-tests_Makefile.in 1.1 - devel/patch/patches/patch-tests_ed-style 1.1 ------------------------------------------------------------------- Module Name: pkgsrc Committed By: leot Date: Thu Oct 18 19:26:16 UTC 2018 Modified Files: pkgsrc/devel/patch: Makefile distinfo Added Files: pkgsrc/devel/patch/patches: patch-src_pch.c patch-tests_Makefile.in patch-tests_ed-style Log Message: patch: Backport patches for several security fixes pkgsrc changes: - Remove custom and no longer needed do-patch target, it was fixed upstream - Minor cosmetic improvements pointed out by pkglint Changes: - Backport patches for CVE-2018-6951, CVE-2018-6952 and CVE-2018-1000156 Patch provided by Attila Fülöp via NetBSD/pkgsrc#33, thanks! Bump PKGREVISION To generate a diff of this commit: cvs rdiff -u -r1.44 -r1.45 pkgsrc/devel/patch/Makefile cvs rdiff -u -r1.12 -r1.13 pkgsrc/devel/patch/distinfo cvs rdiff -u -r0 -r1.1 pkgsrc/devel/patch/patches/patch-src_pch.c \ pkgsrc/devel/patch/patches/patch-tests_Makefile.in \ pkgsrc/devel/patch/patches/patch-tests_ed-style @ text @a0 155 $NetBSD$ - fixes: CVE-2018-6951 CVE-2018-6952 CVE-2018-1000156 - bugs: 53132 53133 53566 https://savannah.gnu.org/bugs/index.php? - commit ids: f290f48a62 9c986353e4 123eaff0d5 https://git.savannah.gnu.org/cgit/patch.git/diff/?id= --- src/pch.c.orig 2018-10-09 17:01:21.566749708 +0000 +++ src/pch.c @@@@ -33,6 +33,7 @@@@ # include #endif #include +#include #define INITHUNKMAX 125 /* initial dynamic allocation size */ @@@@ -974,7 +975,8 @@@@ intuit_diff_type (bool need_header, mode 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"); @@@@ -2113,7 +2115,7 @@@@ pch_swap (void) } if (p_efake >= 0) { /* fix non-freeable ptr range */ if (p_efake <= i) - n = p_end - i + 1; + n = p_end - p_ptrn_lines; else n = -i; p_efake += n; @@@@ -2388,22 +2390,27 @@@@ do_ed_script (char const *inname, char c 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) { - int exclusive = *outname_needs_removal ? 0 : O_EXCL; - assert (! inerrno); - *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)); - } + 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)); + } for (;;) { char ed_command_letter; beginning_of_this_line = file_tell (pfp); @@@@ -2414,14 +2421,14 @@@@ do_ed_script (char const *inname, char c } 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; @@@@ -2434,13 +2441,49 @@@@ do_ed_script (char const *inname, char c 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) { @