summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* Version 2.7.6v2.7.6Andreas Gruenbacher2018-02-031-0/+7
| | | | * NEWS: Update.
* Fix typo in READMEAndreas Gruenbacher2018-02-031-1/+1
| | | | * README: Fix typo.
* Switch to gnupload moduleAndreas Gruenbacher2018-02-032-11/+3
| | | | | | * bootstrap.conf: use gnupload module. * (RELEASE_TYPE): Define, as maint.mk expects it to be defined. (tell-upload): Remove obsolete target.
* Remove stale reference to m4/utimbuf.m4Andreas Gruenbacher2018-02-031-1/+0
| | | | * Makefile.am (EXTRA_DIST): Remove stale reference to m4/utimbuf.m4.
* maint: update bootstrap and gnulib submoduleAndreas Gruenbacher2018-02-032-100/+152
| | | | * bootstrap: Update from gnulib.
* Clarify the error messages for malformed normal diff patchesAndreas Gruenbacher2018-01-231-2/+2
| | | | | * src/pch.c (another_hunk): Clarify the error messages for malformed normal diff patches.
* Create git diff files with indicated modeThomas Orgis2018-01-233-2/+58
| | | | | | | | | | * src/patch.c (main): Create git diff files with indicated mode. * tests/file-create-modes: New test case. * tests/Makefile.am (TESTS): Add test case. This fixes building current Linux 4.14.x from the signed tarball and patch file, where the patch creates a script with the executable bit set.
* gnulib: update to latestAndreas Gruenbacher2018-01-231-0/+0
|
* Don't use an undocumented Autoconf macroBruno Haible2018-01-231-3/+3
| | | | * configure.ac: Use AC_CONFIG_HEADERS instead of AC_CONFIG_HEADER.
* Don't allow hunks to overlapAndreas Gruenbacher2017-09-063-3/+59
| | | | | | * src/patch.c (locate_hunk): Don't allow a hunk to overlap with the previous one. * tests/false-match: Add regression test.
* patch.man: Clarify --forward descriptionAndreas Gruenbacher2017-09-061-2/+2
|
* gnulib: update to latestAndreas Gruenbacher2017-09-044-3/+16
|
* Rename canonicalize global variableTim Waugh2017-02-224-6/+6
| | | | | | | | | | | | | | | | | * src/common.h, src/merge.c (context_matches_file), src/patch.c (get_some_switches, patch_match), src/pch.c(another_hunk): Rename the global variable 'canonicalize' to 'canonicalize_ws'. Patch uses a global variable 'canonicalize' as part of its implementation of the --ignore-whitespace flag. In glibc there is a function canonicalize(): https://www.gnu.org/software/libc/manual/html_node/FP-Bit-Twiddling.html#index-canonicalize Rename the global variable so that it will not conflict. Original bug report: https://bugzilla.redhat.com/show_bug.cgi?id=1422463
* Add a missing NULL check in parse_nameHanno Boeck2016-08-101-1/+5
| | | | | * src/util.c (parse_name): parse_c_string() can fail and return NULL. Check for that so that we won't access the NULL pointer here.
* Fix out-of-bounds access to lines in a patchHanno Boeck2016-08-101-1/+1
| | | | | | This bug can trigger with malformed patches. * src/pch.c (pch_write_line): Avoid out-of-bounds access to p_line[line][p_len[line] - 1] when p_len[line] is 0.
* tests: use $PATCH rather than hard-coded pathJim Meyering2016-07-311-1/+1
| | | | * tests/git-cleanup: Don't hard-code program name.
* maint: placate a "make syntax-check" ruleJim Meyering2016-07-311-4/+4
| | | | | | * src/pch.c (set_hunkmax): Don't cast return value of xmalloc. (grow_hunkmax): Likewise for two uses of realloc that the syntax-check rule did not detect.
* maint: avoid new warning-errors from gcc-6.1Jim Meyering2016-07-313-6/+7
| | | | | | | | | | | | | | | | | | | | | When configured with --enable-gcc-warnings and gcc-6.1, ... * src/safe.c (count_path_components): Use _GL_ATTRIBUTE_PURE, to avoid an error from -Werror=suggest-attribute=pure. * src/util.h (filename_is_safe): Likewise. * src/patch.c (main): Placate -Werror=format= by casting pch_mode's mode_t return type to the "unsigned int" required to match the %o format string. * src/patch.c (delete_files): Correct indentation, to avoid this error from -Werror=misleading-indentation: patch.c: In function 'delete_files': patch.c:1816:4: error: this 'if' clause does not guard... if (verbosity == VERBOSE) ^~ patch.c:1820:6: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the 'if' move_file (0, 0, 0, file_to_delete->name, mode, ^~~~~~~~~
* gnulib: update to latestJim Meyering2016-07-312-0/+1
|
* Fix broken git-style patch behaviorAndreas Gruenbacher2016-07-273-17/+77
| | | | | | | | | | | | | | | | | When a git-syle patch is applied, all file modifications are done to temporary files which are put in place when the patch ends. When a patch fails, GNU patch was trying to "roll back" to the start. A bug in that code that lead to accidental file deletion was recently discovered by Richard Weinberger <richard@nod.at>. Even worse though, GNU patch should not exhibit this "rollback" behavior in the first place; that's not what people expect. Instead, the files modified so far should be put in place. * src/patch.c (cleanup): Put output files processed successfully in place instead of trying to "roll back" to the start. (forget_output_files): Remove obsolete (and broken) function. * tests/git-cleanup: New broken git-style patch test case that exercises the cleanup path. * tests/Makefile.am (TESTS): Add new test case.
* Fix inname test caseAndreas Gruenbacher2016-07-274-1/+51
| | | | | | | | | | | | | * src/safe.h (unsafe): New flag to allow turning off safe file operations. * src/safe.c (safe_xstat, safe_open, safe_rename, safe_mkdir, safe_rmdir, safe_unlink, safe_symlink, safe_chmod, safe_lchown, safe_lutimens, safe_readlink, safe_access): When safe file operations are turned off, skip safe path traversal. Any symlink checks of the last path component are still done though. * src/patch.c (main): When the file to patch is specified on the command line, turn off safe file operations. * tests/inname: Fix typo in test.
* Add context-format test to XFAIL_TESTS for nowAndreas Gruenbacher2016-07-271-1/+2
| | | | | * tests/Makefile.am (XFAIL_TESTS): Add context-format test until someone gets to fixing it.
* Add broken context-format test casesAndreas Gruenbacher2016-03-182-0/+41
| | | | | | * tests/context-format: Add context-format test cases from Mattias Andrée <maandree@member.fsf.org> that patch doesn't parse correctly.
* Don't use a zero-size array in struct symlinkAndreas Gruenbacher2015-10-031-6/+7
| | | | | | * src/safe.c (struct symlink): Get rid of the zero-size array which is a gcc extension. (read_symlink): Adapt to this struct symlink change.
* Input file outside current directory: add test caseAndreas Gruenbacher2015-07-201-2/+18
| | | | | | | Patch currently makes sure that input / output files are inside the current working directory even when the input files are explicitly specified on the command line (see http://savannah.gnu.org/bugs/?45581). * tests/inname: Add a test case for this bug.
* Terminate readlink stringTobias Stoeckmann2015-07-121-2/+4
| | | | | | | | The function readlink does not nul terminate its result string. safe_readlink is a wrapper for readlinkat, which has the same behaviour. * src/util.c (copy_file): Therefore, explicitly set '\0' and reserve one byte for it. (agruen: Reserve PATH_MAX + 1 bytes instead of only reading PATH_MAX - 1 characters.)
* Use xmalloc in bestmatchTobias Stoeckmann2015-07-081-1/+1
| | | | | * src/bestmatch.h (bestmatch): Use xmalloc instead of malloc to handle out-of-memory situations.
* Don't require traditional patch header after "git --diff"Andreas Gruenbacher2015-03-093-0/+35
| | | | | | | | | | Reported by Tim Waugh <twaugh@redhat.com>. * src/pch.c (intuit_diff_type): Don't require a traditional patch header ("--- old\n+++ new/n") after a "git --diff" header; the "git --diff" header gives us enough information for being able to process subsequent hunks. This deals with corrupted patches more gracefully. * tests/corrupt-patch: New test case. * tests/Makefile.am (TESTS): Add test case.
* Use gnulib size_max moduleAndreas Gruenbacher2015-03-082-0/+2
| | | | | * bootstrap.conf (gnulib_modules): Add size_max. * configure.ac: Call gl_SIZE_MAX.
* Version 2.7.5v2.7.5Andreas Gruenbacher2015-03-071-0/+6
| | | | * NEWS: Update.
* build: update gnulib submodule to latestAndreas Gruenbacher2015-03-071-0/+0
|
* Allow absolute symlinks that lead back into the working directoryAndreas Gruenbacher2015-03-072-3/+70
| | | | | | | | | | * src/safe.c (cwd_stat_errno, cwd_stat): stat() result of ".". (read_symlink): When a symlink is absolute, check if it leads back into the working directory. If it does, strip off the prefix above the working directory. If the symlink points to the working directory, return an empty path. (traverse_another_path): Recognize empty paths from read_symlink(). * tests/symlinks: Absolute symlink test cases.
* Describe better how the dirfd cache worksAndreas Gruenbacher2015-03-051-3/+11
|
* Use overflow safe arithmetic for counting cache missesAndreas Gruenbacher2015-03-051-4/+4
| | | | | * src/safe.c: We don't need a long counter if we use overflow-safe arithmetic here.
* Also cache resolved symlinksAndreas Gruenbacher2015-03-051-13/+53
| | | | | | | | | | | | | | | | | | When resolving a symlink in a pathname, we traverse each path component in the symlink and cache all of them. At the end, add an additional cache entry for the symlink itself so that we don't have to resolve the symlink again (even though this will usually be cached). Skip that if the symlink's parent isn't in the cache anymore, though. * src/safe.c (free_cached_dirfd): Remove from parent here instead of in callers. Move close() to remove_cached_dirfd() instead. (insert_cached_dirfd): Only insert if the entry's parent still exists; entries without parent are invalid (see compare_cached_dirfds()); "top-level" entries have cwd as their parent. (new_cached_dirfd): New function split off from openat_cached(). (openat_cached): Use new_cached_dirfd() here. (traverse_another_path): When starting to resolve a symlink, create an unhashed dirfd cache entry for the symlink lookup result. When the symlink is completely resolved, add that entry to the cache.
* Invalidate child dirfd cache entries when their parent goes awayAndreas Gruenbacher2015-03-051-0/+13
| | | | | | | | | | | | | | | If we don't do that, a directory could be removed from the cache, a new directory with the same dirfd could be created, and the entries from the old directory would appear in the new directory. * src/safe.c (struct cached_dirfd): Keep track of the children of each dirfd cache entry. (remove_cached_dirfd): Remove all the entry's children from the lookup hash, take them off the list of children, and initialize the children's children_link. Then, remove the entry itself from its parent. This has no effect if the entry doesn't have a parent because then, children_link is empty. (openat_cached): Add new dirfd cache entries to their parent's list of children and initialize the entry's list of children. (traverse_another_path): Also initialize cwd's list of children.
* Convert lru list into a list_head listAndreas Gruenbacher2015-03-051-38/+14
| | | | | | | | | | * src/safe.c (struct cached_dirfd): Replace prev and next with a lru_link list_head. (lru_list): Turn into a list_head. (lru_list_add, lru_list_del, lru_list_del_init): Replace by list_add(), list_del(), list_del_init(). (insert_cached_dirfd): Get to the list entry from the embedded list_head with the list_entry() macro.
* Add list_head based double linked listAndreas Gruenbacher2015-03-052-1/+57
| | | | | * src/list.h: New data structure. src/Makefile.am (patch_SOURCES): Add list.h.
* Invalidate dirfd less aggressivelyAndreas Gruenbacher2015-03-051-3/+7
| | | | | | | src/safe.c (safe_rename, safe_rmdir): Only invalidate cache entries when the underlying sycall succeeds and the entry actually goes away. This keeps the cache filled upon speculative rmdir when the directory may not be empty, for example.
* Add more path traversal test casesTim Waugh2015-03-051-4/+123
| | | | * tests/symlinks: Add more path traversal test cases.
* Move path traversal error reporting into main()Andreas Gruenbacher2015-03-052-13/+18
| | | | | | | * src/safe.c (traverse_another_path): Don't report errors here. * src/patch.c (main): Instead, recognize and report them here. Detect when an output file name is invalid; it doesn't make sense to try creating a reject file based on the same outbut file name in that case.
* Limit the number of path componentsAndreas Gruenbacher2015-03-051-3/+36
| | | | | | | src/safe.c (MAX_PATH_COMPONENTS): The maximum number of path components allowed. (count_path_components): New function. (traverse_another_path): Fail if the number of path components gets too high.
* Follow directory symlinks within the working directoryAndreas Gruenbacher2015-03-052-14/+108
| | | | | | | | | * src/safe.c (struct symlink): A symlink to resolve. (push_symlink, pop_symlink): New functions. (read_symlink): Create a new symlink stack entry. (traverse_next): Follow ".." components within the working directory. When hitting symlinks, "follow" them by reading and returning them. (traverse_another_path): Recursively traverse symlinks.
* Keep track of the directory hierarchyAndreas Gruenbacher2015-03-051-28/+55
| | | | | | | | | | | | * src/safe.c (struct cached_dirfd): Add parent pointer. Now that we know our parent, we no longer need to duplicate its directory file descriptor. (lookup_cached_dirfd): Don't update the lru list here. (insert_cached_dirfd): The lru list may now be empty even if the cache is not. (put_path): New function to put a path back into the lru list. (openat_cached): Take cached entried off the lru list. They are added back in put_path(). (traverse_another_path): Put lookup result back into the lru list with put_path().
* Refactor traverse_another_path() and helpersAndreas Gruenbacher2015-02-281-19/+23
| | | | | | | Prepare for keeping track of the directory hierarchy: * src/safe.c (traverse_another_path): Pass struct cached_dirfd to traverse_next(). (traverse_next, openat_cached): Pass through struct cached_dirfd.
* Move error reporting out of make_tempfile()Andreas Gruenbacher2015-02-284-3/+10
| | | | | | | * src/util.c (make_tempfile): Remove error reporting here. * src/inp.c (plan_b): Readd error reporting here. * src/patch.c (main): Likewise. * src/pch.c (open_patch_file): Likewise.
* Minor cosmetic changesAndreas Gruenbacher2015-02-281-4/+4
| | | | * src/safe.c: Minor cosmetic changes
* Fix handling of renamed filesAndreas Gruenbacher2015-02-222-5/+31
| | | | | | | | When a file has already been renamed, make sure it is not renamed back to its old name. Reported by Guido Draheim. * src/patch.c (main): Make sure we never rename a file back to its previous name. Report when a file was renamed already. * tests/copy-rename: Add "already renamed" test cases.
* Fix symlinks test case on some architecturesAndreas Gruenbacher2015-02-102-6/+16
| | | | | | | | | * src/safe.c: Include util.h for say(). Define EFTYPE if it isn't defined already. (traverse_another_path): When openat fails, also check for EMLINK, EFTYPE, and ENOTDIR. Change the error message to "file ... is not a directory" and only skip the rest of the patch instead of aborting. * tests/symlinks: Update.
* Test suite portability fixesAndreas Gruenbacher2015-02-043-4/+4
| | | | | | | | | Reported and fixed (mostly) by Christian Weisgerber <naddy@mips.inka.de>: * tests/deep-directories: Avoid the bash >& redirection operator. * tests/no-mode-change-git-diff: Instead of "stat -c", use "ls -l sed". * tests/read-only-files: A redirection failure for a special built-in causes some shells (FreeBSD sh, OpenBSD sh (pdksh), some bash --posix) to exit, and the colon command is a special built-in. Perform the redirection in a subshell.