]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[smbios] Allow reading an entire SMBIOS data structure as a setting
authorMichael Brown <mcb30@ipxe.org>
Wed, 31 Jul 2024 15:26:48 +0000 (16:26 +0100)
committerMichael Brown <mcb30@ipxe.org>
Wed, 31 Jul 2024 15:26:48 +0000 (16:26 +0100)
The general syntax for SMBIOS settings:

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

is currently extended such that a <length> of zero indicates that the
byte at <offset> contains a string index, and an <offset> of zero
indicates that the <length> contains a literal string index.

Since the byte at offset zero can never contain a string index, and a
literal string index can never have a zero value, the combination of
both <length> and <offset> being zero is currently invalid and will
always return "not found".

Extend the syntax such that the combination of both <length> and
<offset> being zero may be used to read the entire data structure.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/interface/smbios/smbios_settings.c

index ca3f2fe2f9cf53c58f25d016bc5f6f30bc39d0a0..095c35d37d8c3099e15784974b45e20b853c6dd3 100644 (file)
@@ -117,8 +117,16 @@ static int smbios_fetch ( struct settings *settings __unused,
                 * <offset> contains a string index.  An <offset> of
                 * zero indicates that the <length> contains a literal
                 * string index.
+                *
+                * Since the byte at offset zero can never contain a
+                * string index, and a literal string index can never
+                * be zero, the combination of both <length> and
+                * <offset> being zero indicates that the entire
+                * structure is to be read.
                 */
-               if ( ( tag_len == 0 ) || ( tag_offset == 0 ) ) {
+               if ( ( tag_len == 0 ) && ( tag_offset == 0 ) ) {
+                       tag_len = sizeof ( buf );
+               } else if ( ( tag_len == 0 ) || ( tag_offset == 0 ) ) {
                        index = ( ( tag_offset == 0 ) ?
                                  tag_len : buf[tag_offset] );
                        if ( ( rc = read_smbios_string ( &structure, index,