* [Patch v2 0/3] firmware: dmi_scan: add some SMBIOSv3 corrections
@ 2015-02-18 11:33 Ivan Khoronzhuk
2015-02-18 11:33 ` [Patch v2 1/3] firmware: dmi_scan: fix dmi_len type Ivan Khoronzhuk
` (2 more replies)
0 siblings, 3 replies; 9+ messages in thread
From: Ivan Khoronzhuk @ 2015-02-18 11:33 UTC (permalink / raw)
To: matt.fleming, ard.biesheuvel; +Cc: leif.lindholm, linux-kernel, Ivan Khoronzhuk
This series adds corrections to dmi_scan:
- extends version to be like 3.4.5 format
- fix dmi_len to be 32 bit wide
v1: https://lkml.org/lkml/2015/2/11/124
v2..v1:
firmware: dmi_scan: fix dmi_len type
- now as a first patch in the series
firmware: dmi_scan: use full dmi version for SMBIOS3
- use shifted dmi_ver var for all versions
- display docrev version for 32 bit 3+ versions like 3.2.x
- don't display docrev for versions < 3
firmware: dmi_scan: use direct access to static vars
- move as the last patch and leave only corrections
Ivan Khoronzhuk (3):
firmware: dmi_scan: fix dmi_len type
firmware: dmi_scan: use full dmi version for SMBIOS3
firmware: dmi_scan: use direct access to static vars
drivers/firmware/dmi_scan.c | 37 +++++++++++++++++++++----------------
1 file changed, 21 insertions(+), 16 deletions(-)
--
1.9.1
^ permalink raw reply [flat|nested] 9+ messages in thread* [Patch v2 1/3] firmware: dmi_scan: fix dmi_len type 2015-02-18 11:33 [Patch v2 0/3] firmware: dmi_scan: add some SMBIOSv3 corrections Ivan Khoronzhuk @ 2015-02-18 11:33 ` Ivan Khoronzhuk 2015-02-23 13:42 ` Matt Fleming 2015-02-18 11:33 ` [Patch v2 2/3] firmware: dmi_scan: use full dmi version for SMBIOS3 Ivan Khoronzhuk 2015-02-18 11:33 ` [Patch v2 3/3] firmware: dmi_scan: use direct access to static vars Ivan Khoronzhuk 2 siblings, 1 reply; 9+ messages in thread From: Ivan Khoronzhuk @ 2015-02-18 11:33 UTC (permalink / raw) To: matt.fleming, ard.biesheuvel; +Cc: leif.lindholm, linux-kernel, Ivan Khoronzhuk According to SMBIOSv3 specification the length of DMI table can be up to 32bits wide. So use appropriate type to avoid overflow. It's obvious that dmi_num theoretically can be more than u16 also, so it's can be changed to u32 or at least it's better to use int instead of u16, but on that moment I cannot imagine dmi structure count more than 65535 and it can require changing type of vars that work with it. So I didn't correct it. Acked-by: Ard Biesheuvel <ard@linaro.org> Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> --- drivers/firmware/dmi_scan.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c index 66fda58..07d2960 100644 --- a/drivers/firmware/dmi_scan.c +++ b/drivers/firmware/dmi_scan.c @@ -78,7 +78,7 @@ static const char * __init dmi_string(const struct dmi_header *dm, u8 s) * We have to be cautious here. We have seen BIOSes with DMI pointers * pointing to completely the wrong place for example */ -static void dmi_table(u8 *buf, int len, int num, +static void dmi_table(u8 *buf, u32 len, int num, void (*decode)(const struct dmi_header *, void *), void *private_data) { @@ -117,7 +117,7 @@ static void dmi_table(u8 *buf, int len, int num, static u8 smbios_header[32]; static int smbios_header_size; static phys_addr_t dmi_base; -static u16 dmi_len; +static u32 dmi_len; static u16 dmi_num; static int __init dmi_walk_early(void (*decode)(const struct dmi_header *, -- 1.9.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [Patch v2 1/3] firmware: dmi_scan: fix dmi_len type 2015-02-18 11:33 ` [Patch v2 1/3] firmware: dmi_scan: fix dmi_len type Ivan Khoronzhuk @ 2015-02-23 13:42 ` Matt Fleming 0 siblings, 0 replies; 9+ messages in thread From: Matt Fleming @ 2015-02-23 13:42 UTC (permalink / raw) To: Ivan Khoronzhuk; +Cc: ard.biesheuvel, leif.lindholm, linux-kernel On Wed, 18 Feb, at 01:33:19PM, Ivan Khoronzhuk wrote: > According to SMBIOSv3 specification the length of DMI table can be > up to 32bits wide. So use appropriate type to avoid overflow. > > It's obvious that dmi_num theoretically can be more than u16 also, > so it's can be changed to u32 or at least it's better to use int > instead of u16, but on that moment I cannot imagine dmi structure > count more than 65535 and it can require changing type of vars that > work with it. So I didn't correct it. > > Acked-by: Ard Biesheuvel <ard@linaro.org> > Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> > --- > drivers/firmware/dmi_scan.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) Applied to the 'urgent' EFI branch and tagged for stable. Thanks Ivan. -- Matt Fleming, Intel Open Source Technology Center ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Patch v2 2/3] firmware: dmi_scan: use full dmi version for SMBIOS3 2015-02-18 11:33 [Patch v2 0/3] firmware: dmi_scan: add some SMBIOSv3 corrections Ivan Khoronzhuk 2015-02-18 11:33 ` [Patch v2 1/3] firmware: dmi_scan: fix dmi_len type Ivan Khoronzhuk @ 2015-02-18 11:33 ` Ivan Khoronzhuk 2015-02-23 13:54 ` Matt Fleming 2015-04-13 16:58 ` Jean Delvare 2015-02-18 11:33 ` [Patch v2 3/3] firmware: dmi_scan: use direct access to static vars Ivan Khoronzhuk 2 siblings, 2 replies; 9+ messages in thread From: Ivan Khoronzhuk @ 2015-02-18 11:33 UTC (permalink / raw) To: matt.fleming, ard.biesheuvel; +Cc: leif.lindholm, linux-kernel, Ivan Khoronzhuk New SMBIOS3 spec adds additional field for versioning - docrev. The docrev identifies the revision of a specification implemented in the table structures, so display SMBIOSv3 versions in format, like "3.22.1". In case of only 32 bit entry point for versions > 3 display dmi version like "3.22.x" as we don't know the docrev. In other cases display version like it was. Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> --- drivers/firmware/dmi_scan.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c index 07d2960..3f3470f 100644 --- a/drivers/firmware/dmi_scan.c +++ b/drivers/firmware/dmi_scan.c @@ -17,7 +17,7 @@ */ static const char dmi_empty_string[] = " "; -static u16 __initdata dmi_ver; +static u32 dmi_ver __initdata; /* * Catch too early calls to dmi_check_system(): */ @@ -200,7 +200,7 @@ static void __init dmi_save_uuid(const struct dmi_header *dm, int slot, * the UUID are supposed to be little-endian encoded. The specification * says that this is the defacto standard. */ - if (dmi_ver >= 0x0206) + if (dmi_ver >= 0x020600) sprintf(s, "%pUL", d); else sprintf(s, "%pUB", d); @@ -472,7 +472,7 @@ static void __init dmi_format_ids(char *buf, size_t len) */ static int __init dmi_present(const u8 *buf) { - int smbios_ver; + u32 smbios_ver; if (memcmp(buf, "_SM_", 4) == 0 && buf[5] < 32 && dmi_checksum(buf, buf[5])) { @@ -507,8 +507,9 @@ static int __init dmi_present(const u8 *buf) if (dmi_walk_early(dmi_decode) == 0) { if (smbios_ver) { dmi_ver = smbios_ver; - pr_info("SMBIOS %d.%d present.\n", - dmi_ver >> 8, dmi_ver & 0xFF); + pr_info("SMBIOS %d.%d%s present.\n", + dmi_ver >> 8, dmi_ver & 0xFF, + (dmi_ver < 0x0300) ? "" : ".x"); } else { smbios_header_size = 15; memcpy(smbios_header, buf, smbios_header_size); @@ -517,6 +518,7 @@ static int __init dmi_present(const u8 *buf) pr_info("Legacy DMI %d.%d present.\n", dmi_ver >> 8, dmi_ver & 0xFF); } + dmi_ver <<= 8; dmi_format_ids(dmi_ids_string, sizeof(dmi_ids_string)); printk(KERN_DEBUG "DMI: %s\n", dmi_ids_string); return 0; @@ -534,7 +536,8 @@ static int __init dmi_smbios3_present(const u8 *buf) { if (memcmp(buf, "_SM3_", 5) == 0 && buf[6] < 32 && dmi_checksum(buf, buf[6])) { - dmi_ver = get_unaligned_be16(buf + 7); + dmi_ver = get_unaligned_be32(buf + 6); + dmi_ver &= 0xFFFFFF; dmi_len = get_unaligned_le32(buf + 12); dmi_base = get_unaligned_le64(buf + 16); smbios_header_size = buf[6]; @@ -553,8 +556,9 @@ static int __init dmi_smbios3_present(const u8 *buf) dmi_num = dmi_len / 4; if (dmi_walk_early(dmi_decode) == 0) { - pr_info("SMBIOS %d.%d present.\n", - dmi_ver >> 8, dmi_ver & 0xFF); + pr_info("SMBIOS %d.%d.%d present.\n", + dmi_ver >> 16, (dmi_ver >> 8) & 0xFF, + dmi_ver & 0xFF); dmi_format_ids(dmi_ids_string, sizeof(dmi_ids_string)); pr_debug("DMI: %s\n", dmi_ids_string); return 0; -- 1.9.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [Patch v2 2/3] firmware: dmi_scan: use full dmi version for SMBIOS3 2015-02-18 11:33 ` [Patch v2 2/3] firmware: dmi_scan: use full dmi version for SMBIOS3 Ivan Khoronzhuk @ 2015-02-23 13:54 ` Matt Fleming 2015-04-13 16:58 ` Jean Delvare 1 sibling, 0 replies; 9+ messages in thread From: Matt Fleming @ 2015-02-23 13:54 UTC (permalink / raw) To: Ivan Khoronzhuk; +Cc: ard.biesheuvel, leif.lindholm, linux-kernel On Wed, 18 Feb, at 01:33:20PM, Ivan Khoronzhuk wrote: > New SMBIOS3 spec adds additional field for versioning - docrev. > The docrev identifies the revision of a specification implemented in > the table structures, so display SMBIOSv3 versions in format, > like "3.22.1". > > In case of only 32 bit entry point for versions > 3 display > dmi version like "3.22.x" as we don't know the docrev. > > In other cases display version like it was. > > Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> > --- > drivers/firmware/dmi_scan.c | 20 ++++++++++++-------- > 1 file changed, 12 insertions(+), 8 deletions(-) Applied to the EFI 'next' branch, thanks Ivan. -- Matt Fleming, Intel Open Source Technology Center ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Patch v2 2/3] firmware: dmi_scan: use full dmi version for SMBIOS3 2015-02-18 11:33 ` [Patch v2 2/3] firmware: dmi_scan: use full dmi version for SMBIOS3 Ivan Khoronzhuk 2015-02-23 13:54 ` Matt Fleming @ 2015-04-13 16:58 ` Jean Delvare 1 sibling, 0 replies; 9+ messages in thread From: Jean Delvare @ 2015-04-13 16:58 UTC (permalink / raw) To: Ivan Khoronzhuk; +Cc: matt.fleming, ard.biesheuvel, leif.lindholm, linux-kernel Hi Ivan, Sorry for the very late review. On Wed, 18 Feb 2015 13:33:20 +0200, Ivan Khoronzhuk wrote: > New SMBIOS3 spec adds additional field for versioning - docrev. > The docrev identifies the revision of a specification implemented in > the table structures, so display SMBIOSv3 versions in format, > like "3.22.1". I'm not sure if that will be terribly useful in practice, but it certainly can't hurt, so why not. > In case of only 32 bit entry point for versions > 3 display > dmi version like "3.22.x" as we don't know the docrev. > > In other cases display version like it was. I don't like this part, see below. > Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> > --- > drivers/firmware/dmi_scan.c | 20 ++++++++++++-------- > 1 file changed, 12 insertions(+), 8 deletions(-) > > diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c > index 07d2960..3f3470f 100644 > --- a/drivers/firmware/dmi_scan.c > +++ b/drivers/firmware/dmi_scan.c > @@ -17,7 +17,7 @@ > */ > static const char dmi_empty_string[] = " "; > > -static u16 __initdata dmi_ver; > +static u32 dmi_ver __initdata; > /* > * Catch too early calls to dmi_check_system(): > */ > @@ -200,7 +200,7 @@ static void __init dmi_save_uuid(const struct dmi_header *dm, int slot, > * the UUID are supposed to be little-endian encoded. The specification > * says that this is the defacto standard. > */ > - if (dmi_ver >= 0x0206) > + if (dmi_ver >= 0x020600) > sprintf(s, "%pUL", d); > else > sprintf(s, "%pUB", d); > @@ -472,7 +472,7 @@ static void __init dmi_format_ids(char *buf, size_t len) > */ > static int __init dmi_present(const u8 *buf) > { > - int smbios_ver; > + u32 smbios_ver; This makes little sense, as the code handles smbios_ver as a 16-bit value. You should either leave this alone (this change is not needed AFAICS?), or declare it as a u16. It only makes sense to make it a u32 if you change the code to store 24-bit values in it as you ultimately do in dmi_ver. > > if (memcmp(buf, "_SM_", 4) == 0 && > buf[5] < 32 && dmi_checksum(buf, buf[5])) { > @@ -507,8 +507,9 @@ static int __init dmi_present(const u8 *buf) > if (dmi_walk_early(dmi_decode) == 0) { > if (smbios_ver) { > dmi_ver = smbios_ver; > - pr_info("SMBIOS %d.%d present.\n", > - dmi_ver >> 8, dmi_ver & 0xFF); > + pr_info("SMBIOS %d.%d%s present.\n", > + dmi_ver >> 8, dmi_ver & 0xFF, > + (dmi_ver < 0x0300) ? "" : ".x"); I see zero value in this change. The trailing .x adds no information for the reader, and if anyone tries to parse that line, this is more work as they have 3 different formats to handle instead of 2. > } else { > smbios_header_size = 15; > memcpy(smbios_header, buf, smbios_header_size); > @@ -517,6 +518,7 @@ static int __init dmi_present(const u8 *buf) > pr_info("Legacy DMI %d.%d present.\n", > dmi_ver >> 8, dmi_ver & 0xFF); > } > + dmi_ver <<= 8; I understand this was the easiest way to implement the change, but I'm not really comfortable with dmi_ver having different formats for different parts of the code. This is rather error prone for future changes, even if the code is currently correct. > dmi_format_ids(dmi_ids_string, sizeof(dmi_ids_string)); > printk(KERN_DEBUG "DMI: %s\n", dmi_ids_string); > return 0; > @@ -534,7 +536,8 @@ static int __init dmi_smbios3_present(const u8 *buf) > { > if (memcmp(buf, "_SM3_", 5) == 0 && > buf[6] < 32 && dmi_checksum(buf, buf[6])) { > - dmi_ver = get_unaligned_be16(buf + 7); > + dmi_ver = get_unaligned_be32(buf + 6); > + dmi_ver &= 0xFFFFFF; That would easily fit on a single line. > dmi_len = get_unaligned_le32(buf + 12); > dmi_base = get_unaligned_le64(buf + 16); > smbios_header_size = buf[6]; > @@ -553,8 +556,9 @@ static int __init dmi_smbios3_present(const u8 *buf) > dmi_num = dmi_len / 4; > > if (dmi_walk_early(dmi_decode) == 0) { > - pr_info("SMBIOS %d.%d present.\n", > - dmi_ver >> 8, dmi_ver & 0xFF); > + pr_info("SMBIOS %d.%d.%d present.\n", > + dmi_ver >> 16, (dmi_ver >> 8) & 0xFF, > + dmi_ver & 0xFF); > dmi_format_ids(dmi_ids_string, sizeof(dmi_ids_string)); > pr_debug("DMI: %s\n", dmi_ids_string); > return 0; -- Jean Delvare SUSE L3 Support ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Patch v2 3/3] firmware: dmi_scan: use direct access to static vars 2015-02-18 11:33 [Patch v2 0/3] firmware: dmi_scan: add some SMBIOSv3 corrections Ivan Khoronzhuk 2015-02-18 11:33 ` [Patch v2 1/3] firmware: dmi_scan: fix dmi_len type Ivan Khoronzhuk 2015-02-18 11:33 ` [Patch v2 2/3] firmware: dmi_scan: use full dmi version for SMBIOS3 Ivan Khoronzhuk @ 2015-02-18 11:33 ` Ivan Khoronzhuk 2015-02-23 13:55 ` Matt Fleming 2015-04-13 17:26 ` Jean Delvare 2 siblings, 2 replies; 9+ messages in thread From: Ivan Khoronzhuk @ 2015-02-18 11:33 UTC (permalink / raw) To: matt.fleming, ard.biesheuvel; +Cc: leif.lindholm, linux-kernel, Ivan Khoronzhuk There is no reason to pass static vars to function that can use only them. The dmi_table() can use only dmi_len and dmi_num static vars, so use them directly. In this case we can freely change their type in one place and slightly decrease redundancy. Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> --- drivers/firmware/dmi_scan.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c index 3f3470f..8c065f7 100644 --- a/drivers/firmware/dmi_scan.c +++ b/drivers/firmware/dmi_scan.c @@ -18,6 +18,8 @@ static const char dmi_empty_string[] = " "; static u32 dmi_ver __initdata; +static u32 dmi_len; +static u16 dmi_num; /* * Catch too early calls to dmi_check_system(): */ @@ -78,7 +80,7 @@ static const char * __init dmi_string(const struct dmi_header *dm, u8 s) * We have to be cautious here. We have seen BIOSes with DMI pointers * pointing to completely the wrong place for example */ -static void dmi_table(u8 *buf, u32 len, int num, +static void dmi_table(u8 *buf, void (*decode)(const struct dmi_header *, void *), void *private_data) { @@ -89,7 +91,8 @@ static void dmi_table(u8 *buf, u32 len, int num, * Stop when we see all the items the table claimed to have * OR we run off the end of the table (also happens) */ - while ((i < num) && (data - buf + sizeof(struct dmi_header)) <= len) { + while ((i < dmi_num) && (data - buf + sizeof(struct dmi_header)) + <= dmi_len) { const struct dmi_header *dm = (const struct dmi_header *)data; /* @@ -98,9 +101,9 @@ static void dmi_table(u8 *buf, u32 len, int num, * table in dmi_decode or dmi_string */ data += dm->length; - while ((data - buf < len - 1) && (data[0] || data[1])) + while ((data - buf < dmi_len - 1) && (data[0] || data[1])) data++; - if (data - buf < len - 1) + if (data - buf < dmi_len - 1) decode(dm, private_data); /* @@ -117,8 +120,6 @@ static void dmi_table(u8 *buf, u32 len, int num, static u8 smbios_header[32]; static int smbios_header_size; static phys_addr_t dmi_base; -static u32 dmi_len; -static u16 dmi_num; static int __init dmi_walk_early(void (*decode)(const struct dmi_header *, void *)) @@ -129,7 +130,7 @@ static int __init dmi_walk_early(void (*decode)(const struct dmi_header *, if (buf == NULL) return -1; - dmi_table(buf, dmi_len, dmi_num, decode, NULL); + dmi_table(buf, decode, NULL); add_device_randomness(buf, dmi_len); @@ -913,7 +914,7 @@ int dmi_walk(void (*decode)(const struct dmi_header *, void *), if (buf == NULL) return -1; - dmi_table(buf, dmi_len, dmi_num, decode, private_data); + dmi_table(buf, decode, private_data); dmi_unmap(buf); return 0; -- 1.9.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [Patch v2 3/3] firmware: dmi_scan: use direct access to static vars 2015-02-18 11:33 ` [Patch v2 3/3] firmware: dmi_scan: use direct access to static vars Ivan Khoronzhuk @ 2015-02-23 13:55 ` Matt Fleming 2015-04-13 17:26 ` Jean Delvare 1 sibling, 0 replies; 9+ messages in thread From: Matt Fleming @ 2015-02-23 13:55 UTC (permalink / raw) To: Ivan Khoronzhuk; +Cc: ard.biesheuvel, leif.lindholm, linux-kernel On Wed, 18 Feb, at 01:33:21PM, Ivan Khoronzhuk wrote: > There is no reason to pass static vars to function that can use > only them. > > The dmi_table() can use only dmi_len and dmi_num static vars, so use > them directly. In this case we can freely change their type in one > place and slightly decrease redundancy. > > Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> > --- > drivers/firmware/dmi_scan.c | 17 +++++++++-------- > 1 file changed, 9 insertions(+), 8 deletions(-) Applied to the EFI 'next' branch, thanks Ivan. -- Matt Fleming, Intel Open Source Technology Center ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Patch v2 3/3] firmware: dmi_scan: use direct access to static vars 2015-02-18 11:33 ` [Patch v2 3/3] firmware: dmi_scan: use direct access to static vars Ivan Khoronzhuk 2015-02-23 13:55 ` Matt Fleming @ 2015-04-13 17:26 ` Jean Delvare 1 sibling, 0 replies; 9+ messages in thread From: Jean Delvare @ 2015-04-13 17:26 UTC (permalink / raw) To: Ivan Khoronzhuk; +Cc: matt.fleming, ard.biesheuvel, leif.lindholm, linux-kernel On Wed, 18 Feb 2015 13:33:21 +0200, Ivan Khoronzhuk wrote: > There is no reason to pass static vars to function that can use > only them. > > The dmi_table() can use only dmi_len and dmi_num static vars, so use > them directly. In this case we can freely change their type in one > place and slightly decrease redundancy. Too bad we changed dmi_len's type already ;-) I can see the benefit, and even if this certainly makes dmi_table slightly slower, no objection from me. > Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> > --- > drivers/firmware/dmi_scan.c | 17 +++++++++-------- > 1 file changed, 9 insertions(+), 8 deletions(-) > > diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c > index 3f3470f..8c065f7 100644 > --- a/drivers/firmware/dmi_scan.c > +++ b/drivers/firmware/dmi_scan.c > @@ -18,6 +18,8 @@ > static const char dmi_empty_string[] = " "; > > static u32 dmi_ver __initdata; > +static u32 dmi_len; > +static u16 dmi_num; A blank line here wouldn't hurt. > /* > * Catch too early calls to dmi_check_system(): > */ > @@ -78,7 +80,7 @@ static const char * __init dmi_string(const struct dmi_header *dm, u8 s) > * We have to be cautious here. We have seen BIOSes with DMI pointers > * pointing to completely the wrong place for example > */ > -static void dmi_table(u8 *buf, u32 len, int num, > +static void dmi_table(u8 *buf, > void (*decode)(const struct dmi_header *, void *), > void *private_data) > { > @@ -89,7 +91,8 @@ static void dmi_table(u8 *buf, u32 len, int num, > * Stop when we see all the items the table claimed to have > * OR we run off the end of the table (also happens) > */ > - while ((i < num) && (data - buf + sizeof(struct dmi_header)) <= len) { > + while ((i < dmi_num) && (data - buf + sizeof(struct dmi_header)) > + <= dmi_len) { One condition per line is easier to read: while ((i < dmi_num) && (data - buf + sizeof(struct dmi_header)) <= dmi_len) { > const struct dmi_header *dm = (const struct dmi_header *)data; > > /* > @@ -98,9 +101,9 @@ static void dmi_table(u8 *buf, u32 len, int num, > * table in dmi_decode or dmi_string > */ > data += dm->length; > - while ((data - buf < len - 1) && (data[0] || data[1])) > + while ((data - buf < dmi_len - 1) && (data[0] || data[1])) > data++; > - if (data - buf < len - 1) > + if (data - buf < dmi_len - 1) > decode(dm, private_data); > > /* > @@ -117,8 +120,6 @@ static void dmi_table(u8 *buf, u32 len, int num, > static u8 smbios_header[32]; > static int smbios_header_size; > static phys_addr_t dmi_base; > -static u32 dmi_len; > -static u16 dmi_num; > > static int __init dmi_walk_early(void (*decode)(const struct dmi_header *, > void *)) > @@ -129,7 +130,7 @@ static int __init dmi_walk_early(void (*decode)(const struct dmi_header *, > if (buf == NULL) > return -1; > > - dmi_table(buf, dmi_len, dmi_num, decode, NULL); > + dmi_table(buf, decode, NULL); > > add_device_randomness(buf, dmi_len); > > @@ -913,7 +914,7 @@ int dmi_walk(void (*decode)(const struct dmi_header *, void *), > if (buf == NULL) > return -1; > > - dmi_table(buf, dmi_len, dmi_num, decode, private_data); > + dmi_table(buf, decode, private_data); > > dmi_unmap(buf); > return 0; -- Jean Delvare SUSE L3 Support ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2015-04-13 17:26 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-02-18 11:33 [Patch v2 0/3] firmware: dmi_scan: add some SMBIOSv3 corrections Ivan Khoronzhuk 2015-02-18 11:33 ` [Patch v2 1/3] firmware: dmi_scan: fix dmi_len type Ivan Khoronzhuk 2015-02-23 13:42 ` Matt Fleming 2015-02-18 11:33 ` [Patch v2 2/3] firmware: dmi_scan: use full dmi version for SMBIOS3 Ivan Khoronzhuk 2015-02-23 13:54 ` Matt Fleming 2015-04-13 16:58 ` Jean Delvare 2015-02-18 11:33 ` [Patch v2 3/3] firmware: dmi_scan: use direct access to static vars Ivan Khoronzhuk 2015-02-23 13:55 ` Matt Fleming 2015-04-13 17:26 ` Jean Delvare
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox