经过定位发现函数的调用栈如下
main --> ipmi_main --> ipmi_cmd_run --> ipmi_fru_main --> ipmi_fru_print_all --> ipmi_fru_print
出错的原因是:
ipmi_fru_print 函数中走入了有问题分支,如下:
if (fru->dev_type != 0x10 &&
(fru->dev_type_modifier != 0x02 ||
fru->dev_type < 0x08 || fru->dev_type > 0x0f))
return -1;
fru参数是通过ipmi_fru_print_all函数中调用ipmi_sdr_get_record获取的。
代码如下:
/* Print the FRU from the SDR locator record. */
fru = (struct sdr_record_fru_locator *)
ipmi_sdr_get_record(intf, header, itr);
if (fru == NULL || !fru->logical) {
free_n(&fru);
continue;
}
rc = ipmi_fru_print(intf, fru);
free_n(&fru);
ipmi_sdr_get_record是调用BMC硬件的接口,因此需要协调硬件相关的人投入分析。