diff options
author | Martin Pool <mbp@samba.org> | 2001-12-14 01:48:48 +0000 |
---|---|---|
committer | Martin Pool <mbp@samba.org> | 2001-12-14 01:48:48 +0000 |
commit | 0771727d41929db4e7e592f85a9691ca473e6251 (patch) | |
tree | 937df475b2090e7cbef797c8aa86e90136f13397 /tls.c | |
parent | a5d74a1876cd6ca28eec7dab427a974000bf6007 (diff) | |
download | rsync-0771727d41929db4e7e592f85a9691ca473e6251.tar.gz rsync-0771727d41929db4e7e592f85a9691ca473e6251.tar.bz2 rsync-0771727d41929db4e7e592f85a9691ca473e6251.zip |
Readlink(2) does not nul-terminate the output buffer, so we were
getting corrupt output when listing more than one symlink.
Diffstat (limited to 'tls.c')
-rw-r--r-- | tls.c | 8 |
1 files changed, 7 insertions, 1 deletions
@@ -80,12 +80,18 @@ static void list_file (const char *fname) * undefined. Also it tends not to be possible to reset a * symlink's mtime, so we have to ignore it too. */ if (S_ISLNK(buf.st_mode)) { + int len; buf.st_mode &= ~0777; buf.st_mtime = (time_t)0; buf.st_uid = buf.st_gid = 0; strcpy(linkbuf, " -> "); /* const-cast required for silly UNICOS headers */ - readlink((char *) fname, linkbuf+4, sizeof(linkbuf) - 4); + len = readlink((char *) fname, linkbuf+4, sizeof(linkbuf) - 4); + if (len == -1) + failed("readlink", fname); + else + /* it's not nul-terminated */ + linkbuf[4+len] = 0; } else { linkbuf[0] = 0; } |