[PATCH] sftp-realpath: fix stack buffer over-read on empty symlink target

jelly 762233433 at qq.com
Thu Oct 29 13:15:45 AEDT 2026


From: immortal-jelly <xuehaolin at uniontech.com>

readlink(2) can return 0 when a symbolic link resolves to an empty
string.  In sftp_realpath() the result is used unconditionally a few
lines later:

if (symlink[slen - 1] != '/')

which reads one byte before the start of the symlink[] stack buffer
when slen is zero.  An authenticated SFTP user can create a link with
an empty target and trigger this path with a REALPATH request.

Treat a zero-length link target as a broken link and fail with ENOENT
before the buffer is used.

Reported via GitHub issue #721.
---
 sftp-realpath.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/sftp-realpath.c b/sftp-realpath.c
index 2ec779d8..4fcde6d5 100644
--- a/sftp-realpath.c
+++ b/sftp-realpath.c
@@ -173,6 +173,11 @@ sftp_realpath(const char *path, char *resolved)
  slen = readlink(resolved, symlink, sizeof(symlink) - 1);
  if (slen < 0)
  goto err;
+ if (slen == 0) {
+ /* empty symlink target is a broken link */
+ errno = ENOENT;
+ goto err;
+ }
  symlink[slen] = '\0';
  if (symlink[0] == '/') {
  resolved[1] = 0;
--
2.20.1


More information about the openssh-unix-dev mailing list