1. 10 9月, 2016 6 次提交
  2. 21 6月, 2016 1 次提交
    • M
      do_for_each_ref(): reimplement using reference iteration · 4c4de895
      Michael Haggerty 提交于
      Use the reference iterator interface to implement do_for_each_ref().
      Delete a bunch of code supporting the old for_each_ref() implementation.
      And now that do_for_each_ref() is generic code (it is no longer tied to
      the files backend), move it to refs.c.
      
      The implementation is via a new function, do_for_each_ref_iterator(),
      which takes a reference iterator as argument and calls a callback
      function for each of the references in the iterator.
      
      This change requires the current_ref performance hack for peel_ref() to
      be implemented via ref_iterator_peel() rather than peel_entry() because
      we don't have a ref_entry handy (it is hidden under three layers:
      file_ref_iterator, merge_ref_iterator, and cache_ref_iterator). So:
      
      * do_for_each_ref_iterator() records the active iterator in
        current_ref_iter while it is running.
      
      * peel_ref() checks whether current_ref_iter is pointing at the
        requested reference. If so, it asks the iterator to peel the
        reference (which it can do efficiently via its "peel" virtual
        function). For extra safety, we do the optimization only if the
        refname *addresses* are the same, not only if the refname *strings*
        are the same, to forestall possible mixups between refnames that come
        from different ref_iterators.
      
      Please note that this optimization of peel_ref() is only available when
      iterating via do_for_each_ref_iterator() (including all of the
      for_each_ref() functions, which call it indirectly). It would be
      complicated to implement a similar optimization when iterating directly
      using a reference iterator, because multiple reference iterators can be
      in use at the same time, with interleaved calls to
      ref_iterator_advance(). (In fact we do exactly that in
      merge_ref_iterator.)
      
      But that is not necessary. peel_ref() is only called while iterating
      over references. Callers who iterate using the for_each_ref() functions
      benefit from the optimization described above. Callers who iterate using
      reference iterators directly have access to the ref_iterator, so they
      can call ref_iterator_peel() themselves to get an analogous optimization
      in a more straightforward manner.
      
      If we rewrite all callers to use the reference iteration API, then we
      can remove the current_ref_iter hack permanently.
      Signed-off-by: NMichael Haggerty <mhagger@alum.mit.edu>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      4c4de895
  3. 13 6月, 2016 4 次提交
  4. 05 5月, 2016 3 次提交
  5. 11 4月, 2016 3 次提交
  6. 23 2月, 2016 3 次提交
    • J
      use st_add and st_mult for allocation size computation · 50a6c8ef
      Jeff King 提交于
      If our size computation overflows size_t, we may allocate a
      much smaller buffer than we expected and overflow it. It's
      probably impossible to trigger an overflow in most of these
      sites in practice, but it is easy enough convert their
      additions and multiplications into overflow-checking
      variants. This may be fixing real bugs, and it makes
      auditing the code easier.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      50a6c8ef
    • J
      convert trivial cases to FLEX_ARRAY macros · 96ffc06f
      Jeff King 提交于
      Using FLEX_ARRAY macros reduces the amount of manual
      computation size we have to do. It also ensures we don't
      overflow size_t, and it makes sure we write the same number
      of bytes that we allocated.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      96ffc06f
    • J
      use xmallocz to avoid size arithmetic · 3733e694
      Jeff King 提交于
      We frequently allocate strings as xmalloc(len + 1), where
      the extra 1 is for the NUL terminator. This can be done more
      simply with xmallocz, which also checks for integer
      overflow.
      
      There's no case where switching xmalloc(n+1) to xmallocz(n)
      is wrong; the result is the same length, and malloc made no
      guarantees about what was in the buffer anyway. But in some
      cases, we can stop manually placing NUL at the end of the
      allocated buffer. But that's only safe if it's clear that
      the contents will always fill the buffer.
      
      In each case where this patch does so, I manually examined
      the control flow, and I tried to err on the side of caution.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      3733e694
  7. 02 12月, 2015 1 次提交
    • S
      Make error message after failing commit_lock_file() less confusing · 08a3651f
      SZEDER Gábor 提交于
      The error message after a failing commit_lock_file() call sometimes
      looks like this, causing confusion:
      
        $ git remote add remote git@server.com/repo.git
        error: could not commit config file .git/config
        # Huh?!
        # I didn't want to commit anything, especially not my config file!
      
      While in the narrow context of the lockfile module using the verb
      'commit' in the error message makes perfect sense, in the broader
      context of git the word 'commit' already has a very specific meaning,
      hence the confusion.
      
      Reword these error messages to say "could not write" instead of "could
      not commit".
      
      While at it, include strerror in the error messages after writing the
      config file or the credential store fails to provide some information
      about the cause of the failure, and update the style of the error
      message after writing the reflog fails to match surrounding error
      messages (i.e. no '' around the pathname and no () around the error
      description).
      Signed-off-by: NSZEDER Gábor <szeder@ira.uka.de>
      Signed-off-by: NJeff King <peff@peff.net>
      08a3651f
  8. 20 11月, 2015 10 次提交
  9. 06 11月, 2015 1 次提交
    • L
      hideRefs: add support for matching full refs · 78a766ab
      Lukas Fleischer 提交于
      In addition to matching stripped refs, one can now add hideRefs
      patterns that the full (unstripped) ref is matched against. To
      distinguish between stripped and full matches, those new patterns
      must be prefixed with a circumflex (^).
      
      This commit also removes support for the undocumented and unintended
      hideRefs settings ".have" (suppressing all "have" lines) and
      "capabilities^{}" (suppressing the capabilities line).
      Signed-off-by: NLukas Fleischer <lfleischer@lfos.de>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      78a766ab
  10. 06 10月, 2015 2 次提交
    • J
      use strbuf_complete to conditionally append slash · 00b6c178
      Jeff King 提交于
      When working with paths in strbufs, we frequently want to
      ensure that a directory contains a trailing slash before
      appending to it. We can shorten this code (and make the
      intent more obvious) by calling strbuf_complete.
      
      Most of these cases are trivially identical conversions, but
      there are two things to note:
      
        - in a few cases we did not check that the strbuf is
          non-empty (which would lead to an out-of-bounds memory
          access). These were generally not triggerable in
          practice, either from earlier assertions, or typically
          because we would have just fed the strbuf to opendir(),
          which would choke on an empty path.
      
        - in a few cases we indexed the buffer with "original_len"
          or similar, rather than the current sb->len, and it is
          not immediately obvious from the diff that they are the
          same. In all of these cases, I manually verified that
          the strbuf does not change between the assignment and
          the strbuf_complete call.
      
      This does not convert cases which look like:
      
        if (sb->len && !is_dir_sep(sb->buf[sb->len - 1]))
      	  strbuf_addch(sb, '/');
      
      as those are obviously semantically different. Some of these
      cases arguably should be doing that, but that is out of
      scope for this change, which aims purely for cleanup with no
      behavior change (and at least it will make such sites easier
      to find and examine in the future, as we can grep for
      strbuf_complete).
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      00b6c178
    • J
      avoid sprintf and strcpy with flex arrays · c7ab0ba3
      Jeff King 提交于
      When we are allocating a struct with a FLEX_ARRAY member, we
      generally compute the size of the array and then sprintf or
      strcpy into it. Normally we could improve a dynamic allocation
      like this by using xstrfmt, but it doesn't work here; we
      have to account for the size of the rest of the struct.
      
      But we can improve things a bit by storing the length that
      we use for the allocation, and then feeding it to xsnprintf
      or memcpy, which makes it more obvious that we are not
      writing more than the allocated number of bytes.
      
      It would be nice if we had some kind of helper for
      allocating generic flex arrays, but it doesn't work that
      well:
      
       - the call signature is a little bit unwieldy:
      
            d = flex_struct(sizeof(*d), offsetof(d, path), fmt, ...);
      
         You need offsetof here instead of just writing to the
         end of the base size, because we don't know how the
         struct is packed (partially this is because FLEX_ARRAY
         might not be zero, though we can account for that; but
         the size of the struct may actually be rounded up for
         alignment, and we can't know that).
      
       - some sites do clever things, like over-allocating because
         they know they will write larger things into the buffer
         later (e.g., struct packed_git here).
      
      So we're better off to just write out each allocation (or
      add type-specific helpers, though many of these are one-off
      allocations anyway).
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      c7ab0ba3
  11. 26 9月, 2015 2 次提交
    • J
      resolve_ref: use strbufs for internal buffers · 495127db
      Jeff King 提交于
      resolve_ref already uses a strbuf internally when generating
      pathnames, but it uses fixed-size buffers for storing the
      refname and symbolic refs. This means that you cannot
      actually point HEAD to a ref that is larger than 256 bytes.
      
      We can lift this limit by using strbufs here, too. Like
      sb_path, we pass the the buffers into our helper function,
      so that we can easily clean up all output paths. We can also
      drop the "unsafe" name from our helper function, as it no
      longer uses a single static buffer (but of course
      resolve_ref_unsafe is still unsafe, because the static
      buffers moved there).
      
      As a bonus, we also get to drop some strcpy calls between
      the two fixed buffers (that cannot currently overflow
      because the two buffers are sized identically).
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      495127db
    • J
      convert trivial sprintf / strcpy calls to xsnprintf · 5096d490
      Jeff King 提交于
      We sometimes sprintf into fixed-size buffers when we know
      that the buffer is large enough to fit the input (either
      because it's a constant, or because it's numeric input that
      is bounded in size). Likewise with strcpy of constant
      strings.
      
      However, these sites make it hard to audit sprintf and
      strcpy calls for buffer overflows, as a reader has to
      cross-reference the size of the array with the input. Let's
      use xsnprintf instead, which communicates to a reader that
      we don't expect this to overflow (and catches the mistake in
      case we do).
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      5096d490
  12. 18 9月, 2015 1 次提交
  13. 02 9月, 2015 1 次提交
    • D
      refs: make refs/bisect/* per-worktree · ce414b33
      David Turner 提交于
      We need the place we stick refs for bisects in progress to not be
      shared between worktrees.  So we make the refs/bisect/ hierarchy
      per-worktree.
      
      The is_per_worktree_ref function and associated docs learn that
      refs/bisect/ is per-worktree, as does the git_path code in path.c
      
      The ref-packing functions learn that per-worktree refs should not be
      packed (since packed-refs is common rather than per-worktree).
      
      Since refs/bisect is per-worktree, logs/refs/bisect should be too.
      Signed-off-by: NDavid Turner <dturner@twopensource.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      ce414b33
  14. 12 8月, 2015 1 次提交
  15. 11 8月, 2015 1 次提交
    • J
      refs.c: remove_empty_directories can take a strbuf · 470e28d4
      Jeff King 提交于
      The first thing we do in this function is copy the input
      into a strbuf. Of the 4 callers, 3 of them already have a
      strbuf we could use. Let's just take the strbuf, and convert
      the remaining caller to use a strbuf, rather than a raw
      git_path. This is safer, anyway, as remove_dir_recursively
      is a non-trivial function that might use the pathname
      buffers itself (this is _probably_ OK, as the likely culprit
      would be calling resolve_gitlink_ref, but we do not pass the
      proper flags to ask it to avoid blowing away gitlinks).
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      470e28d4