diff options
| author | Karsten Blees <karsten.blees@gmail.com> | 2026-01-09 20:05:07 +0000 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2026-01-09 18:28:36 -0800 |
| commit | 0fcbb57f970f318df422ca756a269651885576b9 (patch) | |
| tree | 2f51b009cb71b86d0601214c270011ea9a5c92cb /strbuf.c | |
| parent | 7997e36561b9f7c084ea37ec280708736ab3dcb4 (diff) | |
| download | git-0fcbb57f970f318df422ca756a269651885576b9.tar.xz | |
strbuf_readlink(): avoid calling `readlink()` twice in corner-cases
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>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'strbuf.c')
| -rw-r--r-- | strbuf.c | 6 |
1 files changed, 3 insertions, 3 deletions
@@ -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; } |
