summaryrefslogtreecommitdiff
path: root/usr/src/cmd/boot
diff options
context:
space:
mode:
authorToomas Soome <tsoome@me.com>2019-09-21 23:18:58 +0300
committerToomas Soome <tsoome@me.com>2019-09-23 21:57:13 +0300
commitb97b1727bc40d7d32c5d78e751b231aa5b8778ed (patch)
tree7df19df409bd6fcc621b664f62140c1ba04e7cd6 /usr/src/cmd/boot
parentd8d05a42df1fe06e901e8428edbbe802a6e3fc57 (diff)
downloadillumos-gate-b97b1727bc40d7d32c5d78e751b231aa5b8778ed.tar.gz
11743 installboot: stage2 partition may be smaller than mboot buffer
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com> Reviewed by: Andy Fiddaman <omnios@citrus-it.co.uk> Approved by: Dan McDonald <danmcd@joyent.com>
Diffstat (limited to 'usr/src/cmd/boot')
-rw-r--r--usr/src/cmd/boot/installboot/i386/installboot.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/usr/src/cmd/boot/installboot/i386/installboot.c b/usr/src/cmd/boot/installboot/i386/installboot.c
index a9a8c932a8..3ed4e59577 100644
--- a/usr/src/cmd/boot/installboot/i386/installboot.c
+++ b/usr/src/cmd/boot/installboot/i386/installboot.c
@@ -595,6 +595,7 @@ read_stage2_cb(struct partlist *plist)
uint32_t buf_size;
uint32_t mboot_off;
multiboot_header_t *mboot;
+ size_t scan_size;
bblock = calloc(1, sizeof (ib_bootblock_t));
if (bblock == NULL)
@@ -608,8 +609,10 @@ read_stage2_cb(struct partlist *plist)
device = plist->pl_device;
plist->pl_stage = bblock;
offset = device->stage.offset * SECTOR_SIZE;
+ scan_size = MIN(sizeof (mboot_scan),
+ (device->stage.size - device->stage.offset) * sector_size);
- if (read_in(fd, mboot_scan, sizeof (mboot_scan), offset)
+ if (read_in(fd, mboot_scan, scan_size, offset)
!= BC_SUCCESS) {
BOOT_DEBUG("Error reading bootblock area\n");
perror("read");
@@ -618,7 +621,7 @@ read_stage2_cb(struct partlist *plist)
}
/* No multiboot means no chance of knowing bootblock size */
- if (find_multiboot(mboot_scan, sizeof (mboot_scan), &mboot_off)
+ if (find_multiboot(mboot_scan, scan_size, &mboot_off)
!= BC_SUCCESS) {
BOOT_DEBUG("Unable to find multiboot header\n");
(void) close(fd);