quota: Sanity-check quota file headers on load
Perform basic sanity checks of quota headers to avoid kernel crashes on corrupted quota files. CC: stable@vger.kernel.org Reported-by: syzbot+f816042a7ae2225f25ba@syzkaller.appspotmail.com Reviewed-by: Andreas Dilger <adilger@dilger.ca> Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
parent
10f04d40a9
commit
11c514a99b
|
@ -157,6 +157,25 @@ static int v2_read_file_info(struct super_block *sb, int type)
|
|||
qinfo->dqi_entry_size = sizeof(struct v2r1_disk_dqblk);
|
||||
qinfo->dqi_ops = &v2r1_qtree_ops;
|
||||
}
|
||||
ret = -EUCLEAN;
|
||||
/* Some sanity checks of the read headers... */
|
||||
if ((loff_t)qinfo->dqi_blocks << qinfo->dqi_blocksize_bits >
|
||||
i_size_read(sb_dqopt(sb)->files[type])) {
|
||||
quota_error(sb, "Number of blocks too big for quota file size (%llu > %llu).",
|
||||
(loff_t)qinfo->dqi_blocks << qinfo->dqi_blocksize_bits,
|
||||
i_size_read(sb_dqopt(sb)->files[type]));
|
||||
goto out;
|
||||
}
|
||||
if (qinfo->dqi_free_blk >= qinfo->dqi_blocks) {
|
||||
quota_error(sb, "Free block number too big (%u >= %u).",
|
||||
qinfo->dqi_free_blk, qinfo->dqi_blocks);
|
||||
goto out;
|
||||
}
|
||||
if (qinfo->dqi_free_entry >= qinfo->dqi_blocks) {
|
||||
quota_error(sb, "Block with free entry too big (%u >= %u).",
|
||||
qinfo->dqi_free_entry, qinfo->dqi_blocks);
|
||||
goto out;
|
||||
}
|
||||
ret = 0;
|
||||
out:
|
||||
up_read(&dqopt->dqio_sem);
|
||||
|
|
Loading…
Reference in New Issue