[syslinux] SDI support works correctly (sdi.c32)
Remi Lefevre
rlefevre at gmail.com
Wed Sep 3 07:13:55 PDT 2008
A new line was missing in the error string.
The patch has been tested with my XPe SDI image.
++
rémi
--- com32/modules/sdi.c.ini 2008-09-03 15:32:27.000000000 +0200
+++ com32/modules/sdi.c 2008-09-03 16:14:12.000000000 +0200
@@ -39,12 +39,25 @@
# define dprintf(f, ...) ((void)0)
#endif
+typedef uint8_t guid_t[16];
+
struct SDIHeader {
uint32_t Signature;
char Version[4];
uint64_t SDIReserved;
uint64_t BootCodeOffset;
uint64_t BootCodeSize;
+ uint64_t VendorID;
+ uint64_t DeviceID;
+ guid_t DeviceModel;
+ uint64_t DeviceRole;
+ uint64_t Reserved1;
+ guid_t RuntimeGUID;
+ uint64_t RuntimeOEMrev;
+ uint64_t Reserved2;
+ uint64_t PageAlignment; /* BLOB alignment value in pages */
+ uint64_t Reserved3[48];
+ uint64_t Checksum;
};
#define SDI_LOAD_ADDR (16 << 20) /* 16 MB */
@@ -139,6 +152,21 @@
return -1;
}
+/*
+ * Check that the sum of all bytes from first 512 bytes (SDI header)
+ * is 0 modulo 256.
+ */
+int has_valid_header(unsigned char *header)
+{
+ unsigned char checksum;
+ unsigned int i;
+
+ checksum = 0;
+ for (i = 0; i < sizeof(struct SDIHeader); i++)
+ checksum += header[i];
+ return (!checksum);
+}
+
int main(int argc, char *argv[])
{
void *data;
@@ -160,6 +188,11 @@
}
fputs("ok\n", stdout);
+ if (!has_valid_header(data)) {
+ error("SDI header is corrupted\n");
+ return 1;
+ }
+
boot_sdi(data, data_len);
error("Invalid SDI file or insufficient memory\n");
return 1;
More information about the Syslinux
mailing list