• Randy Dunlap's avatar
    JFS: more checks for invalid superblock · 3bef198f
    Randy Dunlap authored
    syzbot is feeding invalid superblock data to JFS for mount testing.
    JFS does not check several of the fields -- just assumes that they
    are good since the JFS_MAGIC and version fields are good.
    
    In this case (syzbot reproducer), we have s_l2bsize == 0xda0c,
    pad == 0xf045, and s_state == 0x50, all of which are invalid IMO.
    Having s_l2bsize == 0xda0c causes this UBSAN warning:
      UBSAN: shift-out-of-bounds in fs/jfs/jfs_mount.c:373:25
      shift exponent -9716 is negative
    
    s_l2bsize can be tested for correctness. pad can be tested for non-0
    and punted. s_state can be tested for its valid values and punted.
    
    Do those 3 tests and if any of them fails, report the superblock as
    invalid/corrupt and let fsck handle it.
    
    With this patch, chkSuper() says this when JFS_DEBUG is enabled:
      jfs_mount: Mount Failure: superblock is corrupt!
      Mount JFS Failure: -22
      jfs_mount failed w/return code = -22
    
    The obvious problem with this method is that next week there could
    be another syzbot test that uses different fields for invalid values,
    this making this like a game of whack-a-mole.
    
    syzkaller link: https://syzkaller.appspot.com/bug?extid=36315852ece4132ec193
    
    Reported-by: syzbot+36315852ece4132ec193@syzkaller.appspotmail.com
    Reported-by: kernel test robot <lkp@intel.com> # v2
    Signed-off-by: default avatarRandy Dunlap <rdunlap@infradead.org>
    Signed-off-by: default avatarDave Kleikamp <dave.kleikamp@oracle.com>
    Cc: jfs-discussion@lists.sourceforge.net
    3bef198f
jfs_mount.c 12.3 KB