summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean Delvare <jdelvare@suse.de>2023-02-04 17:43:35 +0100
committerJean Delvare <jdelvare@suse.de>2023-02-04 17:43:35 +0100
commit11b168f206efe5b3ebe2f1e587fb3d816d6c4a6f (patch)
tree073c6356e09963cccfe210a3e7f27f31f519a6c1
parent9d2bbd5db427b063da137d9016fe6628038334eb (diff)
downloaddmidecode-git-11b168f206efe5b3ebe2f1e587fb3d816d6c4a6f.tar.gz
dmioem: Avoid intermediate buffer (HPE type 216)
Print the "Version Data" attribute directly instead of relying on an intermediate buffer on the stack. While this slightly increases the binary size, this also makes the code faster, lowers the memory footprint, and avoids the risk of buffer overrun. Signed-off-by: Jean Delvare <jdelvare@suse.de> Reviewed-by: Jerry Hoemann <jerry.hoemann@hpe.com>
-rw-r--r--dmioem.c54
1 files changed, 26 insertions, 28 deletions
diff --git a/dmioem.c b/dmioem.c
index 65a809b..0b3d91c 100644
--- a/dmioem.c
+++ b/dmioem.c
@@ -373,86 +373,84 @@ static void dmi_hp_216_fw_type(u16 code)
static void dmi_hp_216_version(u8 format, u8 *data)
{
- char buf[80];
+ const char * const name = "Version Data";
const char * const reserved = "Reserved";
- const char *vers = buf;
int gen;
gen = dmi_hpegen(dmi_product);
switch (format) {
case 0:
- sprintf(buf, "No Version Data");
+ pr_attr(name, "No Version Data");
break;
case 1:
- sprintf(buf, "%c.%d.%d", data[0] & (1 << 7) ? 'B' : 'R',
- data[0] & 0x7, data[1] & 0x7);
+ pr_attr(name, "%c.%d.%d", data[0] & (1 << 7) ? 'B' : 'R',
+ data[0] & 0x7, data[1] & 0x7);
break;
case 2:
- sprintf(buf, "%d.%d", data[0] >> 4, data[0] & 0x0f);
+ pr_attr(name, "%d.%d", data[0] >> 4, data[0] & 0x0f);
break;
case 4:
- sprintf(buf, "%d.%d.%d", data[0] >> 4, data[0] & 0x0f, data[1] & 0x7f);
+ pr_attr(name, "%d.%d.%d", data[0] >> 4, data[0] & 0x0f, data[1] & 0x7f);
break;
case 5:
if (gen == G9) {
- sprintf(buf, "%d.%d.%d", data[0] >> 4, data[0] & 0x0f, data[1] & 0x7f);
+ pr_attr(name, "%d.%d.%d", data[0] >> 4, data[0] & 0x0f, data[1] & 0x7f);
} else if (gen == G10 || gen == G10P) {
- sprintf(buf, "%d.%d.%d.%d", data[1] & 0x0f, data[3] & 0x0f,
- data[5] & 0x0f, data[6] & 0x0f);
+ pr_attr(name, "%d.%d.%d.%d", data[1] & 0x0f, data[3] & 0x0f,
+ data[5] & 0x0f, data[6] & 0x0f);
} else {
- vers = reserved;
+ pr_attr(name, "%s", reserved);
}
break;
case 6:
- sprintf(buf, "%d.%d", data[1], data[0]);
+ pr_attr(name, "%d.%d", data[1], data[0]);
break;
case 7:
- sprintf(buf, "v%d.%.2d (%.2d/%.2d/%d)", data[0], data[1],
- data[2], data[3], WORD(data + 4));
+ pr_attr(name, "v%d.%.2d (%.2d/%.2d/%d)", data[0], data[1],
+ data[2], data[3], WORD(data + 4));
break;
case 8:
- sprintf(buf, "%d.%d", WORD(data + 4), WORD(data));
+ pr_attr(name, "%d.%d", WORD(data + 4), WORD(data));
break;
case 9:
- sprintf(buf, "%d.%d.%d", data[0], data[1], WORD(data + 2));
+ pr_attr(name, "%d.%d.%d", data[0], data[1], WORD(data + 2));
break;
case 10:
- sprintf(buf, "%d.%d.%d Build %d", data[0], data[1], data[2], data[3]);
+ pr_attr(name, "%d.%d.%d Build %d", data[0], data[1], data[2], data[3]);
break;
case 11:
- sprintf(buf, "%d.%d %d", WORD(data + 2), WORD(data), DWORD(data + 4));
+ pr_attr(name, "%d.%d %d", WORD(data + 2), WORD(data), DWORD(data + 4));
break;
case 12:
- sprintf(buf, "%d.%d.%d.%d", WORD(data), WORD(data + 2),
- WORD(data + 4), WORD(data + 6));
+ pr_attr(name, "%d.%d.%d.%d", WORD(data), WORD(data + 2),
+ WORD(data + 4), WORD(data + 6));
break;
case 13:
- sprintf(buf, "%d", data[0]);
+ pr_attr(name, "%d", data[0]);
break;
case 14:
- sprintf(buf, "%d.%d.%d.%d", data[0], data[1], data[2], data[3]);
+ pr_attr(name, "%d.%d.%d.%d", data[0], data[1], data[2], data[3]);
break;
case 15:
- sprintf(buf, "%d.%d.%d.%d (%.2d/%.2d/%d)",
+ pr_attr(name, "%d.%d.%d.%d (%.2d/%.2d/%d)",
WORD(data), WORD(data + 2), WORD(data + 4), WORD(data + 6),
data[8], data[9], WORD(data + 10));
break;
case 16:
- sprintf(buf, "%c%c%c%c.%d%d",
+ pr_attr(name, "%c%c%c%c.%d%d",
data[0], data[1], data[2], data[3], data[4], data[5]);
break;
case 17:
- sprintf(buf, "%08X", DWORD(data));
+ pr_attr(name, "%08X", DWORD(data));
break;
case 18:
- sprintf(buf, "%d.%2d", data[0], data[1]);
+ pr_attr(name, "%d.%2d", data[0], data[1]);
break;
case 3: /* fall through */
default:
- vers = reserved;
+ pr_attr(name, "%s", reserved);
}
- pr_attr("Version Data", "%s", vers);
}
static int dmi_hp_224_status(u8 code)