1. 08 7月, 2013 1 次提交
    • M
      lockfile: fix buffer overflow in path handling · 2fbd4f92
      Michael Haggerty 提交于
      The path of the file to be locked is held in lock_file::filename,
      which is a fixed-length buffer of length PATH_MAX.  This buffer is
      also (temporarily) used to hold the path of the lock file, which is
      the path of the file being locked plus ".lock".  Because of this, the
      path of the file being locked must be less than (PATH_MAX - 5)
      characters long (5 chars are needed for ".lock" and one character for
      the NUL terminator).
      
      On entry into lock_file(), the path length was only verified to be
      less than PATH_MAX characters, not less than (PATH_MAX - 5)
      characters.
      
      When and if resolve_symlink() is called, then that function is
      correctly told to treat the buffer as (PATH_MAX - 5) characters long.
      This part is correct.  However:
      
      * If LOCK_NODEREF was specified, then resolve_symlink() is never
        called.
      
      * If resolve_symlink() is called but the path is not a symlink, then
        the length check is never applied.
      
      So it is possible for a path with length (PATH_MAX - 5 <= len <
      PATH_MAX) to make it through the checks.  When ".lock" is strcat()ted
      to such a path, the lock_file::filename buffer is overflowed.
      
      Fix the problem by adding a check when entering lock_file() that the
      original path is less than (PATH_MAX - 5) characters.
      
      [jc: with independent development by Peff]
      Signed-off-by: NMichael Haggerty <mhagger@alum.mit.edu>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      2fbd4f92
  2. 18 3月, 2011 1 次提交
  3. 13 1月, 2010 1 次提交
  4. 29 9月, 2009 1 次提交
  5. 02 5月, 2009 1 次提交
  6. 30 4月, 2009 1 次提交
    • A
      replace direct calls to unlink(2) with unlink_or_warn · 691f1a28
      Alex Riesen 提交于
      This helps to notice when something's going wrong, especially on
      systems which lock open files.
      
      I used the following criteria when selecting the code for replacement:
      - it was already printing a warning for the unlink failures
      - it is in a function which already printing something or is
        called from such a function
      - it is in a static function, returning void and the function is only
        called from a builtin main function (cmd_)
      - it is in a function which handles emergency exit (signal handlers)
      - it is in a function which is obvously cleaning up the lockfiles
      Signed-off-by: NAlex Riesen <raa.lkml@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      691f1a28
  7. 05 3月, 2009 1 次提交
  8. 20 2月, 2009 1 次提交
  9. 22 1月, 2009 2 次提交
    • J
      refactor signal handling for cleanup functions · 57b235a4
      Jeff King 提交于
      The current code is very inconsistent about which signals
      are caught for doing cleanup of temporary files and lock
      files. Some callsites checked only SIGINT, while others
      checked a variety of death-dealing signals.
      
      This patch factors out those signals to a single function,
      and then calls it everywhere. For some sites, that means
      this is a simple clean up. For others, it is an improvement
      in that they will now properly clean themselves up after a
      larger variety of signals.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      57b235a4
    • J
      chain kill signals for cleanup functions · 4a16d072
      Jeff King 提交于
      If a piece of code wanted to do some cleanup before exiting
      (e.g., cleaning up a lockfile or a tempfile), our usual
      strategy was to install a signal handler that did something
      like this:
      
        do_cleanup(); /* actual work */
        signal(signo, SIG_DFL); /* restore previous behavior */
        raise(signo); /* deliver signal, killing ourselves */
      
      For a single handler, this works fine. However, if we want
      to clean up two _different_ things, we run into a problem.
      The most recently installed handler will run, but when it
      removes itself as a handler, it doesn't put back the first
      handler.
      
      This patch introduces sigchain, a tiny library for handling
      a stack of signal handlers. You sigchain_push each handler,
      and use sigchain_pop to restore whoever was before you in
      the stack.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      4a16d072
  10. 21 12月, 2008 1 次提交
  11. 20 10月, 2008 1 次提交
  12. 01 6月, 2008 1 次提交
  13. 26 5月, 2008 1 次提交
  14. 05 5月, 2008 1 次提交
  15. 17 1月, 2008 1 次提交
    • B
      close_lock_file(): new function in the lockfile API · d6cf61bf
      Brandon Casey 提交于
      The lockfile API is a handy way to obtain a file that is cleaned
      up if you die().  But sometimes you would need this sequence to
      work:
      
       1. hold_lock_file_for_update() to get a file descriptor for
          writing;
      
       2. write the contents out, without being able to decide if the
          results should be committed or rolled back;
      
       3. do something else that makes the decision --- and this
          "something else" needs the lockfile not to have an open file
          descriptor for writing (e.g. Windows do not want a open file
          to be renamed);
      
       4. call commit_lock_file() or rollback_lock_file() as
          appropriately.
      
      This adds close_lock_file() you can call between step 2 and 3 in
      the above sequence.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      d6cf61bf
  16. 27 11月, 2007 1 次提交
  17. 15 11月, 2007 1 次提交
  18. 27 7月, 2007 1 次提交
  19. 26 7月, 2007 1 次提交
    • J
      When locking in a symlinked repository, try to lock the original. · d58e8d34
      Junio C Hamano 提交于
      In a working tree prepared in new-workdir (in contrib/), some files in .git/
      directory are symbolic links to the original repository.  The usual sequence of
      lock-write-rename would break the symbolic link.
      
      Ideally we should resolve relative symbolic link with maxdepth, but I do not
      want to risk too elaborate patch before 1.5.3 release, so this is a minimum
      and trivially obvious fix.  new-workdir creates its symbolic links absolute,
      and does not link from a symlinked workdir, so this fix should suffice for now.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      d58e8d34
  20. 13 7月, 2007 1 次提交
  21. 07 6月, 2007 1 次提交
    • J
      War on whitespace · a6080a0a
      Junio C Hamano 提交于
      This uses "git-apply --whitespace=strip" to fix whitespace errors that have
      crept in to our source files over time.  There are a few files that need
      to have trailing whitespaces (most notably, test vectors).  The results
      still passes the test, and build result in Documentation/ area is unchanged.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      a6080a0a
  22. 22 4月, 2007 1 次提交
    • J
      lockfile: record the primary process. · 5e635e39
      Junio C Hamano 提交于
      The usual process flow is the main process opens and holds the lock to
      the index, does its thing, perhaps spawning children during the course,
      and then writes the resulting index out by releaseing the lock.
      
      However, the lockfile interface uses atexit(3) to clean it up, without
      regard to who actually created the lock.  This typically leads to a
      confusing behaviour of lock being released too early when the child
      exits, and then the parent process when it calls commit_lockfile()
      finds that it cannot unlock it.
      
      This fixes the problem by recording who created and holds the lock, and
      upon atexit(3) handler, child simply ignores the lockfile the parent
      created.
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      5e635e39
  23. 04 4月, 2007 2 次提交
    • J
      git-read-tree --index-output=<file> · 5e7f56ac
      Junio C Hamano 提交于
      This corrects the interface mistake of the previous one, and
      gives a command line parameter to the only plumbing command that
      currently needs it: "git-read-tree".
      
      We can add the calls to set_alternate_index_output() to other
      plumbing commands that update the index if/when needed.
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      5e7f56ac
    • J
      _GIT_INDEX_OUTPUT: allow plumbing to output to an alternative index file. · 30ca07a2
      Junio C Hamano 提交于
      When defined, this allows plumbing commands that update the
      index (add, apply, checkout-index, merge-recursive, mv,
      read-tree, rm, update-index, and write-tree) to write their
      resulting index to an alternative index file while holding a
      lock to the original index file.  With this, git-commit that
      jumps the index does not have to make an extra copy of the index
      file, and more importantly, it can do the update while holding
      the lock on the index.
      
      However, I think the interface to let an environment variable
      specify the output is a mistake, as shown in the documentation.
      If a curious user has the environment variable set to something
      other than the file GIT_INDEX_FILE points at, almost everything
      will break.  This should instead be a command line parameter to
      tell these plumbing commands to write the result in the named
      file, to prevent stupid mistakes.
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      30ca07a2
  24. 07 1月, 2007 1 次提交
  25. 03 1月, 2007 1 次提交
    • J
      Fix infinite loop when deleting multiple packed refs. · 1084b845
      Junio C Hamano 提交于
      It was stupid to link the same element twice to lock_file_list
      and end up in a loop, so we certainly need a fix.
      
      But it is not like we are taking a lock on multiple files in
      this case.  It is just that we leave the linked element on the
      list even after commit_lock_file() successfully removes the
      cruft.
      
      We cannot remove the list element in commit_lock_file(); if we
      are interrupted in the middle of list manipulation, the call to
      remove_lock_file_on_signal() will happen with a broken list
      structure pointed by lock_file_list, which would cause the cruft
      to remain, so not removing the list element is the right thing
      to do.  Instead we should be reusing the element already on the
      list.
      
      There is already a code for that in lock_file() function in
      lockfile.c.  The code checks lk->next and the element is linked
      only when it is not already on the list -- which is incorrect
      for the last element on the list (which has NULL in its next
      field), but if you read the check as "is this element already on
      the list?" it actually makes sense.  We do not want to link it
      on the list again, nor we would want to set up signal/atexit
      over and over.
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      1084b845
  26. 21 12月, 2006 1 次提交
    • J
      simplify inclusion of system header files. · 85023577
      Junio C Hamano 提交于
      This is a mechanical clean-up of the way *.c files include
      system header files.
      
       (1) sources under compat/, platform sha-1 implementations, and
           xdelta code are exempt from the following rules;
      
       (2) the first #include must be "git-compat-util.h" or one of
           our own header file that includes it first (e.g. config.h,
           builtin.h, pkt-line.h);
      
       (3) system headers that are included in "git-compat-util.h"
           need not be included in individual C source files.
      
       (4) "git-compat-util.h" does not have to include subsystem
           specific header files (e.g. expat.h).
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      85023577
  27. 13 8月, 2006 1 次提交
    • J
      Better error message when we are unable to lock the index file · 40aaae88
      Junio C Hamano 提交于
      Most of the callers except the one in refs.c use the function to
      update the index file.  Among the index writers, everybody
      except write-tree dies if they cannot open it for writing.
      
      This gives the function an extra argument, to tell it to die
      when it cannot create a new file as the lockfile.
      
      The only caller that does not have to die is write-tree, because
      updating the index for the cache-tree part is optional and not
      being able to do so does not affect the correctness.  I think we
      do not have to be so careful and make the failure into die() the
      same way as other callers, but that would be a different patch.
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      40aaae88
  28. 10 6月, 2006 1 次提交
    • J
      shared repository - add a few missing calls to adjust_shared_perm(). · 138086a7
      Junio C Hamano 提交于
      There were a few calls to adjust_shared_perm() that were
      missing:
      
       - init-db creates refs, refs/heads, and refs/tags before
         reading from templates that could specify sharedrepository in
         the config file;
      
       - updating config file created it under user's umask without
         adjusting;
      
       - updating refs created it under user's umask without
         adjusting;
      
       - switching branches created .git/HEAD under user's umask
         without adjusting.
      
      This moves adjust_shared_perm() from sha1_file.c to path.c,
      since a few SIMPLE_PROGRAM need to call repository configuration
      functions which in turn need to call adjust_shared_perm().
      sha1_file.c needs to link with SHA1 computation library which
      is usually not linked to SIMPLE_PROGRAM.
      Signed-off-by: NJunio C Hamano <junkio@cox.net>
      138086a7
  29. 07 6月, 2006 1 次提交