aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorWarner Losh <imp@FreeBSD.org>2024-07-25 05:02:27 +0000
committerWarner Losh <imp@FreeBSD.org>2024-07-25 05:09:57 +0000
commit06326613afebc645433c6bf8a2249cf978db9e71 (patch)
tree41ed6c16e5c486be845c06bba031fb2e4caa5666 /sys
parentce41bee0b4b876a55a94ce7cfa77421e7b274a94 (diff)
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/ipmi/ipmi_smbios.c4
-rw-r--r--sys/dev/smbios/smbios.h8
2 files changed, 7 insertions, 5 deletions
diff --git a/sys/dev/ipmi/ipmi_smbios.c b/sys/dev/ipmi/ipmi_smbios.c
index 546db8f2677c..f9fc958d9739 100644
--- a/sys/dev/ipmi/ipmi_smbios.c
+++ b/sys/dev/ipmi/ipmi_smbios.c
@@ -192,8 +192,8 @@ ipmi_smbios_probe(struct ipmi_get_info *info)
/* Now map the actual table and walk it looking for an IPMI entry. */
table = pmap_mapbios(header->structure_table_address,
header->structure_table_length);
- smbios_walk_table(table, header->number_structures, smbios_ipmi_info,
- info);
+ smbios_walk_table(table, header->number_structures,
+ header->structure_table_length, smbios_ipmi_info, info);
/* Unmap everything. */
pmap_unmapbios(table, header->structure_table_length);
diff --git a/sys/dev/smbios/smbios.h b/sys/dev/smbios/smbios.h
index 42b7e1181486..01e67556cfc0 100644
--- a/sys/dev/smbios/smbios.h
+++ b/sys/dev/smbios/smbios.h
@@ -80,11 +80,13 @@ struct smbios_structure_header {
typedef void (*smbios_callback_t)(struct smbios_structure_header *, void *);
static inline void
-smbios_walk_table(uint8_t *p, int entries, smbios_callback_t cb, void *arg)
+smbios_walk_table(uint8_t *p, int entries, vm_size_t len,
+ smbios_callback_t cb, void *arg)
{
struct smbios_structure_header *s;
+ uint8_t *endp = p + len;
- while (entries--) {
+ while (entries-- && p < endp) {
s = (struct smbios_structure_header *)p;
cb(s, arg);
@@ -93,7 +95,7 @@ smbios_walk_table(uint8_t *p, int entries, smbios_callback_t cb, void *arg)
* formatted area of this structure.
*/
p += s->length;
- while (!(p[0] == 0 && p[1] == 0))
+ while (p + 1 < endp && !(p[0] == 0 && p[1] == 0))
p++;
/*