diff options
author | David Sommerseth <davids@redhat.com> | 2009-06-11 10:50:31 +0200 |
---|---|---|
committer | David Sommerseth <davids@redhat.com> | 2009-06-11 10:50:31 +0200 |
commit | 9864a51dafd953c497210b6f11e49bb299080dc8 (patch) | |
tree | 06b7515718f13eb1c30c8d3e5db9c3b042265b94 /src/dmidecode.c | |
parent | b3f5e9f97e283f2f23f36251b971458f805c6893 (diff) | |
download | python-dmidecode-9864a51dafd953c497210b6f11e49bb299080dc8.tar.gz python-dmidecode-9864a51dafd953c497210b6f11e49bb299080dc8.tar.xz python-dmidecode-9864a51dafd953c497210b6f11e49bb299080dc8.zip |
Fixed crashes and unexpected behaviour on unknown DMI/SMBIOS types
Also provide more useful information, both on unsupported types and
types not found on the hardware
Diffstat (limited to 'src/dmidecode.c')
-rw-r--r-- | src/dmidecode.c | 65 |
1 files changed, 47 insertions, 18 deletions
diff --git a/src/dmidecode.c b/src/dmidecode.c index f819adf..63b8040 100644 --- a/src/dmidecode.c +++ b/src/dmidecode.c @@ -3688,15 +3688,13 @@ void dmi_additional_info(xmlNode *node, const struct dmi_header *h) ** Main */ -xmlNode *dmi_decode(xmlNode *prnt_n, struct dmi_header * h, u16 ver) +xmlNode *dmi_decode(xmlNode *prnt_n, dmi_codes_major *dmiMajor, struct dmi_header * h, u16 ver) { const u8 *data = h->data; xmlNode *sect_n = NULL, *sub_n = NULL, *sub2_n = NULL; //. 0xF1 --> 0xF100 //int minor = h->type<<8; - dmi_codes_major *dmiMajor = (dmi_codes_major *) &dmiCodesMajor[h->type]; - sect_n = xmlNewChild(prnt_n, NULL, (xmlChar *) dmiMajor->tagname, NULL); assert( sect_n != NULL ); @@ -4942,20 +4940,33 @@ int dump(const char *dumpfile) if(ret == 0) { free(buf); - - //. TODO: Exception - if(!found) + if(!found) { ret = -1; + } } return ret == 0 ? found : ret; } + +dmi_codes_major *find_dmiMajor(const struct dmi_header *h) +{ + int i = 0; + + for( i = 0; dmiCodesMajor[i].id != NULL; i++ ) { + if( h->type == dmiCodesMajor[i].code ) { + return (dmi_codes_major *)&dmiCodesMajor[i]; + } + } + return NULL; +} + static void dmi_table(int type, u32 base, u16 len, u16 num, u16 ver, const char *devmem, xmlNode *xmlnode) { u8 *buf; u8 *data; int i = 0; + int decoding_done = 0; if( type == -1 ) { xmlNode *info_n = NULL; @@ -5021,29 +5032,47 @@ static void dmi_table(int type, u32 base, u16 len, u16 num, u16 ver, const char xmlNode *handle_n = NULL; if( h.type == type ) { if(next - buf <= len) { + dmi_codes_major *dmiMajor = NULL; /* TODO: ... * if(opt->flags & FLAG_DUMP) { * PyDict_SetItem(hDict, PyString_FromString("lookup"), dmi_dump(&h)); - * } else { - * //. TODO: //. Is the value of `i' important?... - * //. TODO: PyDict_SetItem(hDict, PyInt_FromLong(i), dmi_decode(&h, ver)); - * //. TODO: ...removed and replaced with `data'... - * PyDict_SetItem(hDict, PyString_FromString("data"), dmi_decode(&h, ver)); - * PyDict_SetItem(pydata, PyString_FromString(hid), hDict); * } */ - handle_n = dmi_decode(xmlnode, &h, ver); - } else - fprintf(stderr, "<TRUNCATED>"); - } - if( handle_n != NULL ) { + + dmiMajor = find_dmiMajor(&h); + if( dmiMajor != NULL ) { + handle_n = dmi_decode(xmlnode, dmiMajor, &h, ver); + } else { + handle_n = xmlNewChild(xmlnode, NULL, (xmlChar *) "DMImessage", NULL); + assert( handle_n != NULL ); + dmixml_AddTextContent(handle_n, "DMI/SMBIOS type 0x%02X is not supported " + "by dmidecode", h.type); + dmixml_AddAttribute(handle_n, "type", "%i", h.type); + dmixml_AddAttribute(handle_n, "unsupported", "1"); + } + } else { + handle_n = xmlNewChild(xmlnode, NULL, (xmlChar *) "DMIerror", NULL); + assert( handle_n != NULL ); + dmixml_AddTextContent(handle_n, "Data is truncated"); + dmixml_AddAttribute(handle_n, "type", "%i", h.type); + dmixml_AddAttribute(handle_n, "truncated", "1"); + } dmixml_AddAttribute(handle_n, "handle", "0x%04x", h.handle); dmixml_AddAttribute(handle_n, "size", "%d", h.length); + decoding_done = 1; } - data = next; i++; } + if( decoding_done == 0 ) { + xmlNode *handle_n = xmlNewChild(xmlnode, NULL, (xmlChar *) "DMImessage", NULL); + assert( handle_n != NULL ); + dmixml_AddTextContent(handle_n, "DMI/SMBIOS type 0x%02X is not found on this hardware", + type); + dmixml_AddAttribute(handle_n, "type", "%i", type); + dmixml_AddAttribute(handle_n, "notfound", "1"); + } + if(i != num) fprintf(stderr, "Wrong DMI structures count: %d announced, only %d decoded.\n", num, i); |