Re: [PATCH 4/5] strbuf_readlink(): support link targets that exceed PATH_MAX
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Dec 17, 2025, 23:39 UTC
- Message-ID
- <xmqqy0n0znib.fsf@gitster.g>
- In-Reply-To
- <db1feb2293d20532f9468ab63ede43d4fc620203.1765899229.git.gitgitgadget@gmail.com>
"Karsten Blees via GitGitGadget" <gitgitgadget@gmail.com> writes:
Show 13 quoted lines
> From: Karsten Blees <blees@dcon.de> > > The `strbuf_readlink()` function refuses to read link targets that > exceed 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()`). > > Signed-off-by: Karsten Blees <blees@dcon.de> > Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> > --- > strbuf.c | 4 +--- > 1 file changed, 1 insertion(+), 3 deletions(-)
We've been bitten before by platforms that sets PATH_MAX too low (i.e., lower than what they comfortably support), so this is a welcome change.
Show 22 quoted lines
> diff --git a/strbuf.c b/strbuf.c
> index 44a8f6a554..fa4e30f112 100644
> --- a/strbuf.c
> +++ b/strbuf.c
> @@ -566,8 +566,6 @@ ssize_t strbuf_write(struct strbuf *sb, FILE *f)
> return sb->len ? fwrite(sb->buf, 1, sb->len, f) : 0;
> }
>
> -#define STRBUF_MAXLINK (2*PATH_MAX)
> -
> int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint)
> {
> size_t oldalloc = sb->alloc;
> @@ -575,7 +573,7 @@ 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);I briefly wondered if this would cause us loop infinitely on a truly broken platform, where readlink() somehow keeps returning negative, but we only retry when we got ERANGE (which can be seen several lines below the postimage of hte patch), so we should be safe.
Thanks.