Integer underflow in efipart_realstrategy when I/O starts after end of disk
This fixes an integer underflow in efipart_realstrategy, which causes crashes when an I/O operation's start point is after the end of the disk. This can happen when trying to detect filesystems on very small disks. This can occur if a BIOS freebsd-boot partition exists on a system when the EFI loader is being used. PR: 219000 Submitted by: Eric McCorkle <eric@metricspace.net> Reviewed by: cem (previous version), tsoome (previous version) MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D10559
This commit is contained in:
parent
993d3ded79
commit
e11bad9d2b
@ -888,6 +888,7 @@ efipart_realstrategy(void *devdata, int rw, daddr_t blk, size_t size,
|
||||
char *blkbuf;
|
||||
size_t blkoff, blksz;
|
||||
int error;
|
||||
size_t diskend, readstart;
|
||||
|
||||
if (dev == NULL || blk < 0)
|
||||
return (EINVAL);
|
||||
@ -925,7 +926,15 @@ efipart_realstrategy(void *devdata, int rw, daddr_t blk, size_t size,
|
||||
|
||||
/* make sure we don't read past disk end */
|
||||
if ((off + size) / blkio->Media->BlockSize > d_offset + disk_blocks) {
|
||||
size = d_offset + disk_blocks - off / blkio->Media->BlockSize;
|
||||
diskend = d_offset + disk_blocks;
|
||||
readstart = off / blkio->Media->BlockSize;
|
||||
|
||||
if (diskend <= readstart) {
|
||||
*rsize = 0;
|
||||
|
||||
return (EIO);
|
||||
}
|
||||
size = diskend - readstart;
|
||||
size = size * blkio->Media->BlockSize;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user