summaryrefslogtreecommitdiff
path: root/src/delta.c
Commit message (Collapse)AuthorAgeFilesLines
* delta: validate sizes and cast safelyEdward Thomson2019-01-251-4/+11
| | | | | Quiet down a warning from MSVC about how we're potentially losing data. Validate that our data will fit into the type provided then cast.
* git_error: use new names in internal APIs and usageEdward Thomson2019-01-221-14/+14
| | | | | Move to the `git_error` name in the internal API for error-related functions.
* delta: fix overflow when computing limitPatrick Steinhardt2018-07-051-2/+4
| | | | | | | | | | | | | | When checking whether a delta base offset and length fit into the base we have in memory already, we can trigger an overflow which breaks the check. This would subsequently result in us reading memory from out of bounds of the base. The issue is easily fixed by checking for overflow when adding `off` and `len`, thus guaranteeting that we are never indexing beyond `base_len`. This corresponds to the git patch 8960844a7 (check patch_delta bounds more carefully, 2006-04-07), which adds these overflow checks. Reported-by: Riccardo Schirone <rschiron@redhat.com>
* delta: fix out-of-bounds read of deltaPatrick Steinhardt2018-06-291-8/+10
| | | | | | | | | | | When computing the offset and length of the delta base, we repeatedly increment the `delta` pointer without checking whether we have advanced past its end already, which can thus result in an out-of-bounds read. Fix this by repeatedly checking whether we have reached the end. Add a test which would cause Valgrind to produce an error. Reported-by: Riccardo Schirone <rschiron@redhat.com> Test-provided-by: Riccardo Schirone <rschiron@redhat.com>
* delta: fix sign-extension of big left-shiftPatrick Steinhardt2018-06-291-17/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Our delta code was originally adapted from JGit, which itself adapted it from git itself. Due to this heritage, we inherited a bug from git.git in how we compute the delta offset, which was fixed upstream in 48fb7deb5 (Fix big left-shifts of unsigned char, 2009-06-17). As explained by Linus: Shifting 'unsigned char' or 'unsigned short' left can result in sign extension errors, since the C integer promotion rules means that the unsigned char/short will get implicitly promoted to a signed 'int' due to the shift (or due to other operations). This normally doesn't matter, but if you shift things up sufficiently, it will now set the sign bit in 'int', and a subsequent cast to a bigger type (eg 'long' or 'unsigned long') will now sign-extend the value despite the original expression being unsigned. One example of this would be something like unsigned long size; unsigned char c; size += c << 24; where despite all the variables being unsigned, 'c << 24' ends up being a signed entity, and will get sign-extended when then doing the addition in an 'unsigned long' type. Since git uses 'unsigned char' pointers extensively, we actually have this bug in a couple of places. In our delta code, we inherited such a bogus shift when computing the offset at which the delta base is to be found. Due to the sign extension we can end up with an offset where all the bits are set. This can allow an arbitrary memory read, as the addition in `base_len < off + len` can now overflow if `off` has all its bits set. Fix the issue by casting the result of `*delta++ << 24UL` to an unsigned integer again. Add a test with a crafted delta that would actually succeed with an out-of-bounds read in case where the cast wouldn't exist. Reported-by: Riccardo Schirone <rschiron@redhat.com> Test-provided-by: Riccardo Schirone <rschiron@redhat.com>
* giterr_set: consistent error messagesEdward Thomson2016-12-291-4/+4
| | | | | | | | Error messages should be sentence fragments, and therefore: 1. Should not begin with a capital letter, 2. Should not conclude with punctuation, and 3. Should not end a sentence and begin a new one
* delta: refactor git_delta functions for consistencyEdward Thomson2016-05-261-63/+72
| | | | | Refactor the git_delta functions to have consistent naming and parameters with the rest of the library.
* delta: move delta application to delta.cEdward Thomson2016-05-261-0/+167
| | | | | | | Move the delta application functions into `delta.c`, next to the similar delta creation functions. Make the `git__delta_apply` functions adhere to other naming and parameter style within the library.
* Make our overflow check look more like gcc/clang'sEdward Thomson2015-02-131-12/+5
| | | | | | | | | Make our overflow checking look more like gcc and clang's, so that we can substitute it out with the compiler instrinsics on platforms that support it. This means dropping the ability to pass `NULL` as an out parameter. As a result, the macros also get updated to reflect this as well.
* overflow checking: don't make callers set oomEdward Thomson2015-02-121-1/+1
| | | | | | Have the ALLOC_OVERFLOW testing macros also simply set_oom in the case where a computation would overflow, so that callers don't need to.
* allocations: test for overflow of requested sizeEdward Thomson2015-02-121-6/+32
| | | | | Introduce some helper macros to test integer overflow from arithmetic and set error message appropriately.
* Fixed left shift size of int.Jared Wong2013-12-081-1/+1
| | | | | Simply switched the ordering of the checks in the for loop where this left shift was being made.
* Fixing unwrapped callocRussell Belfer2013-05-271-1/+1
|
* update copyrightsEdward Thomson2013-01-081-1/+1
|
* Revert changes from git/git diff-delta.c by dak@gnu.org, proski@gnu.orgPhilip Kelley2013-01-071-98/+28
|
* Fix warnings on Win64 buildRussell Belfer2012-11-271-9/+12
|
* Add diff-delta code from git.gitMichael Schubert2012-10-091-0/+491