diff options
author | Dmitry Bazhenov <atrey@emcraft.com> | 2006-05-05 22:46:49 +0100 |
---|---|---|
committer | David Woodhouse <dwmw2@infradead.org> | 2006-05-05 22:46:49 +0100 |
commit | 422138dd68202fbd8ca9fb0df65e92d733249374 (patch) | |
tree | 6991cf489ef3fa040309c2e715e02d61632fa7d4 /fs | |
parent | edc4ff7c08e9885c40e60c4fb39fa42cc91a0602 (diff) | |
download | linux-422138dd68202fbd8ca9fb0df65e92d733249374.tar.gz linux-422138dd68202fbd8ca9fb0df65e92d733249374.tar.bz2 linux-422138dd68202fbd8ca9fb0df65e92d733249374.zip |
[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')
-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) mdatalen = sizeof(dev); D1(printk(KERN_DEBUG "jffs2_setattr(): Writing %d bytes of kdev_t\n", mdatalen)); } else if (S_ISLNK(inode->i_mode)) { + down(&f->sem); mdatalen = f->metadata->size; mdata = kmalloc(f->metadata->size, GFP_USER); - if (!mdata) + if (!mdata) { + up(&f->sem); return -ENOMEM; + } ret = jffs2_read_dnode(c, f, f->metadata, mdata, 0, mdatalen); if (ret) { + up(&f->sem); kfree(mdata); return ret; } + up(&f->sem); D1(printk(KERN_DEBUG "jffs2_setattr(): Writing %d bytes of symlink target\n", mdatalen)); } |