Do not require the IANA PEN registry file

Previously, ipmitool would fail to run if the local copy of the IANA PEN
registry could not be parsed.

When the registry is not available the manufacturer will be "Unknown" but
ipmitool will otherwise function so should not be considered fatal.

Also, fix an issue with improperly handling the `oem_info_list_load`
return value. Previously, in `ipmi_oem_info_init`, if `oem_info_list_load`
returned a negative value due to the registry file not existing, an
improper count would cause `oem_info_init_from_list` to aallocate a list
that didn't encompass the full header/tail list.

  IANA PEN registry open failed: No such file or directory
    Allocating      3 entries
    [     1] 16777214 | A Debug Assisting Company, Ltd.
    [     0]  1048575 | Unspecified

Now, use a signed int and ensure a valid count of loaded OEMs is used.

Signed-off-by: Vincent Fazio <vfazio@gmail.com>
This commit is contained in:
Vincent Fazio 2023-01-07 21:02:48 -06:00 committed by Alexander Amelkin
parent 9dfdf14270
commit 26b088193a
3 changed files with 7 additions and 19 deletions

View File

@ -55,7 +55,7 @@ extern const struct valstr ipmi_integrity_algorithms[];
extern const struct valstr ipmi_encryption_algorithms[]; extern const struct valstr ipmi_encryption_algorithms[];
extern const struct valstr ipmi_user_enable_status_vals[]; extern const struct valstr ipmi_user_enable_status_vals[];
extern const struct valstr *ipmi_oem_info; extern const struct valstr *ipmi_oem_info;
int ipmi_oem_info_init(); void ipmi_oem_info_init();
void ipmi_oem_info_free(); void ipmi_oem_info_free();
extern const struct valstr picmg_frucontrol_vals[]; extern const struct valstr picmg_frucontrol_vals[];

View File

@ -853,10 +853,7 @@ ipmi_main(int argc, char ** argv,
} }
/* load the IANA PEN registry */ /* load the IANA PEN registry */
if (ipmi_oem_info_init()) { ipmi_oem_info_init();
lprintf(LOG_ERR, "Failed to initialize the OEM info dictionary");
goto out_free;
}
/* run OEM setup if found */ /* run OEM setup if found */
if (oemtype && if (oemtype &&

View File

@ -1719,39 +1719,30 @@ out:
return rc; return rc;
} }
int ipmi_oem_info_init() void ipmi_oem_info_init()
{ {
oem_valstr_list_t terminator = { { -1, NULL}, NULL }; /* Terminator */ oem_valstr_list_t terminator = { { -1, NULL}, NULL }; /* Terminator */
oem_valstr_list_t *oemlist = &terminator; oem_valstr_list_t *oemlist = &terminator;
bool free_strings = true; bool free_strings = true;
size_t count; int count;
int rc = -4;
lprintf(LOG_INFO, "Loading IANA PEN Registry..."); lprintf(LOG_INFO, "Loading IANA PEN Registry...");
if (ipmi_oem_info) { if (ipmi_oem_info) {
lprintf(LOG_INFO, "IANA PEN Registry is already loaded"); lprintf(LOG_INFO, "IANA PEN Registry is already loaded");
rc = 0;
goto out; goto out;
} }
if (!(count = oem_info_list_load(&oemlist))) { if ((count = oem_info_list_load(&oemlist)) < 1) {
/* lprintf(LOG_WARN, "Failed to load entries from IANA PEN Registry");
* We can't identify OEMs without a loaded registry. count = 0;
* Set the pointer to dummy and return.
*/
ipmi_oem_info = ipmi_oem_info_dummy;
goto out;
} }
/* In the array was allocated, don't free the strings at cleanup */ /* In the array was allocated, don't free the strings at cleanup */
free_strings = !oem_info_init_from_list(oemlist, count); free_strings = !oem_info_init_from_list(oemlist, count);
rc = IPMI_CC_OK;
out: out:
oem_info_list_free(&oemlist, free_strings); oem_info_list_free(&oemlist, free_strings);
return rc;
} }
void ipmi_oem_info_free() void ipmi_oem_info_free()