1. 28 Apr, 2017 8 commits
    • odb: verify hashes in read_prefix_1 · e0973bc0
      While the function reading an object from the complete OID already
      verifies OIDs, we do not yet do so for reading objects from a partial
      OID. Do so when strict OID verification is enabled.
      Patrick Steinhardt committed
    • odb: improve error handling in read_prefix_1 · 14109620
      The read_prefix_1 function has several return statements springled
      throughout the code. As we have to free memory upon getting an error,
      the free code has to be repeated at every single retrun -- which it is
      not, so we have a memory leak here.
      
      Refactor the code to use the typical `goto out` pattern, which will free
      data when an error has occurred. While we're at it, we can also improve
      the error message thrown when multiple ambiguous prefixes are found. It
      will now include the colliding prefixes.
      Patrick Steinhardt committed
    • odb: add option to turn off hash verification · 35079f50
      Verifying hashsums of objects we are reading from the ODB may be costly
      as we have to perform an additional hashsum calculation on the object.
      Especially when reading large objects, the penalty can be as high as
      35%, as can be seen when executing the equivalent of `git cat-file` with
      and without verification enabled. To mitigate for this, we add a global
      option for libgit2 which enables the developer to turn off the
      verification, e.g. when he can be reasonably sure that the objects on
      disk won't be corrupted.
      Patrick Steinhardt committed
    • odb: verify object hashes · 28a0741f
      The upstream git.git project verifies objects when looking them up from
      disk. This avoids scenarios where objects have somehow become corrupt on
      disk, e.g. due to hardware failures or bit flips. While our mantra is
      usually to follow upstream behavior, we do not do so in this case, as we
      never check hashes of objects we have just read from disk.
      
      To fix this, we create a new error class `GIT_EMISMATCH` which denotes
      that we have looked up an object with a hashsum mismatch. `odb_read_1`
      will then, after having read the object from its backend, hash the
      object and compare the resulting hash to the expected hash. If hashes do
      not match, it will return an error.
      
      This obviously introduces another computation of checksums and could
      potentially impact performance. Note though that we usually perform I/O
      operations directly before doing this computation, and as such the
      actual overhead should be drowned out by I/O. Running our test suite
      seems to confirm this guess. On a Linux system with best-of-five
      timings, we had 21.592s with the check enabled and 21.590s with the
      ckeck disabled. Note though that our test suite mostly contains very
      small blobs only. It is expected that repositories with bigger blobs may
      notice an increased hit by this check.
      
      In addition to a new test, we also had to change the
      odb::backend::nonrefreshing test suite, which now triggers a hashsum
      mismatch when looking up the commit "deadbeef...". This is expected, as
      the fake backend allocated inside of the test will return an empty
      object for the OID "deadbeef...", which will obviously not hash back to
      "deadbeef..." again. We can simply adjust the hash to equal the hash of
      the empty object here to fix this test.
      Patrick Steinhardt committed
    • tests: object: test looking up corrupted objects · d59dabe5
      We currently have no tests which check whether we fail reading corrupted
      objects. Add one which modifies contents of an object stored on disk and
      then tries to read the object.
      Patrick Steinhardt committed
    • tests: object: create sandbox · 86c03552
      The object::lookup tests do use the "testrepo.git" repository in a
      read-only way, so we do not set up the repository as a sandbox but
      simply open it. But in a future commit, we will want to test looking up
      objects which are corrupted in some way, which requires us to modify the
      on-disk data. Doing this in a repository without creating the sandbox
      will modify contents of our libgit2 repository, though.
      
      Create the repository in a sandbox to avoid this.
      Patrick Steinhardt committed
    • tests: odb: make hash of fake backend configurable · e29e8029
      In the odb::backend::nonrefreshing test suite, we set up a fake backend
      so that we are able to determine if backend functions are called
      correctly. During the setup, we also parse an OID which is later on used
      to read out the pseudo-object. While this procedure works right now, it
      will create problems later when we implement hash verification for
      looked up objects. The current OID ("deadbeef") will not match the hash
      of contents we give back to the ODB layer and thus cannot be verified.
      
      Make the hash configurable so that we can simply switch the returned for
      single tests.
      Patrick Steinhardt committed
    • Merge pull request #4191 from pks-t/pks/wt-ref-renames · 7df580fa
      Branch renames with worktrees
      Edward Thomson committed
  2. 26 Apr, 2017 5 commits
  3. 25 Apr, 2017 3 commits
  4. 21 Apr, 2017 3 commits
  5. 17 Apr, 2017 2 commits
  6. 12 Apr, 2017 2 commits
  7. 11 Apr, 2017 4 commits
  8. 10 Apr, 2017 2 commits
    • openssl_stream: use new initialization function on OpenSSL version >=1.1 · 88520151
      Previous to OpenSSL version 1.1, the user had to initialize at least the error
      strings as well as the SSL algorithms by himself. OpenSSL version 1.1 instead
      provides a new function `OPENSSL_init_ssl`, which handles initialization of all
      subsystems. As the new API call will by default load error strings and
      initialize the SSL algorithms, we can safely replace these calls when compiling
      against version 1.1 or later.
      
      This fixes a compiler error when compiling against OpenSSL version 1.1 which has
      been built without stubs for deprecated syntax.
      Patrick Steinhardt committed
    • openssl_stream: remove locking initialization on OpenSSL version >=1.1 · 29081c2f
      Up to version 1.0, OpenSSL required us to provide a callback which implements
      a locking mechanism. Due to problems in the API design though this mechanism was
      inherently broken, especially regarding that the locking callback cannot report
      errors in an obvious way. Due to this shortcoming, the locking initialization
      has been completely removed in OpenSSL version 1.1. As the library has also been
      refactored to not make any use of these callback functions, we can safely remove
      all initialization of the locking subsystem if compiling against OpenSSL version
      1.1 or higher.
      
      This fixes a compilation error when compiling against OpenSSL version 1.1 which
      has been built without stubs for deprecated syntax.
      Patrick Steinhardt committed
  9. 07 Apr, 2017 3 commits
    • filter: only close filter if it's been initialized correctly · cf07db2f
      In the function `git_filter_list_stream_data`, we initialize, write and
      subesquently close the stream which should receive content processed by
      the filter. While we skip writing to the stream if its initialization
      failed, we still try to close it unconditionally -- even if the
      initialization failed, where the stream might not be set at all, leading
      us to segfault.
      
      Semantics in this code is not really clear. The function handling the
      same logic for files instead of data seems to do the right thing here in
      only closing the stream when initialization succeeded. When stepping
      back a bit, this is only reasonable: if a stream cannot be initialized,
      the caller would not expect it to be closed again. So actually, both
      callers of `stream_list_init` fail to do so. The data streaming function
      will always close the stream and the file streaming function will not
      close the stream if writing to it has failed.
      
      The fix is thus two-fold:
      
      - callers of `stream_list_init` now close the stream iff it has been
        initialized
      - `stream_list_init` now closes the lastly initialized stream if
        the current stream in the chain failed to initialize
      
      Add a test which segfaulted previous to these changes.
      Patrick Steinhardt committed
    • Merge pull request #4193 from pks-t/pks/libdir · 44998cdb
      pkgconfig: fix handling of prefixes containing whitespaces
      Edward Thomson committed
  10. 05 Apr, 2017 8 commits