Browse Source

[smbios] Allow access to unreferenced SMBIOS strings

iPXE allows access to general SMBIOS settings using the syntax:

  smbios/<type>.<offset>.<length>

This provides access to any fixed-offset field within an SMBIOS
structure.  This syntax is currently overloaded to interpret a zero
<length> as meaning that the byte at <offset> contains a string index;
this provides access to SMBIOS strings (which are not located at fixed
offsets).

The "OEM Strings" SMBIOS structure contains strings which are not
referenced by any fixed string index field within the structure.  iPXE
currently provides no way to access these strings.

Fix by overloading the syntax for numerical SMBIOS settings to
interpret an <offset> of zero as implying that <length> contains a
literal string index.  The OEM Strings can then be accessed using:

  smbios/11.0.1
  smbios/11.0.2
  smbios/11.0.3
  ...

The actual byte at offset zero will always contain the structure type,
which is already known since it must be specified in order to access
the structure.  There is thus no plausible existing use case for an
offset of zero; overloading the syntax in this way should therefore
not break compatibility with any existing scripts.

The corner case where both <offset> and <length> are zero is undefined
(and, for now, will simply return a "not found" error).

Signed-off-by: Michael Brown <mcb30@ipxe.org>
tags/v1.20.1
Michael Brown 11 years ago
parent
commit
a352fde45e
1 changed files with 10 additions and 4 deletions
  1. 10
    4
      src/interface/smbios/smbios_settings.c

+ 10
- 4
src/interface/smbios/smbios_settings.c View File

99
 		uint8_t buf[structure.header.len];
99
 		uint8_t buf[structure.header.len];
100
 		const void *raw;
100
 		const void *raw;
101
 		union uuid uuid;
101
 		union uuid uuid;
102
+		unsigned int index;
102
 
103
 
103
 		/* Read SMBIOS structure */
104
 		/* Read SMBIOS structure */
104
 		if ( ( rc = read_smbios_structure ( &structure, buf,
105
 		if ( ( rc = read_smbios_structure ( &structure, buf,
105
 						    sizeof ( buf ) ) ) != 0 )
106
 						    sizeof ( buf ) ) ) != 0 )
106
 			return rc;
107
 			return rc;
107
 
108
 
108
-		/* A tag length of zero indicates a string */
109
-		if ( tag_len == 0 ) {
110
-			if ( ( rc = read_smbios_string ( &structure,
111
-							 buf[tag_offset],
109
+		/* A <length> of zero indicates that the byte at
110
+		 * <offset> contains a string index.  An <offset> of
111
+		 * zero indicates that the <length> contains a literal
112
+		 * string index.
113
+		 */
114
+		if ( ( tag_len == 0 ) || ( tag_offset == 0 ) ) {
115
+			index = ( ( tag_offset == 0 ) ?
116
+				  tag_len : buf[tag_offset] );
117
+			if ( ( rc = read_smbios_string ( &structure, index,
112
 							 data, len ) ) < 0 ) {
118
 							 data, len ) ) < 0 ) {
113
 				return rc;
119
 				return rc;
114
 			}
120
 			}

Loading…
Cancel
Save