[PATCH v2 3/5] strbuf_readlink(): avoid calling `readlink()` twice in corner-cases
- From
Karsten Blees via GitGitGadget <gitgitgadget@gmail.com>
- Date
- Jan 9, 2026, 20:05 UTC
- Message-ID
- <7fe463d68aa58fd563053ee1cb87b2a8c1152957.1767989109.git.gitgitgadget@gmail.com>
- In-Reply-To
- <pull.2017.v2.git.1767989109.gitgitgadget@gmail.com>
From: Karsten Blees <karsten.blees@gmail.com>
The `strbuf_readlink()` function calls `readlink()`` twice if the hint argument specifies the exact size of the link target (e.g. by passing stat.st_size as returned by `lstat()`). This is necessary because `readlink(..., hint) == hint` could mean that the buffer was too small.
Use `hint + 1` as buffer size to prevent this.
Signed-off-by: Karsten Blees <karsten.blees@gmail.com> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> --- strbuf.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/strbuf.c b/strbuf.c index 6c3851a7f8..44a8f6a554 100644 --- a/strbuf.c +++ b/strbuf.c @@ -578,12 +578,12 @@ int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint) while (hint < STRBUF_MAXLINK) { ssize_t len; - strbuf_grow(sb, hint); - len = readlink(path, sb->buf, hint); + strbuf_grow(sb, hint + 1); + len = readlink(path, sb->buf, hint + 1); if (len < 0) { if (errno != ERANGE) break; - } else if (len < hint) { + } else if (len <= hint) { strbuf_setlen(sb, len); return 0; }
-- gitgitgadget