1. 05 Jul, 2018 1 commit
    • delta: fix sign-extension of big left-shift · 8ab4f363
      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>
      Patrick Steinhardt committed
  2. 04 Jun, 2018 1 commit
  3. 01 Jun, 2018 23 commits
  4. 12 Mar, 2018 3 commits
  5. 10 Mar, 2018 12 commits
    • curl: explicitly initialize and cleanup global curl state · b35c3098
      Our curl-based streams make use of the easy curl interface. This
      interface automatically initializes and de-initializes the global curl
      state by calling out to `curl_global_init` and `curl_global_cleanup`.
      Thus, all global state will be repeatedly re-initialized when creating
      multiple curl streams in succession. Despite being inefficient, this is
      not thread-safe due to `curl_global_init` being not thread-safe itself.
      Thus a multi-threaded programing handling multiple curl streams at the
      same time is inherently racy.
      
      Fix the issue by globally initializing and cleaning up curl's state.
      Patrick Steinhardt committed
    • tree: initialize the id we use for testing submodule insertions · 9e98f49d
      Instead of laving it uninitialized and relying on luck for it to be non-zero,
      let's give it a dummy hash so we make valgrind happy (in this case the hash
      comes from `sha1sum </dev/null`.
      Carlos Martín Nieto committed
    • win32: strncmp -> git__strncmp · c24b15c3
      The win32 C library is compiled cdecl, however when configured with
      `STDCALL=ON`, our functions (and function pointers) will use the stdcall
      calling convention.  You cannot set a `__stdcall` function pointer to a
      `__cdecl` function, so it's easier to just use our `git__strncmp`
      instead of sorting that mess out.
      Edward Thomson committed
    • winhttp: enable TLS 1.2 on Windows 7 and earlier · 9ab8d153
      Versions of Windows prior to Windows 8 do not enable TLS 1.2 by default,
      though support may exist.  Try to enable TLS 1.2 support explicitly on
      connections.
      
      This request may fail if the operating system does not have TLS 1.2
      support - the initial release of Vista lacks TLS 1.2 support (though
      it is available as a software update) and XP completely lacks TLS 1.2
      support.  If this request does fail, the HTTP context is still valid,
      and still maintains the original protocol support.  So we ignore the
      failure from this operation.
      Edward Thomson committed
    • winhttp: include constants for TLS 1.1/1.2 support · aa0127c0
      For platforms that do not define `WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_1`
      and/or `WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2`.
      Edward Thomson committed
    • mingw: update TLS option flags · 9bdc00b1
      Include the constants for `WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_1` and
      `WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2` so that they can be used by mingw.
      
      This updates both the `deps/winhttp` framework (for classic mingw) and
      adds the defines for mingw64, which does not use that framework.
      Edward Thomson committed
    • checkout test: further ensure workdir perms are updated · 1b853c48
      When both the index _and_ the working directory has changed
      permissions on a file permissions on a file - but only the permissions,
      such that the contents of the file are identical - ensure that
      `git_checkout` updates the permissions to match the checkout target.
      Edward Thomson committed
    • checkout test: ensure workdir perms are updated · 73615900
      When the working directory has changed permissions on a file - but only
      the permissions, such that the contents of the file are identical -
      ensure that `git_checkout` updates the permissions to match the checkout
      target.
      Edward Thomson committed
    • checkout: take mode into account when comparing index to baseline · 3983fc1d
      When checking out a file, we determine whether the baseline (what we
      expect to be in the working directory) actually matches the contents
      of the working directory.  This is safe behavior to prevent us from
      overwriting changes in the working directory.
      
      We look at the index to optimize this test: if we know that the index
      matches the working directory, then we can simply look at the index
      data compared to the baseline.
      
      We have historically compared the baseline to the index entry by oid.
      However, we must also compare the mode of the two items to ensure that
      they are identical.  Otherwise, we will refuse to update the working
      directory for a mode change.
      Edward Thomson committed
    • diff_tform: fix rename detection with rewrite/delete pair · e74e05ed
      A rewritten file can either be classified as a modification of its
      contents or of a delete of the complete file followed by an addition of
      the new content. This distinction becomes important when we want to
      detect renames for rewrites. Given a scenario where a file "a" has been
      deleted and another file "b" has been renamed to "a", this should be
      detected as a deletion of "a" followed by a rename of "a" -> "b". Thus,
      splitting of the original rewrite into a delete/add pair is important
      here.
      
      This splitting is represented by a flag we can set at the current delta.
      While the flag is already being set in case we want to break rewrites,
      we do not do so in case where the `GIT_DIFF_FIND_RENAMES_FROM_REWRITES`
      flag is set. This can trigger an assert when we try to match the source
      and target deltas.
      
      Fix the issue by setting the `GIT_DIFF_FLAG__TO_SPLIT` flag at the delta
      when it is a rename target and `GIT_DIFF_FIND_RENAMES_FROM_REWRITES` is
      set.
      Patrick Steinhardt committed
    • tests: add rename-rewrite scenarios to "renames" repository · e229e90d
      Add two more scenarios to the "renames" repository. The first scenario
      has a major rewrite of a file and a delete of another file, the second
      scenario has a deletion of a file and rename of another file to the
      deleted file. Both scenarios will be used in the following commit.
      Patrick Steinhardt committed
    • tests: diff::rename: use defines for commit OIDs · be205dfa
      While we frequently reuse commit OIDs throughout the file, we do not
      have any constants to refer to these commits. Make this a bit easier to
      read by giving the commit OIDs somewhat descriptive names of what kind
      of commit they refer to.
      Patrick Steinhardt committed