Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:15.5:Update
dmidecode.28622
dmidecode-write-the-whole-dump-file-at-once.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File dmidecode-write-the-whole-dump-file-at-once.patch of Package dmidecode.28622
From: Jean Delvare <jdelvare@suse.de> Date: Mon, 20 Feb 2023 14:53:25 +0100 Subject: dmidecode: Write the whole dump file at once Git-commit: d8cfbc808f387e87091c25e7d5b8c2bb348bb206 Patch-mainline: 3.5 References: bsc#1210418 CVE-2023-30630 When option --dump-bin is used, write the whole dump file at once, instead of opening and closing the file separately for the table and then for the entry point. As the file writing function is no longer generic, it gets moved from util.c to dmidecode.c. One minor functional change resulting from the new implementation is that the entry point is written first now, so the messages printed are swapped. Signed-off-by: Jean Delvare <jdelvare@suse.de> Reviewed-by: Jerry Hoemann <jerry.hoemann@hpe.com> --- dmidecode.c | 69 ++++++++++++++++++++++++++++++++++++++++++++---------------- util.c | 40 ---------------------------------- util.h | 1 3 files changed, 51 insertions(+), 59 deletions(-) --- a/dmidecode.c +++ b/dmidecode.c @@ -5427,11 +5427,56 @@ static void dmi_table_string(const struc } } -static void dmi_table_dump(const u8 *buf, u32 len) +static int dmi_table_dump(const u8 *ep, u32 ep_len, const u8 *table, + u32 table_len) { + FILE *f; + + f = fopen(opt.dumpfile, "wb"); + if (!f) + { + fprintf(stderr, "%s: ", opt.dumpfile); + perror("fopen"); + return -1; + } + + if (!(opt.flags & FLAG_QUIET)) + pr_comment("Writing %d bytes to %s.", ep_len, opt.dumpfile); + if (fwrite(ep, ep_len, 1, f) != 1) + { + fprintf(stderr, "%s: ", opt.dumpfile); + perror("fwrite"); + goto err_close; + } + + if (fseek(f, 32, SEEK_SET) != 0) + { + fprintf(stderr, "%s: ", opt.dumpfile); + perror("fseek"); + goto err_close; + } + if (!(opt.flags & FLAG_QUIET)) - pr_comment("Writing %d bytes to %s.", len, opt.dumpfile); - write_dump(32, len, buf, opt.dumpfile, 0); + pr_comment("Writing %d bytes to %s.", table_len, opt.dumpfile); + if (fwrite(table, table_len, 1, f) != 1) + { + fprintf(stderr, "%s: ", opt.dumpfile); + perror("fwrite"); + goto err_close; + } + + if (fclose(f)) + { + fprintf(stderr, "%s: ", opt.dumpfile); + perror("fclose"); + return -1; + } + + return 0; + +err_close: + fclose(f); + return -1; } static void dmi_table_decode(u8 *buf, u32 len, u16 num, u16 ver, u32 flags) @@ -5726,11 +5771,7 @@ static int smbios3_decode(u8 *buf, const memcpy(crafted, buf, 32); overwrite_smbios3_address(crafted); - dmi_table_dump(table, len); - if (!(opt.flags & FLAG_QUIET)) - pr_comment("Writing %d bytes to %s.", crafted[0x06], - opt.dumpfile); - write_dump(0, crafted[0x06], crafted, opt.dumpfile, 1); + dmi_table_dump(crafted, crafted[0x06], table, len); } else { @@ -5807,11 +5848,7 @@ static int smbios_decode(u8 *buf, const memcpy(crafted, buf, 32); overwrite_dmi_address(crafted + 0x10); - dmi_table_dump(table, len); - if (!(opt.flags & FLAG_QUIET)) - pr_comment("Writing %d bytes to %s.", crafted[0x05], - opt.dumpfile); - write_dump(0, crafted[0x05], crafted, opt.dumpfile, 1); + dmi_table_dump(crafted, crafted[0x05], table, len); } else { @@ -5852,11 +5889,7 @@ static int legacy_decode(u8 *buf, const memcpy(crafted, buf, 16); overwrite_dmi_address(crafted); - dmi_table_dump(table, len); - if (!(opt.flags & FLAG_QUIET)) - pr_comment("Writing %d bytes to %s.", 0x0F, - opt.dumpfile); - write_dump(0, 0x0F, crafted, opt.dumpfile, 1); + dmi_table_dump(crafted, 0x0F, table, len); } else { --- a/util.c +++ b/util.c @@ -259,46 +259,6 @@ out: return p; } -int write_dump(size_t base, size_t len, const void *data, const char *dumpfile, int add) -{ - FILE *f; - - f = fopen(dumpfile, add ? "r+b" : "wb"); - if (!f) - { - fprintf(stderr, "%s: ", dumpfile); - perror("fopen"); - return -1; - } - - if (fseek(f, base, SEEK_SET) != 0) - { - fprintf(stderr, "%s: ", dumpfile); - perror("fseek"); - goto err_close; - } - - if (fwrite(data, len, 1, f) != 1) - { - fprintf(stderr, "%s: ", dumpfile); - perror("fwrite"); - goto err_close; - } - - if (fclose(f)) - { - fprintf(stderr, "%s: ", dumpfile); - perror("fclose"); - return -1; - } - - return 0; - -err_close: - fclose(f); - return -1; -} - /* Returns end - start + 1, assuming start < end */ u64 u64_range(u64 start, u64 end) { --- a/util.h +++ b/util.h @@ -27,5 +27,4 @@ int checksum(const u8 *buf, size_t len); void *read_file(off_t base, size_t *len, const char *filename); void *mem_chunk(off_t base, size_t len, const char *devmem); -int write_dump(size_t base, size_t len, const void *data, const char *dumpfile, int add); u64 u64_range(u64 start, u64 end);
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor