aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2024-07-31 16:26:48 +0100
committerMichael Brown <mcb30@ipxe.org>2024-07-31 16:26:48 +0100
commitc117e6a4811efa057dc70426d58a8dab75245862 (patch)
tree277eb52a716f1367635642841a72cf99ac36f700
parent60d682409ed77cadf4ac3942c256c0fad00d2103 (diff)
downloadipxe-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.c10
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,