diff options
author | Toomas Soome <tsoome@me.com> | 2019-09-21 23:18:58 +0300 |
---|---|---|
committer | Toomas Soome <tsoome@me.com> | 2019-09-23 21:57:13 +0300 |
commit | b97b1727bc40d7d32c5d78e751b231aa5b8778ed (patch) | |
tree | 7df19df409bd6fcc621b664f62140c1ba04e7cd6 /usr/src/cmd/boot | |
parent | d8d05a42df1fe06e901e8428edbbe802a6e3fc57 (diff) | |
download | illumos-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.c | 7 |
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); |