cd9660: Reject volumes with small logical block sizes
ISO9660 permits specifying a logical block size that is any power of 2 greater than or equal to 512. The geom disk layer requires requests to be aligned on sector boundaries of the provider. With a volume that uses a logical block size smaller than the underlying disk sector size (e.g. a logical block size of 512 or 1024 on a CD which uses 2048 byte sectors), the current cd9660 vfs can issue requests for partial sectors, or on non-sector boundaries. Fixing this properly would require wrapping all of the calls to bread*/bwrite* in cd9660 vfs to roundup requests to be on sector boundaries which can include both the length, but also the starting sector number (and thus requiring use of an offset relative to b_data in the resulting buf). These images do not seem to be common however given that no one has fixed this in cd9660's vfs in the past few decades, so just reject them during mount with an error. If such images are found to be used in the wild in practice, then the larger fix can be applied. PR: 258063 Reported by: Robert Morris <rtm@lcs.mit.edu> Reviewed by: emaste MFC after: 1 week Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D41228
This commit is contained in:
parent
4c89c0127d
commit
4af849d71f
@ -336,6 +336,13 @@ iso_mountfs(struct vnode *devvp, struct mount *mp)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (logical_block_size < cp->provider->sectorsize) {
|
||||
printf("cd9660: Unsupported logical block size %u\n",
|
||||
logical_block_size);
|
||||
error = EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
rootp = (struct iso_directory_record *)
|
||||
(high_sierra?
|
||||
pri_sierra->root_directory_record:
|
||||
|
Loading…
Reference in New Issue
Block a user