1. 22 10月, 2009 1 次提交
    • J
      Fix incorrect error check while reading deflated pack data · 39eea7bd
      Junio C Hamano 提交于
      The loop in get_size_from_delta() feeds a deflated delta data from the
      pack stream _until_ we get inflated result of 20 bytes[*] or we reach the
      end of stream.
      
          Side note. This magic number 20 does not have anything to do with the
          size of the hash we use, but comes from 1a3b55c6 (reduce delta head
          inflated size, 2006-10-18).
      
      The loop reads like this:
      
          do {
              in = use_pack();
              stream.next_in = in;
              st = git_inflate(&stream, Z_FINISH);
              curpos += stream.next_in - in;
          } while ((st == Z_OK || st == Z_BUF_ERROR) &&
                   stream.total_out < sizeof(delta_head));
      
      This git_inflate() can return:
      
       - Z_STREAM_END, if use_pack() fed it enough input and the delta itself
         was smaller than 20 bytes;
      
       - Z_OK, when some progress has been made;
      
       - Z_BUF_ERROR, if no progress is possible, because we either ran out of
         input (due to corrupt pack), or we ran out of output before we saw the
         end of the stream.
      
      The fix b3118bdc (sha1_file: Fix infinite loop when pack is corrupted,
      2009-10-14) attempted was against a corruption that appears to be a valid
      stream that produces a result larger than the output buffer, but we are
      not even trying to read the stream to the end in this loop.  If avail_out
      becomes zero, total_out will be the same as sizeof(delta_head) so the loop
      will terminate without the "fix".  There is no fix from b3118bdc needed for
      this loop, in other words.
      
      The loop in unpack_compressed_entry() is quite a different story.  It
      feeds a deflated stream (either delta or base) and allows the stream to
      produce output up to what we expect but no more.
      
          do {
              in = use_pack();
              stream.next_in = in;
              st = git_inflate(&stream, Z_FINISH);
              curpos += stream.next_in - in;
          } while (st == Z_OK || st == Z_BUF_ERROR)
      
      This _does_ risk falling into an endless interation, as we can exhaust
      avail_out if the length we expect is smaller than what the stream wants to
      produce (due to pack corruption).  In such a case, avail_out will become
      zero and inflate() will return Z_BUF_ERROR, while avail_in may (or may
      not) be zero.
      
      But this is not a right fix:
      
          do {
              in = use_pack();
              stream.next_in = in;
              st = git_inflate(&stream, Z_FINISH);
      +       if (st == Z_BUF_ERROR && (stream.avail_in || !stream.avail_out)
      +               break; /* wants more input??? */
              curpos += stream.next_in - in;
          } while (st == Z_OK || st == Z_BUF_ERROR)
      
      as Z_BUF_ERROR from inflate() may be telling us that avail_in has also run
      out before reading the end of stream marker.  In such a case, both avail_in
      and avail_out would be zero, and the loop should iterate to allow the end
      of stream marker to be seen by inflate from the input stream.
      
      The right fix for this loop is likely to be to increment the initial
      avail_out by one (we allocate one extra byte to terminate it with NUL
      anyway, so there is no risk to overrun the buffer), and break out if we
      see that avail_out has become zero, in order to detect that the stream
      wants to produce more than what we expect.  After the loop, we have a
      check that exactly tests this condition:
      
          if ((st != Z_STREAM_END) || stream.total_out != size) {
              free(buffer);
              return NULL;
          }
      
      So here is a patch (without my previous botched attempts) to fix this
      issue.  The first hunk reverts the corresponding hunk from b3118bdc, and
      the second hunk is the same fix proposed earlier.
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      39eea7bd
  2. 15 10月, 2009 1 次提交
    • S
      sha1_file: Fix infinite loop when pack is corrupted · b3118bdc
      Shawn O. Pearce 提交于
      Some types of corruption to a pack may confuse the deflate stream
      which stores an object.  In Andy's reported case a 36 byte region
      of the pack was overwritten, leading to what appeared to be a valid
      deflate stream that was trying to produce a result larger than our
      allocated output buffer could accept.
      
      Z_BUF_ERROR is returned from inflate() if either the input buffer
      needs more input bytes, or the output buffer has run out of space.
      Previously we only considered the former case, as it meant we needed
      to move the stream's input buffer to the next window in the pack.
      
      We now abort the loop if inflate() returns Z_BUF_ERROR without
      consuming the entire input buffer it was given, or has filled
      the entire output buffer but has not yet returned Z_STREAM_END.
      Either state is a clear indicator that this loop is not working
      as expected, and should not continue.
      
      This problem cannot occur with loose objects as we open the entire
      loose object as a single buffer and treat Z_BUF_ERROR as an error.
      Reported-by: NAndy Isaacson <adi@hexapodia.org>
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      Acked-by: NNicolas Pitre <nico@fluxnic.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      b3118bdc
  3. 14 10月, 2009 3 次提交
  4. 13 10月, 2009 2 次提交
  5. 10 10月, 2009 20 次提交
  6. 09 10月, 2009 11 次提交
    • J
      Merge git://git.bogomips.org/git-svn · 63d129d9
      Junio C Hamano 提交于
      * git://git.bogomips.org/git-svn:
        git-svn: Avoid spurious errors when rewriteRoot is used.
      63d129d9
    • A
      git-svn: Avoid spurious errors when rewriteRoot is used. · c03c1f79
      Alexander Gavrilov 提交于
      After doing a rebase, git-svn checks that the SVN URL
      is what it expects. However, it does not account for
      rewriteRoot, which is a legitimate way for the URL
      to change. This produces a lot of spurious errors.
      
      [ew: fixed line wrapping]
      Signed-off-by: NAlexander Gavrilov <angavrilov@gmail.com>
      Acked-by: NEric Wong <normalperson@yhbt.net>
      c03c1f79
    • J
      Merge branch 'ms/msvc' · 8ba5effa
      Junio C Hamano 提交于
      * ms/msvc:
        Fix the exit code of MSVC build scripts on cygwin
        Fix MSVC build on cygwin
      8ba5effa
    • J
      Update draft release notes to 1.6.5 · dc3c7a72
      Junio C Hamano 提交于
      dc3c7a72
    • J
      Merge branch 'maint' · bf8fc21c
      Junio C Hamano 提交于
      * maint:
        ls-files: die instead of fprintf/exit in -i error
      bf8fc21c
    • B
      Makefile: add a note about the NO_MMAP setting on IRIX and IRIX64 · 651aef34
      Brandon Casey 提交于
      When git is compiled with the MIPSpro 7.4.4m compiler, and NO_PTHREADS is
      set, and NO_MMAP is _not_ set, then git segfaults when trying to access the
      first entry in a reflog.  If NO_PTHREADS is not set (which implies that the
      pthread library is linked in), or NO_MMAP _is_ set, then the segfault is
      not encountered.  The conservative choice has been made to set NO_MMAP in
      the Makefile to avoid this flaw.  The GNU C compiler does not produce this
      behavior.
      
      The segfault happens in refs.c:read_ref_at().  The mmap succeeds, and the
      loop is executed properly until rec is rewound into the first line (reflog
      entry) of the file.  The segfault is caught by test 28 of
      t1400-update-ref.sh which fails when 'git rev-parse --verify "master@{May 25
      2005}"' is called.
      
      So, add a comment in the Makefile to describe why NO_MMAP is set and as a
      hint to those who may be interested in unsetting it.
      Signed-off-by: NBrandon Casey <casey@nrlssc.navy.mil>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      651aef34
    • B
      ls-files: die instead of fprintf/exit in -i error · ac78b009
      Ben Walton 提交于
      When ls-files was called with -i but no exclude pattern, it was
      calling fprintf(stderr, "...", NULL) and then exiting.  On Solaris,
      passing NULL into fprintf was causing a segfault.  On glibc systems,
      it was simply producing incorrect output (eg: "(null)": ...).  The
      NULL pointer was a result of argv[0] not being preserved by the option
      parser.  Instead of requesting that the option parser preserve
      argv[0], use die() with a constant string.
      
      A trigger for this bug was: `git ls-files -i`
      Signed-off-by: NBen Walton <bwalton@artsci.utoronto.ca>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      ac78b009
    • B
      Makefile: enable THREADED_DELTA_SEARCH on IRIX and IRIX64 · 817350d3
      Brandon Casey 提交于
      Since commit dcda3614 removed the use of a variable length array from
      builtin-pack-objects.c, it is now safe to compile with the threaded delta
      search feature enabled.  Formerly, the MIPSpro 7.4.4m compiler warned that
      variable length arrays should not be used with pthreads.
      Signed-off-by: NBrandon Casey <casey@nrlssc.navy.mil>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      817350d3
    • R
      Fix the exit code of MSVC build scripts on cygwin · b5d18b8e
      Ramsay Jones 提交于
      During an MSVC build on cygwin, the make program did not notice
      when the compiler or linker exited with an error. This was caused
      by the scripts exiting with the value returned by system() directly.
      
      On POSIX-like systems, such as cygwin, the return value of system()
      has the exit code of the executed command encoded in the first byte
      (ie the value is shifted up by 8 bits). This allows the bottom
      7 bits to contain the signal number of a terminated process, while
      the eighth bit indicates whether a core-dump was produced. (A value
      of -1 indicates that the command failed to execute.)
      
      The make program, however, expects the exit code to be encoded in the
      bottom byte. Futhermore, it apparently masks off and ignores anything
      in the upper bytes.
      
      However, these scripts are (naturally) intended to be used on the
      windows platform, where we can not assume POSIX-like semantics from
      a perl implementation (eg ActiveState). So, in general, we can not
      assume that shifting the return value right by eight will get us
      the exit code.
      
      In order to improve portability, we assume that a zero return from
      system() indicates success, whereas anything else indicates failure.
      Since we don't need to know the exact exit code from the compiler
      or linker, we simply exit with 0 (success) or 1 (failure).
      Signed-off-by: NRamsay Jones <ramsay@ramsay1.demon.co.uk>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      b5d18b8e
    • R
      Fix MSVC build on cygwin · f2d50d93
      Ramsay Jones 提交于
      In the MSVC section of the Makefile, BASIC_CFLAGS is set to a
      value which contains the string "-DWIN32-D_CONSOLE". This results
      in a (single) malformed -Define being passed to the compiler.
      At least on my cygwin installation, the msvc compiler seems to
      ignore this parameter, without issuing an error or warning, and
      results in the WIN32 and _CONSOLE macros being undefined. This
      breaks the build.
      
      In order to fix the build, we simply insert a space between the
      two -Define parameters, "-DWIN32" and "-D_CONSOLE", as originally
      intended.
      Signed-off-by: NRamsay Jones <ramsay@ramsay1.demon.co.uk>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      f2d50d93
    • R
      Git archive and trailing "/" in prefix · ebfbdb34
      René Scharfe 提交于
      With --prefix=string that does not end with a slash, the top-level entries
      are written out with the specified prefix as expected, but no paths in the
      directories are added.
      
      Fix this by adding the prefix in write_archive_entry() instead of letting
      get_pathspec() and read_tree_recursive() pair; they are designed to only
      handle prefixes that are path components.
      Signed-off-by: NRene Scharfe <rene.scharfe@lsrfire.ath.cx>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      ebfbdb34
  7. 08 10月, 2009 2 次提交