dmidecode-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] dmioem: Avoid intermediate buffer (HPE type 216)


From: Jean Delvare
Subject: [PATCH] dmioem: Avoid intermediate buffer (HPE type 216)
Date: Fri, 3 Feb 2023 13:03:38 +0100

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>
---
 dmioem.c |   54 ++++++++++++++++++++++++++----------------------------
 1 file changed, 26 insertions(+), 28 deletions(-)

--- dmidecode.orig/dmioem.c
+++ dmidecode/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)


-- 
Jean Delvare
SUSE L3 Support



reply via email to

[Prev in Thread] Current Thread [Next in Thread]