summaryrefslogtreecommitdiffstats
path: root/fs/hfs/inode.c
diff options
context:
space:
mode:
authorAlexey Khoroshilov <khoroshilov@ispras.ru>2013-04-30 18:27:52 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-04-30 20:04:05 -0400
commit9509f17851da294f8ecf0fc0bfe0fe609671352d (patch)
treef1cbc43a20bf1d4d81fb31d0dedf9ad4463bda60 /fs/hfs/inode.c
parenteb53b6db7a53642b80b0ca4885cb91d5c7dbc0f8 (diff)
hfs: add error checking for hfs_find_init()
hfs_find_init() may fail with ENOMEM, but there are places, where the returned value is not checked. The consequences can be very unpleasant, e.g. kfree uninitialized pointer and inappropriate mutex unlocking. The patch adds checks for errors in hfs_find_init(). Found by Linux Driver Verification project (linuxtesting.org). Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru> Reviewed-by: Vyacheslav Dubeyko <slava@dubeyko.com> Cc: Hin-Tak Leung <htl10@users.sourceforge.net> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Cc: Christoph Hellwig <hch@lst.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/hfs/inode.c')
-rw-r--r--fs/hfs/inode.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/fs/hfs/inode.c b/fs/hfs/inode.c
index 3031dfdd2358..0847471ff04f 100644
--- a/fs/hfs/inode.c
+++ b/fs/hfs/inode.c
@@ -416,9 +416,12 @@ int hfs_write_inode(struct inode *inode, struct writeback_control *wbc)
416 struct inode *main_inode = inode; 416 struct inode *main_inode = inode;
417 struct hfs_find_data fd; 417 struct hfs_find_data fd;
418 hfs_cat_rec rec; 418 hfs_cat_rec rec;
419 int res;
419 420
420 dprint(DBG_INODE, "hfs_write_inode: %lu\n", inode->i_ino); 421 dprint(DBG_INODE, "hfs_write_inode: %lu\n", inode->i_ino);
421 hfs_ext_write_extent(inode); 422 res = hfs_ext_write_extent(inode);
423 if (res)
424 return res;
422 425
423 if (inode->i_ino < HFS_FIRSTUSER_CNID) { 426 if (inode->i_ino < HFS_FIRSTUSER_CNID) {
424 switch (inode->i_ino) { 427 switch (inode->i_ino) {
@@ -515,7 +518,11 @@ static struct dentry *hfs_file_lookup(struct inode *dir, struct dentry *dentry,
515 if (!inode) 518 if (!inode)
516 return ERR_PTR(-ENOMEM); 519 return ERR_PTR(-ENOMEM);
517 520
518 hfs_find_init(HFS_SB(dir->i_sb)->cat_tree, &fd); 521 res = hfs_find_init(HFS_SB(dir->i_sb)->cat_tree, &fd);
522 if (res) {
523 iput(inode);
524 return ERR_PTR(res);
525 }
519 fd.search_key->cat = HFS_I(dir)->cat_key; 526 fd.search_key->cat = HFS_I(dir)->cat_key;
520 res = hfs_brec_read(&fd, &rec, sizeof(rec)); 527 res = hfs_brec_read(&fd, &rec, sizeof(rec));
521 if (!res) { 528 if (!res) {