aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorDuane Griffin <duaneg@dghda.com>2008-12-19 15:47:12 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2008-12-31 18:07:39 -0500
commitebd09abbd9699f328165aee50a070403fbf55a37 (patch)
treea253ba391180a3eed580a493eb831aaae167c837 /fs
parent035146851cfa2fe24c1d9dc7637bb009ad06b2f7 (diff)
vfs: ensure page symlinks are NUL-terminated
On-disk data corruption could cause a page link to have its i_size set to PAGE_SIZE (or a multiple thereof) and its contents all non-NUL. NUL-terminate the link name to ensure this doesn't cause further problems for the kernel. Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Duane Griffin <duaneg@dghda.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs')
-rw-r--r--fs/namei.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/fs/namei.c b/fs/namei.c
index ab441af4196b..9ed5e2818f80 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -2786,13 +2786,16 @@ int vfs_follow_link(struct nameidata *nd, const char *link)
2786/* get the link contents into pagecache */ 2786/* get the link contents into pagecache */
2787static char *page_getlink(struct dentry * dentry, struct page **ppage) 2787static char *page_getlink(struct dentry * dentry, struct page **ppage)
2788{ 2788{
2789 struct page * page; 2789 char *kaddr;
2790 struct page *page;
2790 struct address_space *mapping = dentry->d_inode->i_mapping; 2791 struct address_space *mapping = dentry->d_inode->i_mapping;
2791 page = read_mapping_page(mapping, 0, NULL); 2792 page = read_mapping_page(mapping, 0, NULL);
2792 if (IS_ERR(page)) 2793 if (IS_ERR(page))
2793 return (char*)page; 2794 return (char*)page;
2794 *ppage = page; 2795 *ppage = page;
2795 return kmap(page); 2796 kaddr = kmap(page);
2797 nd_terminate_link(kaddr, dentry->d_inode->i_size, PAGE_SIZE - 1);
2798 return kaddr;
2796} 2799}
2797 2800
2798int page_readlink(struct dentry *dentry, char __user *buffer, int buflen) 2801int page_readlink(struct dentry *dentry, char __user *buffer, int buflen)