From c6b80d76a6e1f76cdb5f1deaf298514843d0116a Mon Sep 17 00:00:00 2001 From: Matt Fleming Date: Mon, 22 Jul 2013 13:41:00 +0100 Subject: derivative_info: be sure not to dereference pointers All the BIOS get_derivative_info() implementations are incorrect. They all dereference pointers to various deriviative-specific data objects instead of using the address of the objects. This broke chain loading on SYSLINUX because the ->partoffset field contained the dereferenced value of 'Hidden' rather than the address. Signed-off-by: Matt Fleming --- core/isolinux-c.c | 10 +++++----- core/ldlinux-c.c | 12 ++++++------ core/pxelinux-c.c | 8 ++++---- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/core/isolinux-c.c b/core/isolinux-c.c index 8574eac7..b0173e08 100644 --- a/core/isolinux-c.c +++ b/core/isolinux-c.c @@ -2,8 +2,8 @@ #include #include -extern far_ptr_t OrigESDI; -extern const uint64_t *Hidden; +extern uint32_t OrigESDI; +extern const uint64_t Hidden; extern uint16_t BIOSType; extern uint16_t bios_cdrom; extern uint8_t DriveNumber; @@ -16,7 +16,7 @@ __export void get_derivative_info(union syslinux_derivative_info *di) di->iso.drive_number = DriveNumber; di->iso.cd_mode = ((BIOSType - bios_cdrom) >> 2); - di->iso.spec_packet = spec_packet; - di->iso.esdi_ptr = GET_PTR(OrigESDI); - di->iso.partoffset = Hidden; + di->iso.spec_packet = &spec_packet; + di->iso.esdi_ptr = &OrigESDI; + di->iso.partoffset = &Hidden; } diff --git a/core/ldlinux-c.c b/core/ldlinux-c.c index 0b9aa76d..1d01d9a7 100644 --- a/core/ldlinux-c.c +++ b/core/ldlinux-c.c @@ -3,9 +3,9 @@ #include extern uint8_t DriveNumber; -extern far_ptr_t PartInfo; -extern far_ptr_t OrigESDI; -extern const uint64_t *Hidden; +extern void *PartInfo; +extern uint32_t OrigESDI; +extern const uint64_t Hidden; __export void get_derivative_info(union syslinux_derivative_info *di) { @@ -13,7 +13,7 @@ __export void get_derivative_info(union syslinux_derivative_info *di) di->disk.sector_shift = SectorShift; di->disk.drive_number = DriveNumber; - di->disk.ptab_ptr = GET_PTR(PartInfo); - di->disk.esdi_ptr = GET_PTR(OrigESDI); - di->disk.partoffset = Hidden; + di->disk.ptab_ptr = &PartInfo; + di->disk.esdi_ptr = &OrigESDI; + di->disk.partoffset = &Hidden; } diff --git a/core/pxelinux-c.c b/core/pxelinux-c.c index 69c9aac3..36831894 100644 --- a/core/pxelinux-c.c +++ b/core/pxelinux-c.c @@ -1,8 +1,8 @@ #include #include -extern far_ptr_t StrucPtr; -extern far_ptr_t InitStack; +extern void *StrucPtr; +extern void *InitStack; /* * IP information. Note that the field are in the same order as the @@ -15,8 +15,8 @@ __export void get_derivative_info(union syslinux_derivative_info *di) { di->pxe.filesystem = SYSLINUX_FS_PXELINUX; di->pxe.apiver = APIVer; - di->pxe.pxenvptr = GET_PTR(StrucPtr); - di->pxe.stack = GET_PTR(InitStack); + di->pxe.pxenvptr = &StrucPtr; + di->pxe.stack = &InitStack; di->pxe.ipinfo = &IPInfo; di->pxe.myip = IPInfo.myip; } -- cgit v1.2.1