summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/boot/efi/libefi/efipart.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/sys/boot/efi/libefi/efipart.c b/sys/boot/efi/libefi/efipart.c
index 206a7d991e6b..adcb0b551008 100644
--- a/sys/boot/efi/libefi/efipart.c
+++ b/sys/boot/efi/libefi/efipart.c
@@ -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;
}