summaryrefslogtreecommitdiff
path: root/tls.c
diff options
context:
space:
mode:
authorMartin Pool <mbp@samba.org>2001-12-14 01:48:48 +0000
committerMartin Pool <mbp@samba.org>2001-12-14 01:48:48 +0000
commit0771727d41929db4e7e592f85a9691ca473e6251 (patch)
tree937df475b2090e7cbef797c8aa86e90136f13397 /tls.c
parenta5d74a1876cd6ca28eec7dab427a974000bf6007 (diff)
downloadrsync-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.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/tls.c b/tls.c
index d02a7a4c..f57648da 100644
--- a/tls.c
+++ b/tls.c
@@ -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;
}