diff options
Diffstat (limited to 'sys/dev/smbios/smbios.h')
-rw-r--r-- | sys/dev/smbios/smbios.h | 8 |
1 files changed, 5 insertions, 3 deletions
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++; /* |