[syslinux:firmware] derivative_info: be sure not to dereference pointers

syslinux-bot for Matt Fleming matt.fleming at intel.com
Mon Jul 22 06:33:06 PDT 2013


Commit-ID:  c6b80d76a6e1f76cdb5f1deaf298514843d0116a
Gitweb:     http://www.syslinux.org/commit/c6b80d76a6e1f76cdb5f1deaf298514843d0116a
Author:     Matt Fleming <matt.fleming at intel.com>
AuthorDate: Mon, 22 Jul 2013 13:41:00 +0100
Committer:  Matt Fleming <matt.fleming at intel.com>
CommitDate: Mon, 22 Jul 2013 14:30:32 +0100

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 <matt.fleming at intel.com>

---
 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 8574eac..b0173e0 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 0b9aa76..1d01d9a 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 69c9aac..3683189 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;
 }


More information about the Syslinux-commits mailing list