1. 23 2月, 2016 5 次提交
    • J
      convert trivial cases to ALLOC_ARRAY · b32fa95f
      Jeff King 提交于
      Each of these cases can be converted to use ALLOC_ARRAY or
      REALLOC_ARRAY, which has two advantages:
      
        1. It automatically checks the array-size multiplication
           for overflow.
      
        2. It always uses sizeof(*array) for the element-size,
           so that it can never go out of sync with the declared
           type of the array.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      b32fa95f
    • J
      convert manual allocations to argv_array · 850d2fec
      Jeff King 提交于
      There are many manual argv allocations that predate the
      argv_array API. Switching to that API brings a few
      advantages:
      
        1. We no longer have to manually compute the correct final
           array size (so it's one less thing we can screw up).
      
        2. In many cases we had to make a separate pass to count,
           then allocate, then fill in the array. Now we can do it
           in one pass, making the code shorter and easier to
           follow.
      
        3. argv_array handles memory ownership for us, making it
           more obvious when things should be free()d and and when
           not.
      
      Most of these cases are pretty straightforward. In some, we
      switch from "run_command_v" to "run_command" which lets us
      directly use the argv_array embedded in "struct
      child_process".
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      850d2fec
    • J
      argv-array: add detach function · b992657e
      Jeff King 提交于
      The usual pattern for an argv array is to initialize it,
      push in some strings, and then clear it when done. Very
      occasionally, though, we must do other exotic things with
      the memory, like freeing the list but keeping the strings.
      Let's provide a detach function so that callers can make use
      of our API to build up the array, and then take ownership of
      it.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      b992657e
    • J
      add helpers for allocating flex-array structs · 36895391
      Jeff King 提交于
      Allocating a struct with a flex array is pretty simple in
      practice: you over-allocate the struct, then copy some data
      into the over-allocation. But it can be a slight pain to
      make sure you're allocating and copying the right amounts.
      
      This patch adds a few helpers to turn simple cases of
      flex-array struct allocation into a one-liner that properly
      checks for overflow. See the embedded documentation for
      details.
      
      Ideally we could provide a more flexible version that could
      handle multiple strings, like:
      
        FLEX_ALLOC_FMT(ref, name, "%s%s", prefix, name);
      
      But we have to implement this as a macro (because of the
      offset calculation of the flex member), which means we would
      need all compilers to support variadic macros.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      36895391
    • J
      harden REALLOC_ARRAY and xcalloc against size_t overflow · e7792a74
      Jeff King 提交于
      REALLOC_ARRAY inherently involves a multiplication which can
      overflow size_t, resulting in a much smaller buffer than we
      think we've allocated. We can easily harden it by using
      st_mult() to check for overflow.  Likewise, we can add
      ALLOC_ARRAY to do the same thing for xmalloc calls.
      
      xcalloc() should already be fine, because it takes the two
      factors separately, assuming the system calloc actually
      checks for overflow. However, before we even hit the system
      calloc(), we do our memory_limit_check, which involves a
      multiplication. Let's check for overflow ourselves so that
      this limit cannot be bypassed.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      e7792a74
  2. 20 2月, 2016 3 次提交
    • J
      tree-diff: catch integer overflow in combine_diff_path allocation · 5b442c4f
      Jeff King 提交于
      A combine_diff_path struct has two "flex" members allocated
      alongside the struct: a string to hold the pathname, and an
      array of parent pointers. We use an "int" to compute this,
      meaning we may easily overflow it if the pathname is
      extremely long.
      
      We can fix this by using size_t, and checking for overflow
      with the st_add helper.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      5b442c4f
    • J
      add helpers for detecting size_t overflow · 320d0b49
      Jeff King 提交于
      Performing computations on size_t variables that we feed to
      xmalloc and friends can be dangerous, as an integer overflow
      can cause us to allocate a much smaller chunk than we
      realized.
      
      We already have unsigned_add_overflows(), but let's add
      unsigned_mult_overflows() to that. Furthermore, rather than
      have each site manually check and die on overflow, we can
      provide some helpers that will:
      
        - promote the arguments to size_t, so that we know we are
          doing our computation in the same size of integer that
          will ultimately be fed to xmalloc
      
        - check and die on overflow
      
        - return the result so that computations can be done in
          the parameter list of xmalloc.
      
      These functions are a lot uglier to use than normal
      arithmetic operators (you have to do "st_add(foo, bar)"
      instead of "foo + bar"). To at least limit the damage, we
      also provide multi-valued versions. So rather than:
      
        st_add(st_add(a, b), st_add(c, d));
      
      you can write:
      
        st_add4(a, b, c, d);
      
      This isn't nearly as elegant as a varargs function, but it's
      a lot harder to get it wrong. You don't have to remember to
      add a sentinel value at the end, and the compiler will
      complain if you get the number of arguments wrong. This
      patch adds only the numbered variants required to convert
      the current code base; we can easily add more later if
      needed.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      320d0b49
    • J
      reflog_expire_cfg: NUL-terminate pattern field · c3a700fb
      Jeff King 提交于
      You can tweak the reflog expiration for a particular subset
      of refs by configuring gc.foo.reflogexpire. We keep a linked
      list of reflog_expire_cfg structs, each of which holds the
      pattern and a "len" field for the length of the pattern. The
      pattern itself is _not_ NUL-terminated.
      
      However, we feed the pattern directly to wildmatch(), which
      expects a NUL-terminated string, meaning it may keep reading
      random junk after our struct.
      
      We can fix this by allocating an extra byte for the NUL
      (which is already zero because we use xcalloc). Let's also
      drop the misleading "len" field, which is no longer
      necessary. The existing use of "len" can be converted to use
      strncmp().
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      c3a700fb
  3. 06 2月, 2016 29 次提交
    • J
      Git 2.7.1 · a08595f7
      Junio C Hamano 提交于
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      a08595f7
    • J
      Merge branch 'lv/add-doc-working-tree' into maint · 5276be84
      Junio C Hamano 提交于
      * lv/add-doc-working-tree:
        git-add doc: do not say working directory when you mean working tree
      5276be84
    • J
      Merge branch 'ss/clone-depth-single-doc' into maint · 2db7d79b
      Junio C Hamano 提交于
      Documentation for "git fetch --depth" has been updated for clarity.
      
      * ss/clone-depth-single-doc:
        docs: clarify that --depth for git-fetch works with newly initialized repos
        docs: say "commits" in the --depth option wording for git-clone
        docs: clarify that passing --depth to git-clone implies --single-branch
      2db7d79b
    • J
      Merge branch 'sg/t6050-failing-editor-test-fix' into maint · 0298675a
      Junio C Hamano 提交于
      * sg/t6050-failing-editor-test-fix:
        t6050-replace: make failing editor test more robust
      0298675a
    • J
      Merge branch 'ew/for-each-ref-doc' into maint · 01517bd2
      Junio C Hamano 提交于
      * ew/for-each-ref-doc:
        for-each-ref: document `creatordate` and `creator` fields
      01517bd2
    • J
      Merge branch 'ss/user-manual' into maint · 353f6855
      Junio C Hamano 提交于
      Drop a few old "todo" items by deciding that the change one of them
      suggests is not such a good idea, and doing the change the other
      one suggested to do.
      
      * ss/user-manual:
        user-manual: add addition gitweb information
        user-manual: add section documenting shallow clones
        glossary: define the term shallow clone
        user-manual: remove temporary branch entry from todo list
      353f6855
    • J
      Merge branch 'jk/ref-cache-non-repository-optim' into maint · e2d77390
      Junio C Hamano 提交于
      The underlying machinery used by "ls-files -o" and other commands
      have been taught not to create empty submodule ref cache for a
      directory that is not a submodule.  This removes a ton of wasted
      CPU cycles.
      
      * jk/ref-cache-non-repository-optim:
        resolve_gitlink_ref: ignore non-repository paths
        clean: make is_git_repository a public function
      e2d77390
    • J
      Merge branch 'js/dirname-basename' into maint · 07be1da2
      Junio C Hamano 提交于
      dirname() emulation has been added, as Msys2 lacks it.
      
      * js/dirname-basename:
        mingw: avoid linking to the C library's isalpha()
        t0060: loosen overly strict expectations
        t0060: verify that basename() and dirname() work as expected
        compat/basename.c: provide a dirname() compatibility function
        compat/basename: make basename() conform to POSIX
        Refactor skipping DOS drive prefixes
      07be1da2
    • J
      Merge branch 'tb/complete-word-diff-regex' into maint · 081363dd
      Junio C Hamano 提交于
      * tb/complete-word-diff-regex:
        completion: complete "diff --word-diff-regex="
      081363dd
    • J
      Merge branch 'pw/completion-stash' into maint · 0a8748d8
      Junio C Hamano 提交于
      * pw/completion-stash:
        completion: update completion arguments for stash
      0a8748d8
    • J
      Merge branch 'pw/completion-show-branch' into maint · 39abb2ed
      Junio C Hamano 提交于
      * pw/completion-show-branch:
        completion: complete show-branch "--date-order"
      39abb2ed
    • J
      Merge branch 'jk/completion-rebase' into maint · d509fa44
      Junio C Hamano 提交于
      * jk/completion-rebase:
        completion: add missing git-rebase options
      d509fa44
    • J
      Merge branch 'nd/diff-with-path-params' into maint · 02dab5d3
      Junio C Hamano 提交于
      A few options of "git diff" did not work well when the command was
      run from a subdirectory.
      
      * nd/diff-with-path-params:
        diff: make -O and --output work in subdirectory
        diff-no-index: do not take a redundant prefix argument
      02dab5d3
    • J
      Merge branch 'dw/subtree-split-do-not-drop-merge' into maint · 6a65bdcc
      Junio C Hamano 提交于
      The "split" subcommand of "git subtree" (in contrib/) incorrectly
      skipped merges when it shouldn't, which was corrected.
      
      * dw/subtree-split-do-not-drop-merge:
        contrib/subtree: fix "subtree split" skipped-merge bug
      6a65bdcc
    • J
      Merge branch 'ew/svn-1.9.0-auth' into maint · 0244713d
      Junio C Hamano 提交于
      * ew/svn-1.9.0-auth:
        git-svn: fix auth parameter handling on SVN 1.9.0+
      0244713d
    • J
      Merge branch 'jk/list-tag-2.7-regression' into maint · 88ec75db
      Junio C Hamano 提交于
      "git tag" started listing a tag "foo" as "tags/foo" when a branch
      named "foo" exists in the same repository; remove this unnecessary
      disambiguation, which is a regression introduced in v2.7.0.
      
      * jk/list-tag-2.7-regression:
        tag: do not show ambiguous tag names as "tags/foo"
        t6300: use test_atom for some un-modern tests
      88ec75db
    • J
      Merge branch 'jk/sanity' into maint · 913c2c7c
      Junio C Hamano 提交于
      The description for SANITY prerequisite the test suite uses has
      been clarified both in the comment and in the implementation.
      
      * jk/sanity:
        test-lib: clarify and tighten SANITY
      913c2c7c
    • J
      Merge branch 'jk/filter-branch-no-index' into maint · 16f5e268
      Junio C Hamano 提交于
      A recent optimization to filter-branch in v2.7.0 introduced a
      regression when --prune-empty filter is used, which has been
      corrected.
      
      * jk/filter-branch-no-index:
        filter-branch: resolve $commit^{tree} in no-index case
      16f5e268
    • J
      Merge branch 'js/close-packs-before-gc' into maint · f748e691
      Junio C Hamano 提交于
      Many codepaths that run "gc --auto" before exiting kept packfiles
      mapped and left the file descriptors to them open, which was not
      friendly to systems that cannot remove files that are open.  They
      now close the packs before doing so.
      
      * js/close-packs-before-gc:
        receive-pack: release pack files before garbage-collecting
        merge: release pack files before garbage-collecting
        am: release pack files before garbage-collecting
        fetch: release pack files before garbage-collecting
      f748e691
    • J
      Merge branch 'jk/ok-to-fail-gc-auto-in-rebase' into maint · b11a3bad
      Junio C Hamano 提交于
      "git rebase", unlike all other callers of "gc --auto", did not
      ignore the exit code from "gc --auto".
      
      * jk/ok-to-fail-gc-auto-in-rebase:
        rebase: ignore failures from "gc --auto"
      b11a3bad
    • J
      Merge branch 'ho/gitweb-squelch-undef-warning' into maint · 15f40964
      Junio C Hamano 提交于
      Asking gitweb for a nonexistent commit left a warning in the server
      log.
      
      Somebody may want to follow this up with a new test, perhaps?
      IIRC, we do test that no Perl warnings are given to the server log,
      so this should have been caught if our test coverage were good.
      
      * ho/gitweb-squelch-undef-warning:
        gitweb: squelch "uninitialized value" warning
      15f40964
    • J
      Merge branch 'js/fopen-harder' into maint · da07df3e
      Junio C Hamano 提交于
      Some codepaths used fopen(3) when opening a fixed path in $GIT_DIR
      (e.g. COMMIT_EDITMSG) that is meant to be left after the command is
      done.  This however did not work well if the repository is set to
      be shared with core.sharedRepository and the umask of the previous
      user is tighter.  They have been made to work better by calling
      unlink(2) and retrying after fopen(3) fails with EPERM.
      
      * js/fopen-harder:
        Handle more file writes correctly in shared repos
        commit: allow editing the commit message even in shared repos
      da07df3e
    • J
      Merge branch 'nd/exclusion-regression-fix' into maint · 9496acc1
      Junio C Hamano 提交于
      The ignore mechanism saw a few regressions around untracked file
      listing and sparse checkout selection areas in 2.7.0; the change
      that is responsible for the regression has been reverted.
      
      * nd/exclusion-regression-fix:
        Revert "dir.c: don't exclude whole dir prematurely if neg pattern may match"
      9496acc1
    • J
      Merge branch 'dk/reflog-walk-with-non-commit' into maint · 90b99869
      Junio C Hamano 提交于
      "git reflog" incorrectly assumed that all objects that used to be
      at the tip of a ref must be commits, which caused it to segfault.
      
      * dk/reflog-walk-with-non-commit:
        reflog-walk: don't segfault on non-commit sha1's in the reflog
      90b99869
    • J
      Merge branch 'dw/signoff-doc' into maint · 7aae9ba6
      Junio C Hamano 提交于
      The documentation has been updated to hint the connection between
      the '--signoff' option and DCO.
      
      * dw/signoff-doc:
        Expand documentation describing --signoff
      7aae9ba6
    • J
      Merge branch 'jk/clang-pedantic' into maint · 6e29ac23
      Junio C Hamano 提交于
      A few unportable C construct have been spotted by clang compiler
      and have been fixed.
      
      * jk/clang-pedantic:
        bswap: add NO_UNALIGNED_LOADS define
        avoid shifting signed integers 31 bits
      6e29ac23
    • J
      Merge branch 'ew/send-email-mutt-alias-fix' into maint · 25b1166a
      Junio C Hamano 提交于
      "git send-email" was confused by escaped quotes stored in the alias
      files saved by "mutt", which has been corrected.
      
      * ew/send-email-mutt-alias-fix:
        git-send-email: do not double-escape quotes from mutt
      25b1166a
    • J
      Merge branch 'nd/dir-exclude-cleanup' into maint · af3e464a
      Junio C Hamano 提交于
      The "exclude_list" structure has the usual "alloc, nr" pair of
      fields to be used by ALLOC_GROW(), but clear_exclude_list() forgot
      to reset 'alloc' to 0 when it cleared 'nr' to discard the managed
      array.
      
      * nd/dir-exclude-cleanup:
        dir.c: clean the entire struct in clear_exclude_list()
      af3e464a
    • J
      Merge branch 'nd/stop-setenv-work-tree' into maint · d6998341
      Junio C Hamano 提交于
      An earlier change in 2.5.x-era broke users' hooks and aliases by
      exporting GIT_WORK_TREE to point at the root of the working tree,
      interfering when they tried to use a different working tree without
      setting GIT_WORK_TREE environment themselves.
      
      * nd/stop-setenv-work-tree:
        Revert "setup: set env $GIT_WORK_TREE when work tree is set, like $GIT_DIR"
      d6998341
  4. 27 1月, 2016 3 次提交
    • E
      git-svn: fix auth parameter handling on SVN 1.9.0+ · 0b664155
      Eric Wong 提交于
      For users with "store-passwords = no" set in the "[auth]" section of
      their ~/.subversion/config, SVN 1.9.0+ would fail with the
      following message when attempting to call svn_auth_set_parameter:
      
        Value is not a string (or undef) at Git/SVN/Ra.pm
      
      Ironically, this breakage was caused by r1553823 in subversion:
      
        "Make svn_auth_set_parameter() usable from Perl bindings."
      
      Since 2007 (602015e0), git-svn has used a workaround to make
      svn_auth_set_parameter usable internally.  However this workaround
      breaks under SVN 1.9+, which deals properly with the type mapping
      and fails to recognize our workaround.
      
      For pre-1.9.0 SVN, we continue to use the existing workaround for
      the lack of proper type mapping in the bindings.
      
      Tested under subversion 1.6.17 and 1.9.3.
      
      I've also verified r1553823 was not backported to SVN 1.8.x:
      
        BRANCH=http://svn.apache.org/repos/asf/subversion/branches/1.8.x
        svn log -v $BRANCH/subversion/bindings/swig/core.i
      
      ref: https://bugs.debian.org/797705
      Cc: 797705@bugs.debian.org
      Reported-by: NThierry Vignaud <thierry.vignaud@gmail.com>
      Signed-off-by: NEric Wong <normalperson@yhbt.net>
      Tested-by: NThierry Vignaud <thierry.vignaud@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      0b664155
    • J
      tag: do not show ambiguous tag names as "tags/foo" · 0571979b
      Jeff King 提交于
      Since b7cc53e9 (tag.c: use 'ref-filter' APIs, 2015-07-11),
      git-tag has started showing tags with ambiguous names (i.e.,
      when both "heads/foo" and "tags/foo" exists) as "tags/foo"
      instead of just "foo". This is both:
      
        - pointless; the output of "git tag" includes only
          refs/tags, so we know that "foo" means the one in
          "refs/tags".
      
      and
      
        - ambiguous; in the original output, we know that the line
          "foo" means that "refs/tags/foo" exists. In the new
          output, it is unclear whether we mean "refs/tags/foo" or
          "refs/tags/tags/foo".
      
      The reason this happens is that commit b7cc53e9 switched
      git-tag to use ref-filter's "%(refname:short)" output
      formatting, which was adapted from for-each-ref. This more
      general code does not know that we care only about tags, and
      uses shorten_unambiguous_ref to get the short-name. We need
      to tell it that we care only about "refs/tags/", and it
      should shorten with respect to that value.
      
      In theory, the ref-filter code could figure this out by us
      passing FILTER_REFS_TAGS. But there are two complications
      there:
      
        1. The handling of refname:short is deep in formatting
           code that does not even have our ref_filter struct, let
           alone the arguments to the filter_ref struct.
      
        2. In git v2.7.0, we expose the formatting language to the
           user. If we follow this path, it will mean that
           "%(refname:short)" behaves differently for "tag" versus
           "for-each-ref" (including "for-each-ref refs/tags/"),
           which can lead to confusion.
      
      Instead, let's add a new modifier to the formatting
      language, "strip", to remove a specific set of prefix
      components. This fixes "git tag", and lets users invoke the
      same behavior from their own custom formats (for "tag" or
      "for-each-ref") while leaving ":short" with its same
      consistent meaning in all places.
      
      We introduce a test in t7004 for "git tag", which fails
      without this patch. We also add a similar test in t3203 for
      "git branch", which does not actually fail. But since it is
      likely that "branch" will eventually use the same formatting
      code, the test helps defend against future regressions.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      0571979b
    • P
      completion: update completion arguments for stash · d7d4ca87
      Paul Wagland 提交于
      Add --all and --include-untracked to the git stash save completions.
      Add --quiet to the git stash drop completions.
      Update git stash branch so that the first argument expands out to the
      possible branch names, and the other arguments expand to the stash
      names.
      Signed-off-by: NPaul Wagland <paul@kungfoocoder.org>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      d7d4ca87