git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v3 0/8] Fix GIT_CEILING_DIRECTORIES that contain symlinks

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Oct 21, 2012, 05:57 UTC
Message-ID
<1350799057-13846-1-git-send-email-mhagger@alum.mit.edu>
v3 of the series, reworked WRT v2:
* Change longest_ancestor_length() to take a string_list for its
  prefixes argument (instead of a PATH_SEP-separated string).
* Move the responsibility for canonicalizing prefixes from
  longest_ancestor_length() to its caller in
  setup_git_directory_gently_1().  This keeps
  longest_ancestor_length() testable, though the test inputs now have
  to be canonicalized.
* Remove function string_list_longest_prefix(), which was mainly
  intended to be used in the implementation of
  longest_ancestor_length() but is now unneeded.
Thanks to Junio for his comments.

I would like to explicitly point out a possible objection to this whole enterprise. GIT_CEILING_DIRECTORIES is used to prevent git from mucking around in certain directories, to avoid expensive accesses (for example of remote directories). The original motivation for the feature was a user whose home directory /home/$USER was automounted. When git was invoked outside of a git tree, it would crawl up the filesystem tree, eventually reaching /home, and then try to access the paths

    /home
    /home/.git
    /home/.git/objects
    /home/objects

The last three accesses would be very expensive because the system would attempt to automount the entries listed.

This patch series has the side effect that all of the directories listed in GIT_CEILING_DIRECTORIES are accessed *unconditionally* to resolve any symlinks that are present in their paths. It is admittedly odd that a feature intended to avoid accessing expensive directories would now *intentionally* access directories near the expensive ones. In the above scenario this shouldn't be a problem, because /home would be the directory listed in GIT_CEILING_DIRECTORIES, and accessing /home itself shouldn't be expensive. But there might be other scenarios for which this patch series causes a performance regression.

Another point: After this change, it would be trivially possible to support non-absolute paths in GIT_CEILING_DIRECTORIES; just remove the call to is_absolute_path() from normalize_ceiling_entry(). This might be convenient for the test suite.

Michael Haggerty (8):
  Introduce new static function real_path_internal()
  real_path_internal(): add comment explaining use of cwd
  Introduce new function real_path_if_valid()
  longest_ancestor_length(): use string_list_split()
  longest_ancestor_length(): take a string_list argument for prefixes
  longest_ancestor_length(): require prefix list entries to be
    normalized
  normalize_ceiling_entry(): resolve symlinks
  string_list_longest_prefix(): remove function
 Documentation/technical/api-string-list.txt |   8 ---
 abspath.c                                   | 105 ++++++++++++++++++++++------
 cache.h                                     |   3 +-
 path.c                                      |  46 ++++++------
 setup.c                                     |  32 ++++++++-
 string-list.c                               |  20 ------
 string-list.h                               |   8 ---
 t/t0060-path-utils.sh                       |  41 ++++-------
 t/t0063-string-list.sh                      |  30 --------
 test-path-utils.c                           |   8 ++-
 test-string-list.c                          |  20 ------
 11 files changed, 157 insertions(+), 164 deletions(-)
-- 
1.7.11.3
Next: Michael Haggerty
Message 1 of 26 in “Fix GIT_CEILING_DIRECTORIES that contain symlinks”
  1. 0/8 Fix GIT_CEILING_DIRECTORIES that contain symlinksMichael Haggerty, Oct 21, 2012
  2. 1/8 Introduce new static function real_path_internal()Michael Haggerty, Oct 21, 2012
  3. 2/8 real_path_internal(): add comment explaining use of cwdMichael Haggerty, Oct 21, 2012
  4. 3/8 Introduce new function real_path_if_valid()Michael Haggerty, Oct 21, 2012
  5. 4/8 longest_ancestor_length(): use string_list_split()Michael Haggerty, Oct 21, 2012
  6. 5/8 longest_ancestor_length(): take a string_list argument for prefixesMichael Haggerty, Oct 21, 2012
  7. 6/8 longest_ancestor_length(): require prefix list entries to be normalizedMichael Haggerty, Oct 21, 2012
  8. Johannes SixtOct 22, 2012
  9. 7/8 normalize_ceiling_entry(): resolve symlinksMichael Haggerty, Oct 21, 2012
  10. 8/8 string_list_longest_prefix(): remove functionMichael Haggerty, Oct 21, 2012
  11. Junio C HamanoOct 21, 2012
  12. Michael HaggertyOct 22, 2012
  13. David AguilarOct 29, 2012
  14. Junio C HamanoOct 29, 2012
  15. Michael HaggertyOct 29, 2012
  16. Junio C HamanoNov 12, 2012
  17. David AguilarNov 13, 2012
  18. Michael HaggertyNov 15, 2012
  19. Anders KaseorgFeb 20, 2013
  20. Junio C HamanoFeb 20, 2013
  21. [RFC] Provide a mechanism to turn off symlink resolution in ceiling pathsMichael Haggerty, Feb 20, 2013
  22. Junio C HamanoFeb 20, 2013
  23. Junio C HamanoFeb 21, 2013
  24. Michael HaggertyFeb 22, 2013
  25. Anders KaseorgFeb 20, 2013
  26. Lars DamerowOct 29, 2012

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.