summaryrefslogtreecommitdiff
path: root/fs/9p
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>2012-08-21 09:20:49 +0200
committerEric Van Hensbergen <ericvh@gmail.com>2012-09-06 13:54:53 -0500
commitba413ab2ccc49e6aa1ebc3523a75635b5e4a0494 (patch)
tree616525a5d4954660f290f9130c699002571c05e4 /fs/9p
parent4cbe5a555fa58a79b6ecbb6c531b8bab0650778d (diff)
downloadlwn-ba413ab2ccc49e6aa1ebc3523a75635b5e4a0494.tar.gz
lwn-ba413ab2ccc49e6aa1ebc3523a75635b5e4a0494.zip
fs/9p: avoid debug OOPS when reading a long symlink
Reading a symlink longer than the given buffer, a p9_debug use would try to print the link name (not NUL-terminated) using a %s format. Use %.*s instead, and replace the strncpy+strnlen with functionally equivalent strlen+memcpy. Signed-off-by: Jim Meyering <meyering@redhat.com> Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
Diffstat (limited to 'fs/9p')
-rw-r--r--fs/9p/vfs_inode.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c
index cbf9dbb1b2a2..890bed538f9b 100644
--- a/fs/9p/vfs_inode.c
+++ b/fs/9p/vfs_inode.c
@@ -1276,12 +1276,12 @@ static int v9fs_readlink(struct dentry *dentry, char *buffer, int buflen)
}
/* copy extension buffer into buffer */
- strncpy(buffer, st->extension, buflen);
+ retval = min(strlen(st->extension)+1, (size_t)buflen);
+ memcpy(buffer, st->extension, retval);
- p9_debug(P9_DEBUG_VFS, "%s -> %s (%s)\n",
- dentry->d_name.name, st->extension, buffer);
+ p9_debug(P9_DEBUG_VFS, "%s -> %s (%.*s)\n",
+ dentry->d_name.name, st->extension, buflen, buffer);
- retval = strnlen(buffer, buflen);
done:
p9stat_free(st);
kfree(st);