[PATCH 3/5] strbuf_readlink(): avoid calling `readlink()` twice in corner-cases
- From
Karsten Blees via GitGitGadget <gitgitgadget@gmail.com>
- Date
- Dec 16, 2025, 15:33 UTC
- Message-ID
- <dba281027a8fc49fc152a8d072761ea238aa54d4.1765899229.git.gitgitgadget@gmail.com>
- In-Reply-To
- <pull.2017.git.1765899229.gitgitgadget@gmail.com>
From: Karsten Blees <blees@dcon.de>
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 <blees@dcon.de> 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