dmidecode-devel
[Top][All Lists]
Advanced

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

[dmidecode] [PATCH 2/3] dmidecode: Use read_file() to read the DMI table


From: Jean Delvare
Subject: [dmidecode] [PATCH 2/3] dmidecode: Use read_file() to read the DMI table from sysfs
Date: Sat, 17 Oct 2015 15:10:48 +0200

We shouldn't use mem_chunk() to read the DMI table from sysfs. This
will fail for SMBIOS v3 implementations which specify a maximum length
for the table rather than its exact length. The kernel will trim the
table to the actual length, so the DMI file will be shorter than the
length announced in entry point.

read_file() fits the bill in this case, as it deals with end of file
nicely.

This also helps with corrupted DMI tables, as the kernel will not
export the part of the table that it wasn't able to parse, effectively
trimming it.

This fixes bug #46176:
https://savannah.nongnu.org/bugs/?46176
Unexpected end of file error
---
 dmidecode.c |   29 +++++++++++++++++++++--------
 1 file changed, 21 insertions(+), 8 deletions(-)

--- dmidecode.orig/dmidecode.c  2015-10-17 14:52:13.987491774 +0200
+++ dmidecode/dmidecode.c       2015-10-17 15:10:14.472139547 +0200
@@ -4522,16 +4522,29 @@ static void dmi_table(off_t base, u32 le
                printf("\n");
        }
 
-       /*
-        * When we are reading the DMI table from sysfs, we want to print
-        * the address of the table (done above), but the offset of the
-        * data in the file is 0.  When reading from /dev/mem, the offset
-        * in the file is the address.
-        */
        if (flags & FLAG_NO_FILE_OFFSET)
-               base = 0;
+       {
+               /*
+                * When reading from sysfs, the file may be shorter than
+                * announced. For SMBIOS v3 this is expcted, as we only know
+                * the maximum table size, not the actual table size. For older
+                * implementations (and for SMBIOS v3 too), this would be the
+                * result of the kernel truncating the table on parse error.
+                */
+               size_t size = len;
+               buf = read_file(&size, devmem);
+               if (!(opt.flags & FLAG_QUIET) && num && size != (size_t)len)
+               {
+                       printf("Wrong DMI structures length: %u bytes "
+                               "announced, only %lu bytes available.\n",
+                               len, (unsigned long)size);
+               }
+               len = size;
+       }
+       else
+               buf = mem_chunk(base, len, devmem);
 
-       if ((buf = mem_chunk(base, len, devmem)) == NULL)
+       if (buf == NULL)
        {
                fprintf(stderr, "Table is unreachable, sorry."
 #ifndef USE_MMAP

-- 
Jean Delvare
SUSE L3 Support



reply via email to

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