aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Bazhenov <atrey@emcraft.com>2006-05-05 17:46:49 -0400
committerDavid Woodhouse <dwmw2@infradead.org>2006-05-05 17:46:49 -0400
commit422138dd68202fbd8ca9fb0df65e92d733249374 (patch)
tree6991cf489ef3fa040309c2e715e02d61632fa7d4
parentedc4ff7c08e9885c40e60c4fb39fa42cc91a0602 (diff)
[JFFS2] Fix race in setting file attributes
It seems like there is a potential race in the function jffs2_do_setattr() in the case when attributes of a symlink are updated. The symlink metadata is read without having f->sem locked. The following patch should fix the race. Signed-off-by: Dmitry Bazhenov <atrey@emcraft.com> Signed-off-by: David Woodhouse <dwmw2@infradead.org>
-rw-r--r--fs/jffs2/fs.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/fs/jffs2/fs.c b/fs/jffs2/fs.c
index 09e5d10b8840..ea1f37d4fc58 100644
--- a/fs/jffs2/fs.c
+++ b/fs/jffs2/fs.c
@@ -56,15 +56,20 @@ static int jffs2_do_setattr (struct inode *inode, struct iattr *iattr)
56 mdatalen = sizeof(dev); 56 mdatalen = sizeof(dev);
57 D1(printk(KERN_DEBUG "jffs2_setattr(): Writing %d bytes of kdev_t\n", mdatalen)); 57 D1(printk(KERN_DEBUG "jffs2_setattr(): Writing %d bytes of kdev_t\n", mdatalen));
58 } else if (S_ISLNK(inode->i_mode)) { 58 } else if (S_ISLNK(inode->i_mode)) {
59 down(&f->sem);
59 mdatalen = f->metadata->size; 60 mdatalen = f->metadata->size;
60 mdata = kmalloc(f->metadata->size, GFP_USER); 61 mdata = kmalloc(f->metadata->size, GFP_USER);
61 if (!mdata) 62 if (!mdata) {
63 up(&f->sem);
62 return -ENOMEM; 64 return -ENOMEM;
65 }
63 ret = jffs2_read_dnode(c, f, f->metadata, mdata, 0, mdatalen); 66 ret = jffs2_read_dnode(c, f, f->metadata, mdata, 0, mdatalen);
64 if (ret) { 67 if (ret) {
68 up(&f->sem);
65 kfree(mdata); 69 kfree(mdata);
66 return ret; 70 return ret;
67 } 71 }
72 up(&f->sem);
68 D1(printk(KERN_DEBUG "jffs2_setattr(): Writing %d bytes of symlink target\n", mdatalen)); 73 D1(printk(KERN_DEBUG "jffs2_setattr(): Writing %d bytes of symlink target\n", mdatalen));
69 } 74 }
70 75