11
29
Fork
You've already forked ipmitool
33

printing SDR name from raw data will occur segfault if raw is NULL #84

Open
opened 2026年05月12日 11:53:57 +02:00 by answer_9030 · 0 comments

The call stack of the coredump file is shown in the following figure:

Core was generated by `ipmitool -v sdr list'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 ipmi_sdr_print_name_from_rawentry (intf=intf@entry=0xaaaea823c988 <ipmi_open_intf>, id=<optimized out>, type=<optimized out>, raw=0x0) at ipmi_sdr.c:2529
2529	ipmi_sdr.c: 没有那个文件或目录.
(gdb) bt
#0 ipmi_sdr_print_name_from_rawentry (intf=intf@entry=0xaaaea823c988 <ipmi_open_intf>, id=<optimized out>, type=<optimized out>, raw=0x0) at ipmi_sdr.c:2529
#1 0x0000aaaea81903b8 in sdrr_get_records (queue=<synthetic pointer>, itr=0xaaaedb5e5ac0, intf=0xaaaea823c988 <ipmi_open_intf>) at ipmi_sdradd.c:266
#2 sdr_copy_to_sdrr (intf=intf@entry=0xaaaea823c988 <ipmi_open_intf>, use_builtin=use_builtin@entry=1, from_addr=from_addr@entry=32, 
 to_addr=to_addr@entry=32) at ipmi_sdradd.c:297
#3 0x0000aaaea81904f8 in ipmi_sdr_add_from_sensors (intf=intf@entry=0xaaaea823c988 <ipmi_open_intf>, maxslot=maxslot@entry=0) at ipmi_sdradd.c:329
#4 0x0000aaaea8153558 in ipmi_sdr_start (intf=intf@entry=0xaaaea823c988 <ipmi_open_intf>, use_builtin=use_builtin@entry=0) at ipmi_sdr.c:2952
#5 0x0000aaaea8153c4c in ipmi_sdr_print_sdr (intf=intf@entry=0xaaaea823c988 <ipmi_open_intf>, type=<optimized out>) at ipmi_sdr.c:2704
#6 0x0000aaaea8155df4 in ipmi_sdr_main (intf=0xaaaea823c988 <ipmi_open_intf>, argc=<optimized out>, argv=0xffffe9587550) at ipmi_sdr.c:4694
#7 0x0000aaaea8185ebc in ipmi_main (argc=4, argv=<optimized out>, cmdlist=0x0, intflist=0x0) at ipmi_main.c:1010
#8 0x0000aaaea814ba68 in main (argc=<optimized out>, argv=<optimized out>) at ipmitool.c:134

The code is shown in the following figure:

 2505 int
 2506 ipmi_sdr_print_name_from_rawentry(struct ipmi_intf *intf, uint16_t id,
 2507 uint8_t type, uint8_t *raw)
 2508 {
 2509 union {
 2510 struct sdr_record_full_sensor *full;
 2511 struct sdr_record_compact_sensor *compact;
 2512 struct sdr_record_eventonly_sensor *eventonly;
 2513 struct sdr_record_generic_locator *genloc;
 2514 struct sdr_record_fru_locator *fruloc;
 2515 struct sdr_record_mc_locator *mcloc;
 2516 struct sdr_record_entity_assoc *entassoc;
 2517 struct sdr_record_oem *oem;
 2518 } record;
 2519 
 2520 int rc =0;
 2521 char desc[17];
 2522 const char *id_string;
 2523 uint8_t id_code;
 2524 memset(desc, ' ', sizeof (desc));
 2525 
 2526 switch ( type) {
 2527 case SDR_RECORD_TYPE_FULL_SENSOR:
 2528 record.full = (struct sdr_record_full_sensor *) raw;
 2529 id_code = record.full->id_code;
 2530 id_string = record.full->id_string;
 2531 break;
 2532 
 2533 case SDR_RECORD_TYPE_COMPACT_SENSOR:
 2534 record.compact = (struct sdr_record_compact_sensor *) raw ;
 2535 id_code = record.compact->id_code;
 2536 id_string = record.compact->id_string;
 2537 break;
 2538 
 2539 case SDR_RECORD_TYPE_EVENTONLY_SENSOR:
 2540 record.eventonly = (struct sdr_record_eventonly_sensor *) raw ;
 2541 id_code = record.eventonly->id_code;
 2542 id_string = record.eventonly->id_string;
 2543 break;
 2544 
 2545 case SDR_RECORD_TYPE_MC_DEVICE_LOCATOR:
 2546 record.mcloc = (struct sdr_record_mc_locator *) raw ;
 2547 id_code = record.mcloc->id_code;
 2548 id_string = record.mcloc->id_string;
 2549 break;
 2550 
 2551 default:
 2552 rc = -1;
 2553 }
 2554 if (!rc) {
 2555 snprintf(desc, sizeof(desc), "%.*s", (id_code & 0x1f) + 1, id_string);
 2556 }
 2557 
 2558 lprintf(LOG_INFO, "ID: 0x%04x , NAME: %-16s", id, desc);
 2559 return rc;
 2560 }
The call stack of the coredump file is shown in the following figure: ``` Core was generated by `ipmitool -v sdr list'. Program terminated with signal SIGSEGV, Segmentation fault. #0 ipmi_sdr_print_name_from_rawentry (intf=intf@entry=0xaaaea823c988 <ipmi_open_intf>, id=<optimized out>, type=<optimized out>, raw=0x0) at ipmi_sdr.c:2529 2529 ipmi_sdr.c: 没有那个文件或目录. (gdb) bt #0 ipmi_sdr_print_name_from_rawentry (intf=intf@entry=0xaaaea823c988 <ipmi_open_intf>, id=<optimized out>, type=<optimized out>, raw=0x0) at ipmi_sdr.c:2529 #1 0x0000aaaea81903b8 in sdrr_get_records (queue=<synthetic pointer>, itr=0xaaaedb5e5ac0, intf=0xaaaea823c988 <ipmi_open_intf>) at ipmi_sdradd.c:266 #2 sdr_copy_to_sdrr (intf=intf@entry=0xaaaea823c988 <ipmi_open_intf>, use_builtin=use_builtin@entry=1, from_addr=from_addr@entry=32, to_addr=to_addr@entry=32) at ipmi_sdradd.c:297 #3 0x0000aaaea81904f8 in ipmi_sdr_add_from_sensors (intf=intf@entry=0xaaaea823c988 <ipmi_open_intf>, maxslot=maxslot@entry=0) at ipmi_sdradd.c:329 #4 0x0000aaaea8153558 in ipmi_sdr_start (intf=intf@entry=0xaaaea823c988 <ipmi_open_intf>, use_builtin=use_builtin@entry=0) at ipmi_sdr.c:2952 #5 0x0000aaaea8153c4c in ipmi_sdr_print_sdr (intf=intf@entry=0xaaaea823c988 <ipmi_open_intf>, type=<optimized out>) at ipmi_sdr.c:2704 #6 0x0000aaaea8155df4 in ipmi_sdr_main (intf=0xaaaea823c988 <ipmi_open_intf>, argc=<optimized out>, argv=0xffffe9587550) at ipmi_sdr.c:4694 #7 0x0000aaaea8185ebc in ipmi_main (argc=4, argv=<optimized out>, cmdlist=0x0, intflist=0x0) at ipmi_main.c:1010 #8 0x0000aaaea814ba68 in main (argc=<optimized out>, argv=<optimized out>) at ipmitool.c:134 ``` The code is shown in the following figure: ``` 2505 int 2506 ipmi_sdr_print_name_from_rawentry(struct ipmi_intf *intf, uint16_t id, 2507 uint8_t type, uint8_t *raw) 2508 { 2509 union { 2510 struct sdr_record_full_sensor *full; 2511 struct sdr_record_compact_sensor *compact; 2512 struct sdr_record_eventonly_sensor *eventonly; 2513 struct sdr_record_generic_locator *genloc; 2514 struct sdr_record_fru_locator *fruloc; 2515 struct sdr_record_mc_locator *mcloc; 2516 struct sdr_record_entity_assoc *entassoc; 2517 struct sdr_record_oem *oem; 2518 } record; 2519 2520 int rc =0; 2521 char desc[17]; 2522 const char *id_string; 2523 uint8_t id_code; 2524 memset(desc, ' ', sizeof (desc)); 2525 2526 switch ( type) { 2527 case SDR_RECORD_TYPE_FULL_SENSOR: 2528 record.full = (struct sdr_record_full_sensor *) raw; 2529 id_code = record.full->id_code; 2530 id_string = record.full->id_string; 2531 break; 2532 2533 case SDR_RECORD_TYPE_COMPACT_SENSOR: 2534 record.compact = (struct sdr_record_compact_sensor *) raw ; 2535 id_code = record.compact->id_code; 2536 id_string = record.compact->id_string; 2537 break; 2538 2539 case SDR_RECORD_TYPE_EVENTONLY_SENSOR: 2540 record.eventonly = (struct sdr_record_eventonly_sensor *) raw ; 2541 id_code = record.eventonly->id_code; 2542 id_string = record.eventonly->id_string; 2543 break; 2544 2545 case SDR_RECORD_TYPE_MC_DEVICE_LOCATOR: 2546 record.mcloc = (struct sdr_record_mc_locator *) raw ; 2547 id_code = record.mcloc->id_code; 2548 id_string = record.mcloc->id_string; 2549 break; 2550 2551 default: 2552 rc = -1; 2553 } 2554 if (!rc) { 2555 snprintf(desc, sizeof(desc), "%.*s", (id_code & 0x1f) + 1, id_string); 2556 } 2557 2558 lprintf(LOG_INFO, "ID: 0x%04x , NAME: %-16s", id, desc); 2559 return rc; 2560 } ```
Sign in to join this conversation.
No Branch/Tag specified
master
bugfix/43-Fix-timezone-and-DST-in-SEL
pages
bugfix/fix-ci-builds
feature/refactor-sdr-name-handling
cleanup/nm
feature/add-support-for-boot-mailbox
codefactor
bugfix/26
IPMITOOL_1_8_19
IPMITOOL_1_8_18
IPMITOOL_1_8_17
IPMITOOL_1_8_16
IPMITOOL_1_8_15
IPMITOOL_1_8_15RC1
IPMITOOL_1_8_14
IPMITOOL_1_8_14RC2
IPMITOOL_1_8_14RC1
ipmitool
IPMITOOL_1_8_13
IPMITOOL_1_8_13RC1
IPMITOOL_1_8_12
IPMITOOL_1_8_9
IPMITOOL_1_8_8
IPMITOOL_1_8_7
IPMITOOL_1_8_6
IPMITOOL_1_8_5
IPMITOOL_1_8_0
IPMITOOL_S10_U1
IPMITOOL_1_6_1
IPMITOOL_1_6_0
IPMITOOL_1_5_9
IPMITOOL_1_5_8
IPMITOOL_1_5_7
IPMITOOL_1_5_6
IPMITOOL_1_5_4
IPMITOOL_1_4_1_1
Labels
Clear labels
No items
No labels
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
IPMITool/ipmitool#84
Reference in a new issue
IPMITool/ipmitool
No description provided.
Delete branch "%!s()"

Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?