linux_old1/fs/f2fs
Jaegeuk Kim 0cfe75c5b0 f2fs: enhance sanity_check_raw_super() to avoid potential overflows
In order to avoid the below overflow issue, we should have checked the
boundaries in superblock before reaching out to allocation. As Linus suggested,
the right place should be sanity_check_raw_super().

Dr Silvio Cesare of InfoSect reported:

There are integer overflows with using the cp_payload superblock field in the
f2fs filesystem potentially leading to memory corruption.

include/linux/f2fs_fs.h

struct f2fs_super_block {
...
        __le32 cp_payload;

fs/f2fs/f2fs.h

typedef u32 block_t;    /*
                         * should not change u32, since it is the on-disk block
                         * address format, __le32.
                         */
...

static inline block_t __cp_payload(struct f2fs_sb_info *sbi)
{
        return le32_to_cpu(F2FS_RAW_SUPER(sbi)->cp_payload);
}

fs/f2fs/checkpoint.c

        block_t start_blk, orphan_blocks, i, j;
...
        start_blk = __start_cp_addr(sbi) + 1 + __cp_payload(sbi);
        orphan_blocks = __start_sum_addr(sbi) - 1 - __cp_payload(sbi);

+++ integer overflows

...
        unsigned int cp_blks = 1 + __cp_payload(sbi);
...
        sbi->ckpt = kzalloc(cp_blks * blk_size, GFP_KERNEL);

+++ integer overflow leading to incorrect heap allocation.

        int cp_payload_blks = __cp_payload(sbi);
...
        ckpt->cp_pack_start_sum = cpu_to_le32(1 + cp_payload_blks +
                        orphan_blocks);

+++ sign bug and integer overflow

...
        for (i = 1; i < 1 + cp_payload_blks; i++)

+++ integer overflow

...

      sbi->max_orphans = (sbi->blocks_per_seg - F2FS_CP_PACKS -
                        NR_CURSEG_TYPE - __cp_payload(sbi)) *
                                F2FS_ORPHANS_PER_BLOCK;

+++ integer overflow

Reported-by: Greg KH <greg@kroah.com>
Reported-by: Silvio Cesare <silvio.cesare@gmail.com>
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Reviewed-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2018-05-31 11:31:49 -07:00
..
Kconfig fs/*/Kconfig: drop links to 404-compliant http://acl.bestbits.at 2018-01-01 12:45:37 -07:00
Makefile License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
acl.c posix_acl: convert posix_acl.a_refcount from atomic_t to refcount_t 2018-01-02 19:27:28 -08:00
acl.h f2fs: remove dead code f2fs_check_acl 2016-09-14 16:52:36 -07:00
checkpoint.c f2fs: remove duplicated dquot_initialize and fix error handling 2018-05-31 11:31:47 -07:00
data.c f2fs: rename dio_rwsem to i_gc_rwsem 2018-05-31 11:31:49 -07:00
debug.c f2fs: inject fault to kzalloc 2018-01-02 19:27:29 -08:00
dir.c page cache: use xa_lock 2018-04-11 10:28:39 -07:00
extent_cache.c f2fs: remove redundant initialization of pointer 'p' 2018-03-13 08:05:45 +09:00
f2fs.h f2fs: rename dio_rwsem to i_gc_rwsem 2018-05-31 11:31:49 -07:00
file.c f2fs: treat volatile file's data as hot one 2018-05-31 11:31:49 -07:00
gc.c f2fs: rename dio_rwsem to i_gc_rwsem 2018-05-31 11:31:49 -07:00
gc.h f2fs: add an ioctl to disable GC for specific file 2018-01-22 14:56:35 -08:00
hash.c f2fs: check entire encrypted bigname when finding a dentry 2017-05-04 11:44:35 -04:00
inline.c f2fs: remove unmatched zero_user_segment when convert inline dentry 2018-05-31 11:31:44 -07:00
inode.c f2fs: avoid bug_on on corrupted inode 2018-05-31 11:31:48 -07:00
namei.c f2fs: enforce fsync_mode=strict for renamed directory 2018-05-31 11:31:48 -07:00
node.c f2fs: give message and set need_fsck given broken node id 2018-05-31 11:31:48 -07:00
node.h f2fs: don't track new nat entry in nat set 2018-03-27 20:10:29 -07:00
recovery.c f2fs: do not check F2FS_INLINE_DOTS in recover 2018-05-31 11:31:47 -07:00
segment.c f2fs: treat volatile file's data as hot one 2018-05-31 11:31:49 -07:00
segment.h f2fs: don't use GFP_ZERO for page caches 2018-05-31 11:31:45 -07:00
shrinker.c f2fs: obsolete ALLOC_NID_LIST list 2017-10-10 12:49:53 -07:00
super.c f2fs: enhance sanity_check_raw_super() to avoid potential overflows 2018-05-31 11:31:49 -07:00
sysfs.c f2fs: don't split checkpoint in fstrim 2018-05-30 08:58:59 -07:00
trace.c f2fs: fix potential hangtask in f2fs_trace_pid 2018-01-02 19:27:30 -08:00
trace.h f2fs: add sbi and page pointer in f2fs_io_info 2015-05-28 15:41:32 -07:00
xattr.c f2fs: correct removexattr behavior for null valued extended attribute 2018-01-22 14:56:57 -08:00
xattr.h f2fs: guard macro variables with braces 2017-04-10 19:48:10 -07:00