diff options
author | Dmitry Bazhenov <atrey@emcraft.com> | 2006-05-05 17:46:49 -0400 |
---|---|---|
committer | David Woodhouse <dwmw2@infradead.org> | 2006-05-05 17:46:49 -0400 |
commit | 422138dd68202fbd8ca9fb0df65e92d733249374 (patch) | |
tree | 6991cf489ef3fa040309c2e715e02d61632fa7d4 /fs/jffs2/fs.c | |
parent | edc4ff7c08e9885c40e60c4fb39fa42cc91a0602 (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>
Diffstat (limited to 'fs/jffs2/fs.c')
-rw-r--r-- | fs/jffs2/fs.c | 7 |
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 | ||