Mercurial > illumos > git > illumos-gate
changeset 20211:c673ba511cc3
13351 loader: vbe_find_mode_xydm() is using wrong safety and iteration is buggy
Reviewed by: Robert Mustacchi <rm@fingolfin.org>
Approved by: Dan McDonald <danmcd@joyent.com>
author | Toomas Soome <tsoome@me.com> |
---|---|
date | Sun, 06 Dec 2020 20:23:46 +0200 |
parents | 97ebd7dc417b |
children | cd16aeceed83 |
files | usr/src/boot/Makefile.version usr/src/boot/sys/boot/i386/libi386/vbe.c |
diffstat | 2 files changed, 12 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/boot/Makefile.version Fri Nov 13 17:48:45 2020 -0600 +++ b/usr/src/boot/Makefile.version Sun Dec 06 20:23:46 2020 +0200 @@ -34,4 +34,4 @@ # Use date like formatting here, YYYY.MM.DD.XX, without leading zeroes. # The version is processed from left to right, the version number can only # be increased. -BOOT_VERSION = $(LOADER_VERSION)-2020.12.07.1 +BOOT_VERSION = $(LOADER_VERSION)-2020.12.11.1
--- a/usr/src/boot/sys/boot/i386/libi386/vbe.c Fri Nov 13 17:48:45 2020 -0600 +++ b/usr/src/boot/sys/boot/i386/libi386/vbe.c Sun Dec 06 20:23:46 2020 +0200 @@ -51,6 +51,10 @@ /* The default VGA color palette format is 6 bits per primary color. */ int palette_format = 6; +#define VESA_MODE_BASE 0x100 +#define VESA_MODE_MAX 0x1ff +#define VESA_MODE_COUNT (VESA_MODE_MAX - VESA_MODE_BASE + 1) + /* Actually assuming mode 3. */ void bios_set_text_mode(int mode) @@ -458,7 +462,7 @@ struct modeinfoblock mi; uint32_t farptr; uint16_t mode; - int safety = 0, i; + int safety, i; memset(vbe, 0, sizeof (vbe)); memcpy(vbe->VbeSignature, "VBE2", 4); @@ -466,8 +470,7 @@ return (0); if (memcmp(vbe->VbeSignature, "VESA", 4) != 0) return (0); - farptr = vbe->VideoModePtr; - if (farptr == 0) + if (vbe->VideoModePtr == 0) return (0); if (m != -1) @@ -478,10 +481,12 @@ i = depth; while (i > 0) { + farptr = vbe->VideoModePtr; + safety = 0; while ((mode = *(uint16_t *)vbe_farptr(farptr)) != 0xffff) { safety++; farptr += 2; - if (safety == 100) + if (safety == VESA_MODE_COUNT) return (0); if (biosvbe_get_mode_info(mode, &mi) != VBE_SUCCESS) { continue; @@ -489,7 +494,6 @@ /* we only care about linear modes here */ if (vbe_mode_is_supported(&mi) == 0) continue; - safety = 0; if (m != -1) { if (m == mode) @@ -675,7 +679,7 @@ while ((mode = *(uint16_t *)vbe_farptr(farptr)) != 0xffff) { safety++; farptr += 2; - if (safety == 100) { + if (safety == VESA_MODE_COUNT) { printf("[?] "); break; } @@ -921,7 +925,7 @@ return (CMD_ERROR); } - if (modenum >= 0x100) { + if (modenum >= VESA_MODE_BASE) { if (vbestate.vbe_mode != modenum) { reset_font_flags(); bios_text_font(false);