summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* Fail when out of memory in set_hunkmax()v2.7.2Andreas Gruenbacher2015-01-202-6/+6
| | | | | | | | src/pch.c (another_hunk): Call set_hunkmax() from here to make sure it is called even when falling back from plan A to plan B. (open_patch_file): No need to call set_hunkmax() anymore. src/pch.c (set_hunkmax): Fail when out of memory. Make static. src/pch.h: Remove set_hunkmax() prototype.
* Don't try applying hunks at offsets that can't workAndreas Gruenbacher2015-01-201-4/+8
| | | | | | * src/patch.c (locate_hunk): Start trying to apply the hunk at the minimum offset which puts the hunk in the valid range of lines. This will often still be offset 0.
* Move symlink_target_is_valid() and cwd_is_root()Andreas Gruenbacher2015-01-204-78/+78
| | | | | * src/util.c: Move symlink_target_is_valid() and cwd_is_root() here from src/pch.c.
* Make sure symlinks don't point outside working directory (CVE-2015-119)Andreas Gruenbacher2015-01-195-0/+117
| | | | | | | | | | | When creating symlinks from git-style patches, make sure the symlinks don't point above the current working directory. Otherwise, a subsequent patch could use the symlink to write outside the working directory. * src/pch.c (symlink_target_is_valid): New function to check for valid symlink targets. * src/util.c (move_file): Use symlink_target_is_valid() here. * tests/symlinks: Add valid and invalid symlink test cases.
* Add line number overflow checkingAndreas Gruenbacher2014-11-303-3/+32
| | | | | | | | * bootstrap.conf: use intprops module. * src/common.h: Define LINENUM_MIN and LINENUM_MAX macros. * src/pch.c (another_hunk): Add line number overflow checking. Based on Robert C. Seacord's INT32-C document for integer overflow checking and Tobias Stoeckmann's "integer overflows and oob memory access" patch for FreeBSD.
* More savebuf/savestr error handlingAndreas Gruenbacher2014-11-303-10/+13
| | | | | | | | | | | | * bootstrap.conf: use xmemdup0 module. * src/pch.c (there_is_another_patch): Use xmemdup0 instead of savebuf when we cannot recover from out-of-memory situations. (intuit_diff_type): Likewise, use xstrdup instead of savestr. (another_hunk): Handle the case when savestr returns NULL. * src/util.c (fetchname, parse_name): Use xmemdup0 instead of savebuf when we cannot recover from out-of-memory situations. Bugs pointed out by Tobias Stoeckmann <tobias@stoeckmann.org>.
* savebuf/savestr error handlingTobias Stoeckmann2014-11-301-9/+9
| | | | | | | | * src/patch.c (get_some_switches): The function savebuf (and therefore savestr) copies strings using malloc. If malloc fails, NULL is returned. This is intentional behavior so that in case of failure during "plan a" patching, "plan b" can step in. The return value has to be properly checked for NULL. If the return value must not be NULL, use xstrdup instead.
* build: update gnulib submodule to latestAndreas Gruenbacher2014-11-303-5/+3
| | | | | | * src/merge.c (compute_changes): The TOO_EXPENSIVE heuristic in diffseq has been removed, including compareseq's find_minimal parameter and the context's too_expensive limit. Adjust.
* Drop useless test in another_hunk()Jean Delvare2014-11-101-1/+1
| | | | src/pch.c (another_hunk): This test will always succeed.
* Buffer overflow on malicious input fileTobias Stoeckmann2014-10-301-1/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | There is a hard to reach but possible buffer overflow when using patch with a very large (modified) input file. I doubt you will ever see this with a 64 bit system, but it's possible with 32 bit: $ echo hello > file1 $ echo world > file2 $ diff -Nau file1 file2 > file.diff Nothing fancy so far. Adjust file1 so it contains at least one line that is 2 GB in size. Larger is fine too, but stay below 4 GB. $ tr '\0' c < /dev/zero | dd bs=1K count=2097152 of=file1 Now try to patch it. $ patch -Np0 -i file.diff Segmentation fault The issue is in patch's "plan b" strategy (If your system would still want to use "plan a", force patch to use "plan b" through debug flag). Plan b writes lines into a temporary file, with equally long lines, so it can use a buffer mechanism to access them in a kind of randomly fassion. In order to do that, it retrieves the longest line. In this example, it will encounter the 2 GB line and stores that as the longest one. Afterwards it will adjust the tibufsize variable to be large enough: for (tibufsize = TIBUFSIZE_MINIMUM; tibufsize < maxlen; tibufsize <<= 1) /* do nothing */ ; Due to maxlen's size (2 GB), tibufsize will be SIZE_T_MAX, i.e. 4 GB. A few lines later it allocates space for the tibuf buffers: tibuf[0] = xmalloc (2 * tibufsize); tibuf[1] = tibuf[0] + tibufsize; This will allocate 0 bytes because tibufsize overflowed. The next time patch writes into the buffer, a segmentation fault will occur... Depends on your system how long it takes until that happens. ;) The fix is simple: Bail out on lines that are too long. Patch already does that for files that have too many lines.
* Improve error message when refusing to delete fileAndreas Gruenbacher2014-08-133-4/+8
| | | | | * src/patch.c: Improve error message. * tests/create-delete: Update the test case.
* Correct the --help text of option --mergeAndreas Gruenbacher2013-12-091-1/+1
| | | | | * src/patch.c (option_help): The --merge option does not have a short form; update the help text.
* Preserve function names in reject filesSteven Rostedt2013-08-193-3/+6
| | | | | | | * src/patch.c (main): Preserve function names in reject files. * tests/reject-format: Update the test case. Signed-off-by: Steven Rostedt <rostedt@goodmis.org> Signed-off-by: Andreas Gruenbacher <agruen@linbit.com>
* Test case for the dry-run fixAndreas Gruenbacher2013-07-301-3/+19
| | | | * tests/create-directory: Add test case here.
* In dry-run mode, create temporary files in a temporary directoryoriginAndreas Gruenbacher2013-07-301-1/+1
| | | | | | * src/util.c (make_tempfile): Do not create temporary files in the final output directory when in dry-run mode: the path may be read-only. In addition, we do not want to leave intermediary empty output directories around.
* Fix some formatting problems in the manpageEric S. Raymond2013-06-181-18/+28
| | | | | * patch.1: Use higher-level markup that translates better into HTML and other formats. (With changes by Andreas Gruenbacher.)
* build: don't use -Werror in AM_INIT_AUTOMAKEStefano Lattarini2013-05-021-1/+1
| | | | | | | | | | | | | | Doing so prevents bootstrapping with bleeding-edge autotools, because of harmless deprecation warnings (that are not planned to become hard errors for at least a few years to come). And unfortunately, options in AM_INIT_AUTOMAKE take precedence over those given on the command line (this is a long-time wart of automake). * configure.ac (AM_INIT_AUTOMAKE): Drop '-Werror' option. Copyright-paperwork-exempt: yes Signed-off-by: Stefano Lattarini <stefano.lattarini@gmail.com>
* Fix removing empty directoriesAndreas Gruenbacher2013-03-103-1/+31
| | | | | | | | | Reported by Thomas Moschny <thomas.moschny@gmx.de>: src/patch.c (main): Temporary output files are created in the same directory as the output file. Make sure to remove them before removing empty files and their empty ancestor directories; else the directories won't be empty. tests/remove-directories: Add directory removal test case. tests/Makefile.am (TESTS): Add new test case.
* Clarify the description of option --forwardAndreas Gruenbacher2013-01-031-2/+2
| | | | * patch.man: Clarify the description of option --forward.
* Initialize data structures early enoughAndreas Gruenbacher2012-10-043-4/+23
| | | | | | | * src/patch.c (main): Initialize data structures early enough, before error paths can access them. * tests/bad-usage: Test bad command line usage. * tests/Makefile.am (TESTS): Add bad-usage here.
* Don't fail test suite if printf '\0' is brokenAndreas Gruenbacher2012-09-301-4/+8
| | | | * tests/create-delete: Skip binary diff test if printf '\0' is broken.
* Version 2.7.1v2.7.1Andreas Gruenbacher2012-09-281-0/+2
|
* build: update gnulib submodule to latestAndreas Gruenbacher2012-09-281-0/+0
|
* Repair 'backup of unmodified file' testAndreas Gruenbacher2012-09-281-8/+5
| | | | tests/create-delete: Repair 'backup of unmodified file' test.
* Use gnulib errno module instead of our own default ENOTSUP fallbackAndreas Gruenbacher2012-09-282-4/+1
| | | | | * bootstrap.conf (gnulib_modules): Add errno module. * src/common.h: Remove ENOTSUP fallback.
* Trailing whitespace fixAndreas Gruenbacher2012-09-281-1/+1
| | | | * NEWS: Trailing whitespace fix.
* Improve the previous commitAndreas Gruenbacher2012-09-263-6/+27
| | | | | | | | * src/patch.c: Only print the "file is not empty after patch" message when trying to delete the output file. Say that we were trying to delete the file. * tests/create-delete: Fix the expected messages. Add test cases for the --remove-empty-files and --posix options. * NEWS: Better describe this change.
* Only expect files to become empty if the patch says soAndreas Gruenbacher2012-09-253-11/+73
| | | | | | | Test cases based on patches from Dmitry V. Levin <ldv@altlinux.org>. * src/patch.c (main): Only expect files to become empty if the patch says so. * NEWS: Document this change. * tests/create-delete: Add (more) empty vs. non-empty test cases.
* build: avoid gcc warnings from -Wsuggest-attribute=formatJim Meyering2012-09-221-0/+1
| | | | | * configure.ac (WARN_CFLAGS): Disable -Wsuggest-attribute=format, to avoid some warnings that are not worth working around.
* Update NEWSAndreas Gruenbacher2012-09-221-0/+13
| | | | * NEWS: Update.
* Improve messages when in --dry-run modeAndreas Gruenbacher2012-09-225-14/+24
| | | | | | | | * src/patch.c (main): Say that we are checking a file and not that we are patching it in --dry-run mode. Don't say "saving rejects to file" when we don't create reject files. * tests/reject-format: Add rejects with --dry-run test case. * tests/bad-filenames, tests/fifo, tests/mixed-patch-types: Update.
* Improve handling of LF vs. CRLF line endingsAndreas Gruenbacher2012-09-223-9/+47
| | | | | | | | | * src/patch.c (check_line_endings): New function. (main): When a hunk fails, report when the line endings differ between the input file and the patch. * src/pch.c (there_is_another_patch): When saying that we strip trailing CRs, also say how to turn this off. * tests/crlf-handling: Update changed messages. Add test case that fails.
* Ignore when preserving extended attributes is not supported or allowedAndreas Gruenbacher2012-09-222-6/+13
| | | | | * src/common.h (ENOTSUP): Make sure this error code is defined. * src/util.c (set_file_attributes): Ignore ENOSYS, ENOTSUP, and EPERM errors.
* Add a missing explanation in the tests/crlf-handling test caseAndreas Gruenbacher2012-09-201-0/+4
| | | | * tests/crlf-handling: Add explanation.
* Add --follow-symlinks option for backwards compatibilityAndreas Gruenbacher2012-09-195-1/+21
| | | | | | | | | * src/common.h (follow_symlinks): New variable. * src/patch.c (longopts): Add new --follow-symlinks option. (get_some_switches): Recognize the new option. * src/util.c (stat_file): Follow symlinks if requested. * patch.man: Document the new option. * tests/symlinks: Add test case.
* Introduce function to lstat all input filesAndreas Gruenbacher2012-09-195-21/+26
| | | | | | | | | | | * src/util.c (stat_file): New function. (move_file): Use here. * src/util.h (stat_file): Declare here. * src/inp.c (get_input_file): Use here. * src/patch.c (main): Use here. (delete_file_later): Use here. * src/pch.c (there_is_another_patch): Use here. (intuit_diff_type): Use here.
* Use stat where we want to follow symlinksAndreas Gruenbacher2012-09-191-3/+3
| | | | | * src/pch.c (prefix_components): Follow symlinks. (cwd_is_root): Follow symlinks.
* Document command-line options in alphabetic orderAndreas Gruenbacher2012-09-191-4/+4
| | | | | * patch.man: The options are mostly listen in alphabetical order; stick to that.
* Fix file truncation when switching from git diff to non-git diffAndreas Gruenbacher2012-09-182-6/+41
| | | | | | | | * src/patch.c (main): Output queued output files only when switching from a git diff to a non-git diff. This can modify the input file, so make sure to stat() it again. * tests/concat-git-diff: Add test case growing a file with a git diff and then with a non-git diff; without this fix; the result would be truncated.
* Rename get_input_file() parameter to clarify codeAndreas Gruenbacher2012-09-181-5/+5
| | | | | * src/inp.c (get_input_file): Rename mode parameter to file_type, it's all we care about here.
* Improve error message when patching a file of different typeAndreas Gruenbacher2012-09-182-4/+4
| | | | | | * src/inp.c (get_input_file): Improve error message when patching a file of different type. * tests/symlinks: Update test case.
* Minor test case updatesAndreas Gruenbacher2012-09-182-6/+6
| | | | | * tests/dash-o-append: Minor update (still expected to fail). * tests/symlinks: Minor update.
* Disable xattrs if libattr doesn't implement attr_copy_action()Andreas Gruenbacher2012-09-172-7/+2
| | | | | | | * m4/xattr.m4 (gl_FUNC_XATTR): Only enable USE_XATTR if both attr_copy_file() and attr_copy_action() are defined. * src/util.c (copy_attr_check): No fallback needed if attr_copy_action() is not defined.
* Allow to use potentially dangerous filenames from the root directoryAndreas Gruenbacher2012-09-172-0/+38
| | | | | | | | | * src/pch.c (cwd_is_root): New function to check if we are in the root directory of a filename. (name_is_valid): Allow to use potentially dangerous filenames when the current working directory is the root directory: from there, those names are not any more dangerous than other names. * tests/bad-filenames: New test case.
* Update leftover license notice in READMEAndreas Gruenbacher2012-09-141-7/+5
| | | | * README: Change leftover GPLv2 license notice to GPLv3.
* Check if libattr implements attr_copy_action()Andreas Gruenbacher2012-09-142-1/+7
| | | | | | * m4/xattr.m4 (gl_FUNC_XATTR): Check if attr_copy_action() is defined. * src/util.c: If attr_copy_action() doesn't exist, fall back to the default copy_attr_file() behavior of copying most extended attributes except ACLs.
* Change the type of *_needs_removal from int to boolAndreas Gruenbacher2012-09-137-23/+23
|
* In a git-style diff, make sure not to unlink the original by accidentAndreas Gruenbacher2012-09-132-2/+28
| | | | | | | | * src/patch.c (main): Fail if a file is not empty as expected. (output_files): In a git-style diff, make sure not to unlink the original when making a backup of an unmodified file. * tests/create-delete: Fix failed-file-deletion test and add successful-file-deletion test.
* Do not pass file type in mode of open(..., O_CREAT, mode)Andreas Gruenbacher2012-09-131-1/+2
| | | | | | * src/patch.c (main): Strip file type off of create mode for temporary output files: some systems don't ignore the file type; we want to create a regular file even when patching a symlink.
* Add note on GPLv3 license change in version 2.6Andreas Gruenbacher2012-09-131-0/+1
| | | | * NEWS: Add note.