hfs/hfsplus: avoid WARN_ON() for sanity check, use proper error handling
[platform/kernel/linux-rpi.git] / fs / hfs / inode.c
index 9c329a3..3a155c1 100644 (file)
@@ -458,15 +458,16 @@ int hfs_write_inode(struct inode *inode, struct writeback_control *wbc)
                /* panic? */
                return -EIO;
 
+       res = -EIO;
        if (HFS_I(main_inode)->cat_key.CName.len > HFS_NAMELEN)
-               return -EIO;
+               goto out;
        fd.search_key->cat = HFS_I(main_inode)->cat_key;
        if (hfs_brec_find(&fd))
-               /* panic? */
                goto out;
 
        if (S_ISDIR(main_inode->i_mode)) {
-               WARN_ON(fd.entrylength < sizeof(struct hfs_cat_dir));
+               if (fd.entrylength < sizeof(struct hfs_cat_dir))
+                       goto out;
                hfs_bnode_read(fd.bnode, &rec, fd.entryoffset,
                           sizeof(struct hfs_cat_dir));
                if (rec.type != HFS_CDR_DIR ||
@@ -479,6 +480,8 @@ int hfs_write_inode(struct inode *inode, struct writeback_control *wbc)
                hfs_bnode_write(fd.bnode, &rec, fd.entryoffset,
                            sizeof(struct hfs_cat_dir));
        } else if (HFS_IS_RSRC(inode)) {
+               if (fd.entrylength < sizeof(struct hfs_cat_file))
+                       goto out;
                hfs_bnode_read(fd.bnode, &rec, fd.entryoffset,
                               sizeof(struct hfs_cat_file));
                hfs_inode_write_fork(inode, rec.file.RExtRec,
@@ -486,7 +489,8 @@ int hfs_write_inode(struct inode *inode, struct writeback_control *wbc)
                hfs_bnode_write(fd.bnode, &rec, fd.entryoffset,
                                sizeof(struct hfs_cat_file));
        } else {
-               WARN_ON(fd.entrylength < sizeof(struct hfs_cat_file));
+               if (fd.entrylength < sizeof(struct hfs_cat_file))
+                       goto out;
                hfs_bnode_read(fd.bnode, &rec, fd.entryoffset,
                           sizeof(struct hfs_cat_file));
                if (rec.type != HFS_CDR_FIL ||
@@ -503,9 +507,10 @@ int hfs_write_inode(struct inode *inode, struct writeback_control *wbc)
                hfs_bnode_write(fd.bnode, &rec, fd.entryoffset,
                            sizeof(struct hfs_cat_file));
        }
+       res = 0;
 out:
        hfs_find_exit(&fd);
-       return 0;
+       return res;
 }
 
 static struct dentry *hfs_file_lookup(struct inode *dir, struct dentry *dentry,