aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Fleming <matt.fleming@intel.com>2013-07-22 13:41:00 +0100
committerMatt Fleming <matt.fleming@intel.com>2013-07-22 14:30:32 +0100
commitc6b80d76a6e1f76cdb5f1deaf298514843d0116a (patch)
tree4e891f4fba486828236f4ceb8f416110b3e2aed7
parent56973f80f2728d3418b09047a7b023aa3c46e6e2 (diff)
downloadsyslinux-c6b80d76a6e1f76cdb5f1deaf298514843d0116a.tar.gz
syslinux-c6b80d76a6e1f76cdb5f1deaf298514843d0116a.tar.xz
syslinux-c6b80d76a6e1f76cdb5f1deaf298514843d0116a.zip
derivative_info: be sure not to dereference pointerssyslinux-6.02-pre9
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 <matt.fleming@intel.com>
-rw-r--r--core/isolinux-c.c10
-rw-r--r--core/ldlinux-c.c12
-rw-r--r--core/pxelinux-c.c8
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 <com32.h>
#include <fs.h>
-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 <fs.h>
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 <syslinux/config.h>
#include <com32.h>
-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;
}