1. 29 5月, 2015 3 次提交
    • J
      config.c: rewrite ENODEV into EISDIR when mmap fails · 0e8771f1
      Jeff King 提交于
      If we try to mmap a directory, we'll get ENODEV. This
      translates to "no such device" for the user, which is not
      very helpful. Since we've just fstat()'d the file, we can
      easily check whether the problem was a directory to give a
      better message.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      0e8771f1
    • J
      config.c: avoid xmmap error messages · 1570856b
      Jeff King 提交于
      The config-writing code uses xmmap to map the existing
      config file, which will die if the map fails. This has two
      downsides:
      
        1. The error message is not very helpful, as it lacks any
           context about the file we are mapping:
      
             $ mkdir foo
             $ git config --file=foo some.key value
             fatal: Out of memory? mmap failed: No such device
      
        2. We normally do not die in this code path; instead, we'd
           rather report the error and return an appropriate exit
           status (which is part of the public interface
           documented in git-config.1).
      
      This patch introduces a "gentle" form of xmmap which lets us
      produce our own error message. We do not want to use mmap
      directly, because we would like to use the other
      compatibility elements of xmmap (e.g., handling 0-length
      maps portably).
      
      The end result is:
      
          $ git.compile config --file=foo some.key value
          error: unable to mmap 'foo': No such device
          $ echo $?
          3
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      1570856b
    • J
      config.c: fix mmap leak when writing config · 3a1b3126
      Jeff King 提交于
      We mmap the existing config file, but fail to unmap it if we
      hit an error. The function already has a shared exit path,
      so we can fix this by moving the mmap pointer to the
      function scope and clearing it in the shared exit.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      3a1b3126
  2. 07 5月, 2015 1 次提交
  3. 17 4月, 2015 1 次提交
  4. 06 2月, 2015 2 次提交
    • J
      config_buf_ungetc: warn when pushing back a random character · 1d0655c1
      Jeff King 提交于
      Our config code simulates a stdio stream around a buffer,
      but our fake ungetc() does not behave quite like the real
      one. In particular, we only rewind the position by one
      character, but do _not_ actually put the character from the
      caller into position.
      
      It turns out that this does not matter, because we only ever
      push back the character we just read. In other words, such
      an assignment would be a noop. But because the function is
      called ungetc, and because it takes a character parameter,
      it is a mistake waiting to happen.
      
      Actually assigning the character into the buffer would be
      ideal, but our pointer is actually a "const" copy of the
      buffer. We do not know who the real owner of the buffer is
      in this code, and would not want to munge their contents.
      
      Instead, we can simply add an assertion that matches what
      the current caller does, and will let us know if new callers
      are added that violate the contract.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      1d0655c1
    • J
      config: do not ungetc EOF · 5e0be134
      Jeff King 提交于
      When we are parsing a config value, if we see a carriage
      return, we fgetc the next character to see if it is a
      line feed (in which case we silently drop the CR). If it
      isn't, we then ungetc the character, and take the literal
      CR.
      
      But we never check whether we in fact got a character at
      all. If the config file ends in CR, we will get EOF here,
      and try to ungetc EOF. This works OK for a real stdio
      stream. The ungetc returns an error, and the next fgetc will
      then return EOF again.
      
      However, our custom buffer-based stream is not so fortunate.
      It happily rewinds the position of the stream by one
      character, ignoring the fact that we fed it EOF. The next
      fgetc call returns the final CR again, over and over, and we
      end up in an infinite loop.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      5e0be134
  5. 14 1月, 2015 1 次提交
  6. 18 12月, 2014 2 次提交
    • J
      read-cache: optionally disallow NTFS .git variants · 2b4c6efc
      Johannes Schindelin 提交于
      The point of disallowing ".git" in the index is that we
      would never want to accidentally overwrite files in the
      repository directory. But this means we need to respect the
      filesystem's idea of when two paths are equal. The prior
      commit added a helper to make such a comparison for NTFS
      and FAT32; let's use it in verify_path().
      
      We make this check optional for two reasons:
      
        1. It restricts the set of allowable filenames, which is
           unnecessary for people who are not on NTFS nor FAT32.
           In practice this probably doesn't matter, though, as
           the restricted names are rather obscure and almost
           certainly would never come up in practice.
      
        2. It has a minor performance penalty for every path we
           insert into the index.
      
      This patch ties the check to the core.protectNTFS config
      option. Though this is expected to be most useful on Windows,
      we allow it to be set everywhere, as NTFS may be mounted on
      other platforms. The variable does default to on for Windows,
      though.
      Signed-off-by: NJohannes Schindelin <johannes.schindelin@gmx.de>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      2b4c6efc
    • J
      read-cache: optionally disallow HFS+ .git variants · a42643aa
      Jeff King 提交于
      The point of disallowing ".git" in the index is that we
      would never want to accidentally overwrite files in the
      repository directory. But this means we need to respect the
      filesystem's idea of when two paths are equal. The prior
      commit added a helper to make such a comparison for HFS+;
      let's use it in verify_path.
      
      We make this check optional for two reasons:
      
        1. It restricts the set of allowable filenames, which is
           unnecessary for people who are not on HFS+. In practice
           this probably doesn't matter, though, as the restricted
           names are rather obscure and almost certainly would
           never come up in practice.
      
        2. It has a minor performance penalty for every path we
           insert into the index.
      
      This patch ties the check to the core.protectHFS config
      option. Though this is expected to be most useful on OS X,
      we allow it to be set everywhere, as HFS+ may be mounted on
      other platforms. The variable does default to on for OS X,
      though.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      a42643aa
  7. 18 11月, 2014 1 次提交
  8. 02 10月, 2014 3 次提交
  9. 12 9月, 2014 1 次提交
  10. 03 9月, 2014 1 次提交
  11. 29 8月, 2014 1 次提交
  12. 19 8月, 2014 1 次提交
    • T
      make config --add behave correctly for empty and NULL values · c8466645
      Tanay Abhra 提交于
      Currently if we have a config file like,
      [foo]
              baz
              bar =
      
      and we try something like, "git config --add foo.baz roll", Git will
      segfault. Moreover, for "git config --add foo.bar roll", it will
      overwrite the original value instead of appending after the existing
      empty value.
      
      The problem lies with the regexp used for simulating --add in
      `git_config_set_multivar_in_file()`, "^$", which in ideal case should
      not match with any string but is true for empty strings. Instead use a
      regexp like "a^" which can not be true for any string, empty or not.
      
      For removing the segfault add a check for NULL values in `matches()` in
      config.c.
      Signed-off-by: NTanay Abhra <tanayabh@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      c8466645
  13. 08 8月, 2014 6 次提交
  14. 06 8月, 2014 1 次提交
  15. 30 7月, 2014 1 次提交
    • T
      add `config_set` API for caching config-like files · 3c8687a7
      Tanay Abhra 提交于
      Currently `git_config()` uses a callback mechanism and file rereads for
      config values. Due to this approach, it is not uncommon for the config
      files to be parsed several times during the run of a git program, with
      different callbacks picking out different variables useful to themselves.
      
      Add a `config_set`, that can be used to construct an in-memory cache for
      config-like files that the caller specifies (i.e., files like `.gitmodules`,
      `~/.gitconfig` etc.). Add two external functions `git_configset_get_value`
      and `git_configset_get_value_multi` for querying from the config sets.
      `git_configset_get_value` follows `last one wins` semantic (i.e. if there
      are multiple matches for the queried key in the files of the configset the
      value returned will be the last entry in `value_list`).
      `git_configset_get_value_multi` returns a list of values sorted in order of
      increasing priority (i.e. last match will be at the end of the list). Add
      type specific query functions like `git_configset_get_bool` and similar.
      
      Add a default `config_set`, `the_config_set` to cache all key-value pairs
      read from usual config files (repo specific .git/config, user wide
      ~/.gitconfig, XDG config and the global /etc/gitconfig). `the_config_set`
      is populated using `git_config()`.
      
      Add two external functions `git_config_get_value` and
      `git_config_get_value_multi` for querying in a non-callback manner from
      `the_config_set`. Also, add type specific query functions that are
      implemented as a thin wrapper around the `config_set` API.
      Signed-off-by: NMatthieu Moy <Matthieu.Moy@imag.fr>
      Signed-off-by: NTanay Abhra <tanayabh@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      3c8687a7
  16. 25 7月, 2014 1 次提交
    • J
      fix memory leak parsing core.commentchar · 649409b7
      Jeff King 提交于
      When we see the core.commentchar config option, we extract
      the string with git_config_string, which does two things:
      
        1. It complains via config_error_nonbool if there is no
           string value.
      
        2. It makes a copy of the string.
      
      Since we immediately parse the string into its
      single-character value, we only care about (1). And in fact
      (2) is a detriment, as it means we leak the copy. Instead,
      let's just check the pointer value ourselves, and parse
      directly from the const string we already have.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      649409b7
  17. 17 7月, 2014 1 次提交
  18. 21 6月, 2014 1 次提交
    • J
      refactor skip_prefix to return a boolean · cf4fff57
      Jeff King 提交于
      The skip_prefix() function returns a pointer to the content
      past the prefix, or NULL if the prefix was not found. While
      this is nice and simple, in practice it makes it hard to use
      for two reasons:
      
        1. When you want to conditionally skip or keep the string
           as-is, you have to introduce a temporary variable.
           For example:
      
             tmp = skip_prefix(buf, "foo");
             if (tmp)
      	       buf = tmp;
      
        2. It is verbose to check the outcome in a conditional, as
           you need extra parentheses to silence compiler
           warnings. For example:
      
             if ((cp = skip_prefix(buf, "foo"))
      	       /* do something with cp */
      
      Both of these make it harder to use for long if-chains, and
      we tend to use starts_with() instead. However, the first line
      of "do something" is often to then skip forward in buf past
      the prefix, either using a magic constant or with an extra
      strlen(3) (which is generally computed at compile time, but
      means we are repeating ourselves).
      
      This patch refactors skip_prefix() to return a simple boolean,
      and to provide the pointer value as an out-parameter. If the
      prefix is not found, the out-parameter is untouched. This
      lets you write:
      
        if (skip_prefix(arg, "foo ", &arg))
      	  do_foo(arg);
        else if (skip_prefix(arg, "bar ", &arg))
      	  do_bar(arg);
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      cf4fff57
  19. 28 5月, 2014 2 次提交
  20. 24 5月, 2014 1 次提交
    • J
      strbuf: add strbuf_tolower function · ffb20ce1
      Jeff King 提交于
      This is a convenience wrapper to call tolower on each
      character of the string.
      
      This makes config's lowercase() function obsolete, though
      note that because we have a strbuf, we are careful to
      operate over the whole strbuf, rather than assuming that a
      NUL is the end-of-string.
      
      We could continue to offer a pure-string lowercase, but
      there would be no callers (in most pure-string cases, we
      actually duplicate and lowercase the duplicate, for which we
      have the xstrdup_tolower wrapper).
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      ffb20ce1
  21. 20 5月, 2014 2 次提交
  22. 07 5月, 2014 1 次提交
  23. 17 4月, 2014 1 次提交
  24. 19 2月, 2014 3 次提交
  25. 29 1月, 2014 1 次提交
    • J
      handle_path_include: don't look at NULL value · 67beb600
      Jeff King 提交于
      When we see config like:
      
        [include]
        path
      
      the expand_user_path helper notices that the config value is
      empty, but we then dereference NULL while printing the error
      message (glibc will helpfully print "(null)" for us here,
      but we cannot rely on that).
      
        $ git -c include.path rev-parse
        error: Could not expand include path '(null)'
        fatal: unable to parse command-line config
      
      Instead of tweaking our message, let's actually use
      config_error_nonbool to match other config variables that
      expect a value:
      
        $ git -c include.path rev-parse
        error: Missing value for 'include.path'
        fatal: unable to parse command-line config
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      67beb600