]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
Use read_full_file_full() in read_smbios11_field()
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Fri, 28 Jun 2024 18:12:51 +0000 (20:12 +0200)
committerLennart Poettering <lennart@poettering.net>
Mon, 1 Jul 2024 16:52:14 +0000 (18:52 +0200)
read_virtual_file() will only read up to page size bytes of data
from /sys/firmware/dmi/entries/.../raw so let's use read_full_file_full()
instead to make sure we read all data.

This should be safe since smbios11 data can be considered immutable
during the lifetime of the system.

src/shared/smbios11.c

index 50094278103eeeeea274f498fbdfd81d85cc3825..bea4f7f1ee699495f7e6b7ca0869a45325bfa46a 100644 (file)
@@ -33,10 +33,15 @@ int read_smbios11_field(unsigned i, size_t max_size, char **ret_data, size_t *re
 
         assert_cc(offsetof(struct dmi_field_header, contents) == 5);
 
-        r = read_virtual_file(
-                        p,
+        /* We don't use read_virtual_file() because it only reads a single page of bytes from the DMI sysfs
+         * file. Since the SMBIOS data is immutable after boot, it's safe to use read_full_file_full() here. */
+        r = read_full_file_full(
+                        AT_FDCWD, p,
+                        /* offset = */ UINT64_MAX,
                         max_size >= SIZE_MAX - offsetof(struct dmi_field_header, contents) ? SIZE_MAX :
                         sizeof(dmi_field_header) + max_size,
+                        /* flags = */ 0,
+                        /* bind_name = */ NULL,
                         (char**) &data, &size);
         if (r < 0)
                 return r;