Skip to content

Commit fbaab92

Browse files
HuO50lian-bo
authored andcommitted
Fix for printing an empty dictionary
Currently, python-dmidecode will print an empty dictionary as below: # python3 Python 3.9.13 (main, Jul 25 2022, 00:00:00) [GCC 11.3.1 20220421 (Red Hat 11.3.1-2)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import dmidecode >>> dmidecode.bios() {} >>> This patch will solve the above issue. Signed-off-by: Zhongze Hu <[email protected]>
1 parent c97d1ca commit fbaab92

File tree

4 files changed

+15
-13
lines changed

4 files changed

+15
-13
lines changed

src/dmidecode.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@
9292

9393
#include "dmihelper.h"
9494

95-
#define SUPPORTED_SMBIOS_VER 0x0207
95+
#define SUPPORTED_SMBIOS_VER 0x030300
9696

9797
/*******************************************************************************
9898
** Type-independant Stuff
@@ -5197,7 +5197,7 @@ dmi_codes_major *find_dmiMajor(const struct dmi_header *h)
51975197
return NULL;
51985198
}
51995199

5200-
static void dmi_table(Log_t *logp, int type, u32 base, u16 len, u16 num, u16 ver, const char *devmem, u32 flags, xmlNode *xmlnode)
5200+
static void dmi_table(Log_t *logp, int type, u32 base, u32 len, u16 num, u32 ver, const char *devmem, u32 flags, xmlNode *xmlnode)
52015201
{
52025202
static u8 version_added = 0;
52035203
u8 *buf;
@@ -5241,7 +5241,7 @@ static void dmi_table(Log_t *logp, int type, u32 base, u16 len, u16 num, u16 ver
52415241
}
52425242

52435243
if (ver > SUPPORTED_SMBIOS_VER){
5244-
log_append(logp, LOGFL_NODUPS, LOG_WARNING, "# SMBIOS implementations newer than version %u.%u are not\n", "# fully supported by this version of dmidecode.\n", SUPPORTED_SMBIOS_VER >> 8, SUPPORTED_SMBIOS_VER & 0xFF);
5244+
log_append(logp, LOGFL_NODUPS, LOG_WARNING, "# SMBIOS implementations newer than version %u.%u.%u are not\n fully supported by this version of dmidecode.\n", SUPPORTED_SMBIOS_VER >> 16, (SUPPORTED_SMBIOS_VER >> 8) & 0xFF, SUPPORTED_SMBIOS_VER & 0xFF);
52455245
}
52465246

52475247
if( version_added == 0 ) {
@@ -5250,7 +5250,7 @@ static void dmi_table(Log_t *logp, int type, u32 base, u16 len, u16 num, u16 ver
52505250
}
52515251

52525252
data = buf;
5253-
while(i < num && data + 4 <= buf + len) { /* 4 is the length of an SMBIOS structure header */
5253+
while((i < num||!num) && data + 4 <= buf + len) { /* 4 is the length of an SMBIOS structure header */
52545254
u8 *next;
52555255
struct dmi_header h;
52565256

@@ -5364,8 +5364,7 @@ xmlNode *smbios3_decode_get_version(u8 * buf, const char *devmem)
53645364
dmixml_AddAttribute(data_n, "type", "SMBIOS");
53655365

53665366
if(check == 1) {
5367-
u16 ver = (buf[0x07] << 16) + (buf[0x08] << 8) + buf[0x09];
5368-
5367+
u32 ver = (buf[0x07] << 16) + (buf[0x08] << 8) + buf[0x09];
53695368
dmixml_AddTextContent(data_n, "SMBIOS %i.%i.%i present", buf[0x07], buf[0x08], buf[0x09]);
53705369
dmixml_AddAttribute(data_n, "version", "%i.%i.%i", buf[0x07], buf[0x08],buf[0x09]);
53715370
} else if(check == 0) {
@@ -5396,7 +5395,6 @@ int smbios3_decode(Log_t *logp, int type, u8 *buf, const char *devmem, u32 flags
53965395
{
53975396
return 0;
53985397
}
5399-
54005398
dmi_table(logp, type, ((off_t)offset.h << 32) | offset.l, DWORD(buf+0x0C), 0, ver, devmem, flags | FLAG_STOP_AT_EOT, xmlnode);
54015399
}
54025400

src/dmidump.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,11 @@ static int smbios3_decode(u8 *buf, const char *devmem, u32 flags, const char *du
9696
offset = QWORD(buf + 0x10);
9797
ver = (buf[0x07] << 16) + (buf[0x08] << 8) + buf[0x09];
9898

99-
dmi_table(((off_t)offset.h << 32) | offset.l,DWORD(buf + 0x0C), 0, ver, devmem, flags | FLAG_STOP_AT_EOT, dumpfile);
100-
101-
if (!checksum(buf, buf[0x05]))
99+
if (!checksum(buf, buf[0x06]))
102100
return 0;
103101

102+
dmi_table(((off_t)offset.h << 32) | offset.l,DWORD(buf + 0x0C), 0, ver, devmem, flags | FLAG_STOP_AT_EOT, dumpfile);
103+
104104
u8 crafted[32];
105105
memcpy(crafted, buf, 32);
106106
overwrite_smbios3_address(crafted);

src/efi.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ int address_from_efi(Log_t *logp, size_t * address)
4949
FILE *efi_systab;
5050
const char *filename = NULL;
5151
char linebuf[64];
52+
const char *eptype;
5253
int ret;
5354

5455
*address = 0; /* Prevent compiler warning */
@@ -67,8 +68,10 @@ int address_from_efi(Log_t *logp, size_t * address)
6768
char *addrp = strchr(linebuf, '=');
6869

6970
*(addrp++) = '\0';
70-
if(strcmp(linebuf, "SMBIOS") == 0) {
71+
if(strcmp(linebuf, "SMBIOS3") == 0
72+
|| strcmp(linebuf, "SMBIOS") == 0) {
7173
*address = strtoul(addrp, NULL, 0);
74+
eptype = linebuf;
7275
ret = 0;
7376
break;
7477
}

src/util.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,13 +239,14 @@ void *mem_chunk(Log_t *logp, size_t base, size_t len, const char *devmem)
239239
* but to workaround problems many people encountered when trying
240240
* to read from /dev/mem using regular read() calls.
241241
*/
242-
mmp = mmap(0, mmoffset + len, PROT_READ, MAP_SHARED, fd, base - mmoffset);
242+
mmp = mmap(NULL, mmoffset + len, PROT_READ, MAP_SHARED, fd, base - mmoffset);
243243
if(sigill_error || (mmp == MAP_FAILED)) {
244244
log_append(logp, LOGFL_NORMAL, LOG_WARNING, "%s (mmap): %s", devmem, strerror(errno));
245245
goto try_read;
246246
}
247247

248-
memcpy(p, (u8 *) mmp + mmoffset, len);
248+
safe_memcpy(p, (u8 *) mmp + mmoffset, len);
249+
249250
if (sigill_error) {
250251
log_append(logp, LOGFL_NODUPS, LOG_WARNING,
251252
"Failed to do memcpy() due to SIGILL signal");

0 commit comments

Comments
 (0)