Skip to content

Commit 1150991

Browse files
siddhpantkleikamp
authored andcommitted
jfs: jfs_dmap: Validate db_l2nbperpage while mounting
In jfs_dmap.c at line 381, BLKTODMAP is used to get a logical block number inside dbFree(). db_l2nbperpage, which is the log2 number of blocks per page, is passed as an argument to BLKTODMAP which uses it for shifting. Syzbot reported a shift out-of-bounds crash because db_l2nbperpage is too big. This happens because the large value is set without any validation in dbMount() at line 181. Thus, make sure that db_l2nbperpage is correct while mounting. Max number of blocks per page = Page size / Min block size => log2(Max num_block per page) = log2(Page size / Min block size) = log2(Page size) - log2(Min block size) => Max db_l2nbperpage = L2PSIZE - L2MINBLOCKSIZE Reported-and-tested-by: syzbot+d2cd27dcf8e04b232eb2@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?id=2a70a453331db32ed491f5cbb07e81bf2d225715 Cc: stable@vger.kernel.org Suggested-by: Dave Kleikamp <dave.kleikamp@oracle.com> Signed-off-by: Siddh Raman Pant <code@siddh.me> Signed-off-by: Dave Kleikamp <dave.kleikamp@oracle.com>
1 parent 692b7dc commit 1150991

2 files changed

Lines changed: 8 additions & 0 deletions

File tree

fs/jfs/jfs_dmap.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,13 @@ int dbMount(struct inode *ipbmap)
178178
dbmp_le = (struct dbmap_disk *) mp->data;
179179
bmp->db_mapsize = le64_to_cpu(dbmp_le->dn_mapsize);
180180
bmp->db_nfree = le64_to_cpu(dbmp_le->dn_nfree);
181+
181182
bmp->db_l2nbperpage = le32_to_cpu(dbmp_le->dn_l2nbperpage);
183+
if (bmp->db_l2nbperpage > L2PSIZE - L2MINBLOCKSIZE) {
184+
err = -EINVAL;
185+
goto err_release_metapage;
186+
}
187+
182188
bmp->db_numag = le32_to_cpu(dbmp_le->dn_numag);
183189
if (!bmp->db_numag) {
184190
err = -EINVAL;

fs/jfs/jfs_filsys.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,9 @@
122122
#define NUM_INODE_PER_IAG INOSPERIAG
123123

124124
#define MINBLOCKSIZE 512
125+
#define L2MINBLOCKSIZE 9
125126
#define MAXBLOCKSIZE 4096
127+
#define L2MAXBLOCKSIZE 12
126128
#define MAXFILESIZE ((s64)1 << 52)
127129

128130
#define JFS_LINK_MAX 0xffffffff

0 commit comments

Comments
 (0)