From: "Johannes Schindelin via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Patrick Steinhardt <ps@pks.im>,
Johannes Schindelin <johannes.schindelin@gmx.de>
Subject: [PATCH v2 0/5] Last preparations before upstreaming Git for Windows' symlink support
Date: Fri, 09 Jan 2026 20:05:04 +0000 [thread overview]
Message-ID: <pull.2017.v2.git.1767989109.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.2017.git.1765899229.gitgitgadget@gmail.com>
After preparing Git's test suite for the upcoming support for symlinks on
Windows, this patch series touches up a couple of code paths that might not
seem to be related at first, but need to be adjusted for the symlink support
to work as expected.
This is based on js/test-symlink-windows.
Changes since v1:
* Fixed Karsten's email address
* Instead of allowing unlimited symlink target lengths, it is now increased
from 2*PATH_MAX to 32,767.
Johannes Schindelin (3):
mingw: do resolve symlinks in `getcwd()`
init: do parse _all_ core.* settings early
strbuf_readlink(): support link targets that exceed 2*PATH_MAX
Karsten Blees (2):
strbuf_readlink(): avoid calling `readlink()` twice in corner-cases
trim_last_path_component(): avoid hard-coding the directory separator
compat/mingw.c | 18 +++++++-----------
environment.c | 4 ++--
environment.h | 2 ++
lockfile.c | 4 ++--
setup.c | 2 +-
strbuf.c | 8 ++++----
6 files changed, 18 insertions(+), 20 deletions(-)
base-commit: ef6dd000ad813fc34a05c4b9055578df13a2eaa6
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-2017%2Fdscho%2Flast-preparations-before-mingw-symlinks-support-next-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-2017/dscho/last-preparations-before-mingw-symlinks-support-next-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/2017
Range-diff vs v1:
1: 1928738b464 = 1: eb95a74d6eb mingw: do resolve symlinks in `getcwd()`
2: 31497b01988 = 2: 9fee7bd16f5 init: do parse _all_ core.* settings early
3: dba281027a8 ! 3: 7fe463d68aa strbuf_readlink(): avoid calling `readlink()` twice in corner-cases
@@
## Metadata ##
-Author: Karsten Blees <blees@dcon.de>
+Author: Karsten Blees <karsten.blees@gmail.com>
## Commit message ##
strbuf_readlink(): avoid calling `readlink()` twice in corner-cases
@@ Commit message
Use `hint + 1` as buffer size to prevent this.
- Signed-off-by: Karsten Blees <blees@dcon.de>
+ Signed-off-by: Karsten Blees <karsten.blees@gmail.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
## strbuf.c ##
4: db1feb2293d ! 4: accb6d5f0ae strbuf_readlink(): support link targets that exceed PATH_MAX
@@
## Metadata ##
-Author: Karsten Blees <blees@dcon.de>
+Author: Johannes Schindelin <Johannes.Schindelin@gmx.de>
## Commit message ##
- strbuf_readlink(): support link targets that exceed PATH_MAX
+ strbuf_readlink(): support link targets that exceed 2*PATH_MAX
The `strbuf_readlink()` function refuses to read link targets that
- exceed PATH_MAX (even if a sufficient size was specified by the caller).
+ exceed 2*PATH_MAX (even if a sufficient size was specified by the
+ caller).
- As some platforms (*cough* Windows *cough*) support longer paths, remove
- this restriction (similar to `strbuf_getcwd()`).
+ The reason that that limit is 2*PATH_MAX instead of PATH_MAX is that
+ the symlink targets do not need to be normalized. After running
+ `ln -s a/../a/../a/../a/../b c`, the target of the symlink `c` will not
+ be normalized to `b` but instead be much longer. As such, symlink
+ targets' lengths can far exceed PATH_MAX.
- Signed-off-by: Karsten Blees <blees@dcon.de>
+ They are frequently much longer than 2*PATH_MAX on Windows, which
+ actually supports paths up to 32,767 characters, but sets PATH_MAX to
+ 260 for backwards compatibility. For full details, see
+ https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation
+
+ Let's just hard-code the limit used by `strbuf_readlink()` to 32,767 and
+ make it independent of the current platform's PATH_MAX.
+
+ Based-on-a-patch-by: Karsten Blees <karsten.blees@gmail.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
## strbuf.c ##
@@ strbuf.c: ssize_t strbuf_write(struct strbuf *sb, FILE *f)
}
-#define STRBUF_MAXLINK (2*PATH_MAX)
--
++#define STRBUF_MAXLINK (32767)
+
int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint)
{
- size_t oldalloc = sb->alloc;
-@@ strbuf.c: int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint)
- if (hint < 32)
- hint = 32;
-
-- while (hint < STRBUF_MAXLINK) {
-+ for (;;) {
- ssize_t len;
-
- strbuf_grow(sb, hint + 1);
5: 3521180e0f7 ! 5: 9823cbb6df8 trim_last_path_component(): avoid hard-coding the directory separator
@@
## Metadata ##
-Author: Karsten Blees <blees@dcon.de>
+Author: Karsten Blees <karsten.blees@gmail.com>
## Commit message ##
trim_last_path_component(): avoid hard-coding the directory separator
@@ Commit message
Prepare that function to be useful also in that context.
- Signed-off-by: Karsten Blees <blees@dcon.de>
+ Signed-off-by: Karsten Blees <karsten.blees@gmail.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
## lockfile.c ##
--
gitgitgadget
next prev parent reply other threads:[~2026-01-09 20:05 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-16 15:33 [PATCH 0/5] Last preparations before upstreaming Git for Windows' symlink support Johannes Schindelin via GitGitGadget
2025-12-16 15:33 ` [PATCH 1/5] mingw: do resolve symlinks in `getcwd()` Johannes Schindelin via GitGitGadget
2025-12-17 14:44 ` Patrick Steinhardt
2025-12-16 15:33 ` [PATCH 2/5] init: do parse _all_ core.* settings early Johannes Schindelin via GitGitGadget
2025-12-17 14:44 ` Patrick Steinhardt
2025-12-16 15:33 ` [PATCH 3/5] strbuf_readlink(): avoid calling `readlink()` twice in corner-cases Karsten Blees via GitGitGadget
2025-12-16 15:33 ` [PATCH 4/5] strbuf_readlink(): support link targets that exceed PATH_MAX Karsten Blees via GitGitGadget
2025-12-17 14:44 ` Patrick Steinhardt
2025-12-19 8:50 ` Johannes Schindelin
2025-12-19 11:51 ` Patrick Steinhardt
2025-12-30 5:00 ` Junio C Hamano
2025-12-17 23:39 ` Junio C Hamano
2025-12-16 15:33 ` [PATCH 5/5] trim_last_path_component(): avoid hard-coding the directory separator Karsten Blees via GitGitGadget
2026-01-09 20:05 ` Johannes Schindelin via GitGitGadget [this message]
2026-01-09 20:05 ` [PATCH v2 1/5] mingw: do resolve symlinks in `getcwd()` Johannes Schindelin via GitGitGadget
2026-01-09 20:05 ` [PATCH v2 2/5] init: do parse _all_ core.* settings early Johannes Schindelin via GitGitGadget
2026-01-09 20:05 ` [PATCH v2 3/5] strbuf_readlink(): avoid calling `readlink()` twice in corner-cases Karsten Blees via GitGitGadget
2026-01-09 20:05 ` [PATCH v2 4/5] strbuf_readlink(): support link targets that exceed 2*PATH_MAX Johannes Schindelin via GitGitGadget
2026-01-09 20:05 ` [PATCH v2 5/5] trim_last_path_component(): avoid hard-coding the directory separator Karsten Blees via GitGitGadget
2026-01-11 4:04 ` [PATCH v2 0/5] Last preparations before upstreaming Git for Windows' symlink support Junio C Hamano
2026-01-12 8:35 ` Patrick Steinhardt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.2017.v2.git.1767989109.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=johannes.schindelin@gmx.de \
--cc=ps@pks.im \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox