diff options
author | Michael Brown <mcb30@ipxe.org> | 2024-07-31 16:26:48 +0100 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2024-07-31 16:26:48 +0100 |
commit | c117e6a4811efa057dc70426d58a8dab75245862 (patch) | |
tree | 277eb52a716f1367635642841a72cf99ac36f700 | |
parent | 60d682409ed77cadf4ac3942c256c0fad00d2103 (diff) | |
download | ipxe-c117e6a4811efa057dc70426d58a8dab75245862.zip ipxe-c117e6a4811efa057dc70426d58a8dab75245862.tar.gz ipxe-c117e6a4811efa057dc70426d58a8dab75245862.tar.bz2 |
[smbios] Allow reading an entire SMBIOS data structure as a setting
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>
-rw-r--r-- | src/interface/smbios/smbios_settings.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/src/interface/smbios/smbios_settings.c b/src/interface/smbios/smbios_settings.c index ca3f2fe..095c35d 100644 --- a/src/interface/smbios/smbios_settings.c +++ b/src/interface/smbios/smbios_settings.c @@ -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, |