Skip to content

Commit 8c1efe3

Browse files
siddhpantgregkh
authored andcommitted
jfs: jfs_dmap: Validate db_l2nbperpage while mounting
commit 1150991 upstream. 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> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent ba90263 commit 8c1efe3

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
@@ -191,7 +191,13 @@ int dbMount(struct inode *ipbmap)
191191
dbmp_le = (struct dbmap_disk *) mp->data;
192192
bmp->db_mapsize = le64_to_cpu(dbmp_le->dn_mapsize);
193193
bmp->db_nfree = le64_to_cpu(dbmp_le->dn_nfree);
194+
194195
bmp->db_l2nbperpage = le32_to_cpu(dbmp_le->dn_l2nbperpage);
196+
if (bmp->db_l2nbperpage > L2PSIZE - L2MINBLOCKSIZE) {
197+
err = -EINVAL;
198+
goto err_release_metapage;
199+
}
200+
195201
bmp->db_numag = le32_to_cpu(dbmp_le->dn_numag);
196202
if (!bmp->db_numag) {
197203
err = -EINVAL;

fs/jfs/jfs_filsys.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,9 @@
135135
#define NUM_INODE_PER_IAG INOSPERIAG
136136

137137
#define MINBLOCKSIZE 512
138+
#define L2MINBLOCKSIZE 9
138139
#define MAXBLOCKSIZE 4096
140+
#define L2MAXBLOCKSIZE 12
139141
#define MAXFILESIZE ((s64)1 << 52)
140142

141143
#define JFS_LINK_MAX 0xffffffff

0 commit comments

Comments
 (0)