From 9dbae34c3da7667319df2191b4b0fee6552dd0e3 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Thu, 17 Jun 2021 13:28:32 +0200 Subject: lib/path: improve ul_path_readlink() to be more robust According to POSIX, readlink() makes no effort to null-terminate buffer with the result. It seems better to hide this disadvantage in the ul_path_...() API rather than assume buf[sz] = '\0' everywhere. Reported-by: Reported-by: Jan Pazdziora Signed-off-by: Karel Zak --- lib/path.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) (limited to 'lib/path.c') diff --git a/lib/path.c b/lib/path.c index 058c143f40..7576328d7c 100644 --- a/lib/path.c +++ b/lib/path.c @@ -542,22 +542,27 @@ DIR *ul_path_opendirf(struct path_cxt *pc, const char *path, ...) ssize_t ul_path_readlink(struct path_cxt *pc, char *buf, size_t bufsiz, const char *path) { int dirfd; + ssize_t ssz; if (!path) { const char *p = get_absdir(pc); if (!p) return -errno; - return readlink(p, buf, bufsiz); - } + ssz = readlink(p, buf, bufsiz - 1); + } else { + dirfd = ul_path_get_dirfd(pc); + if (dirfd < 0) + return dirfd; - dirfd = ul_path_get_dirfd(pc); - if (dirfd < 0) - return dirfd; + if (*path == '/') + path++; - if (*path == '/') - path++; + ssz = readlinkat(dirfd, path, buf, bufsiz - 1); + } - return readlinkat(dirfd, path, buf, bufsiz); + if (ssz >= 0) + buf[ssz] = '\0'; + return ssz; } /* -- cgit 1.2.3-korg