* [PATCH] drivers/char/ipmi_si: prevent null deref during module exit @ 2017-11-08 17:06 Andrew Banman 2017-11-08 17:11 ` Andrew Banman 0 siblings, 1 reply; 8+ messages in thread From: Andrew Banman @ 2017-11-08 17:06 UTC (permalink / raw) To: Corey Minyard Cc: Dimitri Sivanich, Anderson, Russ, Mike Travis, openipmi-developer, linux-kernel If there are uninitialized SMIs in the smi_infos list, i.e. with no handlers set, then disable_si_irq() in cleanup_smi_one() will hit a null pointer dereference when the former attempts to start the check enables transaction. Thus, we panic during module exit. Avoid panicking when there are uninitialized SMIs by checking for a handler pointer before starting the check enables transaction. Signed-off-by: Andrew Banman <abanman@hpe.com> --- drivers/char/ipmi/ipmi_si_intf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index cb5719e..6c0b1b3 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c @@ -442,7 +442,7 @@ static void start_check_enables(struct smi_info *smi_info, bool start_timer) if (start_timer) start_new_msg(smi_info, msg, 2); - else + else if (smi_info->handlers) smi_info->handlers->start_transaction(smi_info->si_sm, msg, 2); smi_info->si_state = SI_CHECKING_ENABLES; } -- 1.8.2.1 ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] drivers/char/ipmi_si: prevent null deref during module exit 2017-11-08 17:06 [PATCH] drivers/char/ipmi_si: prevent null deref during module exit Andrew Banman @ 2017-11-08 17:11 ` Andrew Banman 2017-11-08 20:00 ` Corey Minyard 0 siblings, 1 reply; 8+ messages in thread From: Andrew Banman @ 2017-11-08 17:11 UTC (permalink / raw) To: Corey Minyard Cc: Dimitri Sivanich, Anderson, Russ, Mike Travis, openipmi-developer, linux-kernel On 11/8/17 11:06 AM, Andrew Banman wrote: > If there are uninitialized SMIs in the smi_infos list, i.e. with no > handlers set, then disable_si_irq() in cleanup_smi_one() will hit a null > pointer dereference when the former attempts to start the check enables > transaction. Thus, we panic during module exit. I think this points to a broader problem of holding uninitialized smi_info structs in smi_infos list. There are many places where handlers and other struct members are assumed. Maybe a better design would be to remove SMIs from the list if we have no intention of initializing them? Andrew > > Avoid panicking when there are uninitialized SMIs by checking for a handler > pointer before starting the check enables transaction. > > Signed-off-by: Andrew Banman <abanman@hpe.com> > --- > drivers/char/ipmi/ipmi_si_intf.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c > index cb5719e..6c0b1b3 100644 > --- a/drivers/char/ipmi/ipmi_si_intf.c > +++ b/drivers/char/ipmi/ipmi_si_intf.c > @@ -442,7 +442,7 @@ static void start_check_enables(struct smi_info *smi_info, > bool start_timer) > > if (start_timer) > start_new_msg(smi_info, msg, 2); > - else > + else if (smi_info->handlers) > smi_info->handlers->start_transaction(smi_info->si_sm, msg, 2); > smi_info->si_state = SI_CHECKING_ENABLES; > } ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] drivers/char/ipmi_si: prevent null deref during module exit 2017-11-08 17:11 ` Andrew Banman @ 2017-11-08 20:00 ` Corey Minyard 2017-11-09 18:02 ` Andrew Banman 0 siblings, 1 reply; 8+ messages in thread From: Corey Minyard @ 2017-11-08 20:00 UTC (permalink / raw) To: Andrew Banman Cc: Dimitri Sivanich, Anderson, Russ, Mike Travis, openipmi-developer, linux-kernel On 11/08/2017 11:11 AM, Andrew Banman wrote: > On 11/8/17 11:06 AM, Andrew Banman wrote: >> If there are uninitialized SMIs in the smi_infos list, i.e. with no >> handlers set, then disable_si_irq() in cleanup_smi_one() will hit a null >> pointer dereference when the former attempts to start the check enables >> transaction. Thus, we panic during module exit. > > I think this points to a broader problem of holding uninitialized > smi_info > structs in smi_infos list. There are many places where handlers and > other struct > members are assumed. Maybe a better design would be to remove SMIs > from the list > if we have no intention of initializing them? > This begs the question: How did you produce this? From what I can tell, there is no way you can get to this code if you don't have a working and initialized smi_info structure, and that's not the only place this would have to be fixed if it wasn't. So it's not what you assume, I don't think it's an uninitialized smi_info structure on the list. As usual with these sorts of things, please send tracebacks and reproduction procedures. If you are removing the module and this happens, there may be a race conditions, but this is the wrong fix. More likely that the structure gets cleaned up and this function is called afterwards. -corey > Andrew > >> >> Avoid panicking when there are uninitialized SMIs by checking for a >> handler >> pointer before starting the check enables transaction. >> >> Signed-off-by: Andrew Banman <abanman@hpe.com> >> --- >> drivers/char/ipmi/ipmi_si_intf.c | 2 +- >> 1 file changed, 1 insertion(+), 1 deletion(-) >> >> diff --git a/drivers/char/ipmi/ipmi_si_intf.c >> b/drivers/char/ipmi/ipmi_si_intf.c >> index cb5719e..6c0b1b3 100644 >> --- a/drivers/char/ipmi/ipmi_si_intf.c >> +++ b/drivers/char/ipmi/ipmi_si_intf.c >> @@ -442,7 +442,7 @@ static void start_check_enables(struct smi_info >> *smi_info, bool start_timer) >> >> if (start_timer) >> start_new_msg(smi_info, msg, 2); >> - else >> + else if (smi_info->handlers) >> smi_info->handlers->start_transaction(smi_info->si_sm, msg, 2); >> smi_info->si_state = SI_CHECKING_ENABLES; >> } > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] drivers/char/ipmi_si: prevent null deref during module exit 2017-11-08 20:00 ` Corey Minyard @ 2017-11-09 18:02 ` Andrew Banman 2017-11-09 18:38 ` Corey Minyard 0 siblings, 1 reply; 8+ messages in thread From: Andrew Banman @ 2017-11-09 18:02 UTC (permalink / raw) To: minyard Cc: Dimitri Sivanich, Anderson, Russ, Mike Travis, openipmi-developer, linux-kernel On 11/8/17 2:00 PM, Corey Minyard wrote: > On 11/08/2017 11:11 AM, Andrew Banman wrote: >> On 11/8/17 11:06 AM, Andrew Banman wrote: >>> If there are uninitialized SMIs in the smi_infos list, i.e. with no >>> handlers set, then disable_si_irq() in cleanup_smi_one() will hit a null >>> pointer dereference when the former attempts to start the check enables >>> transaction. Thus, we panic during module exit. >> >> I think this points to a broader problem of holding uninitialized smi_info >> structs in smi_infos list. There are many places where handlers and other struct >> members are assumed. Maybe a better design would be to remove SMIs from the list >> if we have no intention of initializing them? >> > > This begs the question: How did you produce this? From what I can tell, > there is no way you can get to this code if you don't have a working and > initialized smi_info structure, and that's not the only place this would > have to be fixed if it wasn't. So it's not what you assume, I don't think > it's an uninitialized smi_info structure on the list. My kernel is missing 0944d889a2, wherein the dmi handling moved to a platform device. Without this commit the driver discovers both ACPI and SMBIOS records but only initializes the former; this is visible in the tracebacks below. Is there a case for pushing a similar patch to stable releases predating 0944d889a2 to prevent this crash? Thank you for your time, Andrew > > As usual with these sorts of things, please send tracebacks and reproduction > procedures. # dmesg | grep -i ipmi [ 14.883554] ipmi message handler version 39.2 [ 14.905543] ipmi device interface [ 14.931149] ipmi_si IPI0001:00: ipmi_si: probing via ACPI [ 14.937254] ipmi_si IPI0001:00: [io 0x0ce4-0x0ce6] regsize 1 spacing 1 irq 6 [ 14.946767] ipmi_si: Adding ACPI-specified bt state machine [ 14.954621] IPMI System Interface driver. [ 14.975257] ipmi_si: probing via SMBIOS [ 14.980446] ipmi_si: SMBIOS: mem 0xce4 regsize 1 spacing 1 irq 6 [ 14.987163] ipmi_si: Adding SMBIOS-specified bt state machine [ 14.996706] ipmi_si: probing via SPMI [ 15.002351] ipmi_si: SPMI: io 0xce4 regsize 1 spacing 1 irq 6 [ 15.010320] ipmi_si: Adding SPMI-specified bt state machine duplicate interface [ 15.020056] ipmi_si: Trying ACPI-specified bt state machine at i/o address 0xce4, slave address 0x0, irq 6 [ 15.066306] ipmi_si IPI0001:00: Using irq 6 [ 15.077855] IPMI BT: req2rsp=2 secs retries=1 [ 15.130045] ipmi_si IPI0001:00: Found new BMC (man_id: 0x000000, prod_id: 0x0101, dev_id: 0x20) [ 15.140472] ipmi_si IPI0001:00: IPMI bt interface initialized # rmmod ipmi_si [ 85.492578] BUG: unable to handle kernel NULL pointer dereference at 0000000000000010 [ 85.501346] IP: [<ffffffffc027840e>] start_check_enables+0x3e/0x80 [ipmi_si] [ 85.509233] PGD 7fb3875067 PUD 7fbc222067 PMD 0 [ 85.514421] Oops: 0000 [#1] SMP [ 85.518056] Modules linked in: xt_CHECKSUM iptable_mangle ipt_MASQUERADE nf_nat_masquerade_ipv4 iptable_nat nf_nat_ipv4 nf_nat nf_conntrack_ipv4 nf_defrag_ipv4 xt_conntrack nf_conntrack ipt_REJECT nf_reject_ipv4 tun bridge stp llc ebtable_filter ebtables ip6table_filter ip6_tables iptable_filter dm_mirror dm_region_hash dm_log dm_mod iTCO_wdt iTCO_vendor_support intel_powerclamp coretemp vfat intel_rapl fat iosf_mbi kvm_intel kvm irqbypass crc32_pclmul ghash_clmulni_intel aesni_intel lrw i40e gf128mul glue_helper ablk_helper cryptd ptp pcspkr pps_core joydev sg i2c_i801 shpchp lpc_ich ipmi_si(-) wmi ipmi_devintf ipmi_msghandler nfit libnvdimm acpi_cpufreq nfsd auth_rpcgss nfs_acl lockd numatools(OE) grace hwperf(OE) binfmt_misc sunrpc ip_tables sr_mod cdrom xfs libcrc32c sd_mod crc_t10dif crct10dif_generic mgag200 i2c_algo_bit drm_kms_helper syscopyarea sysfillrect crct10dif_pclmul crct10dif_common sysimgblt crc32c_intel fb_sys_fops ahci ttm libahci uas drm libata usb_storage i2c_core [ 85.616799] CPU: 241 PID: 5743 Comm: rmmod Tainted: G OE ------------ 3.10.0-693.el7.x86_64 #1 [ 85.627674] Hardware name: HPE Superdome Flex/Superdome Flex, BIOS IP147.006.000.137.000.1711022001 11/02/2017 [ 85.638843] task: ffff887fb8ac6eb0 ti: ffff887ffd30c000 task.ti: ffff887ffd30c000 [ 85.647200] RIP: 0010:[<ffffffffc027840e>] [<ffffffffc027840e>] start_check_enables+0x3e/0x80 [ipmi_si] [ 85.657794] RSP: 0018:ffff887ffd30fea8 EFLAGS: 00010246 [ 85.663723] RAX: 0000000000000000 RBX: ffff88016930b000 RCX: 0000000000000006 [ 85.671688] RDX: 0000000000000002 RSI: ffff887ffd30feae RDI: 0000000000000000 [ 85.679655] RBP: ffff887ffd30fec0 R08: ffff88016930b1a0 R09: 00000001820001fb [ 85.687623] R10: 00000000beb72001 R11: ffffea013efadc80 R12: ffffffffc02822c0 [ 85.695589] R13: 0000000000000800 R14: 0000000001f222b0 R15: 0000000001f22010 [ 85.703555] FS: 00007fb9a5c10740(0000) GS:ffff887fbea40000(0000) knlGS:0000000000000000 [ 85.712587] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 85.719002] CR2: 0000000000000010 CR3: 0000007ffd2a5000 CR4: 00000000003407e0 [ 85.726968] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 85.734936] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [ 85.742904] Stack: [ 85.745150] 2f18887ffd30fec0 000000007706aaa0 ffff88016930b000 ffff887ffd30fed8 [ 85.753456] ffffffffc027ae19 ffffffffc0281ff0 ffff887ffd30fef0 ffffffffc027b9cb [ 85.761762] fffffffffffffff5 ffff887ffd30ff78 ffffffff810fe55b 0000000000000000 [ 85.770063] Call Trace: [ 85.772797] [<ffffffffc027ae19>] cleanup_one_si+0x149/0x180 [ipmi_si] [ 85.780090] [<ffffffffc027b9cb>] cleanup_ipmi_si+0x6b/0xc0 [ipmi_si] [ 85.787293] [<ffffffff810fe55b>] SyS_delete_module+0x19b/0x300 [ 85.793913] [<ffffffff816b4fc9>] system_call_fastpath+0x16/0x1b [ 85.800621] Code: ee 18 c6 45 ef 2f 65 48 8b 04 25 28 00 00 00 48 89 45 f0 31 c0 40 84 f6 75 33 48 8b 47 18 ba 02 00 00 00 48 8b 7f 10 48 8d 75 ee <ff> 50 10 48 8b 45 f0 65 48 33 04 25 28 00 00 00 c7 43 38 05 00 [ 85.822638] RIP [<ffffffffc027840e>] start_check_enables+0x3e/0x80 [ipmi_si] [ 85.830611] RSP <ffff887ffd30fea8> [ 85.834504] CR2: 0000000000000010 And with debug printks printing out some contents of the struct at the start of module exit: # rmmod ipmi_si; dmesg -c [ 1083.527776] smi_info ffff880fbb38f600 [ 1083.527779] intf_num 0 [ 1083.527779] intf ffff880fbb800000 [ 1083.527780] *si_sm ffff880fbb144400 [ 1083.527780] *handlers ffffffffa051bac0 [ 1083.527780] si_type 2 [ 1083.527782] smi_info ffff880fbb38f200 [ 1083.527783] intf_num 0 [ 1083.527783] intf (null) [ 1083.527784] *si_sm (null) [ 1083.527785] *handlers (null) [ 1083.527786] si_type 2 @@ -3961,6 +3985,15 @@ static void cleanup_ipmi_si(void) if (!initialized) return; + list_for_each_entry_safe(e, tmp_e, &smi_infos, link) { + pr_crit("%20s %p\n", "smi_info", e); + pr_crit("%20s %d\n", "intf_num", e->intf_num); + pr_crit("%20s %p\n", "intf", e->intf); + pr_crit("%20s %p\n", "*si_sm", e->si_sm); + pr_crit("%20s %p\n", "*handlers", e->handlers); + pr_crit("%20s %d\n\n", "si_type", e->si_type); + } + #ifdef CONFIG_PCI if (pci_registered) pci_unregister_driver(&ipmi_pci_driver); > > If you are removing the module and this happens, there may be a race > conditions, but this is the wrong fix. More likely that the structure gets > cleaned up and this function is called afterwards. > > -corey > >> Andrew >> >>> >>> Avoid panicking when there are uninitialized SMIs by checking for a handler >>> pointer before starting the check enables transaction. >>> >>> Signed-off-by: Andrew Banman <abanman@hpe.com> >>> --- >>> drivers/char/ipmi/ipmi_si_intf.c | 2 +- >>> 1 file changed, 1 insertion(+), 1 deletion(-) >>> >>> diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c >>> index cb5719e..6c0b1b3 100644 >>> --- a/drivers/char/ipmi/ipmi_si_intf.c >>> +++ b/drivers/char/ipmi/ipmi_si_intf.c >>> @@ -442,7 +442,7 @@ static void start_check_enables(struct smi_info >>> *smi_info, bool start_timer) >>> >>> if (start_timer) >>> start_new_msg(smi_info, msg, 2); >>> - else >>> + else if (smi_info->handlers) >>> smi_info->handlers->start_transaction(smi_info->si_sm, msg, 2); >>> smi_info->si_state = SI_CHECKING_ENABLES; >>> } >> > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] drivers/char/ipmi_si: prevent null deref during module exit 2017-11-09 18:02 ` Andrew Banman @ 2017-11-09 18:38 ` Corey Minyard 2017-11-09 18:54 ` Corey Minyard 0 siblings, 1 reply; 8+ messages in thread From: Corey Minyard @ 2017-11-09 18:38 UTC (permalink / raw) To: Andrew Banman Cc: Dimitri Sivanich, Anderson, Russ, Mike Travis, openipmi-developer, linux-kernel On 11/09/2017 12:02 PM, Andrew Banman wrote: > On 11/8/17 2:00 PM, Corey Minyard wrote: >> On 11/08/2017 11:11 AM, Andrew Banman wrote: >>> On 11/8/17 11:06 AM, Andrew Banman wrote: >>>> If there are uninitialized SMIs in the smi_infos list, i.e. with no >>>> handlers set, then disable_si_irq() in cleanup_smi_one() will hit a null >>>> pointer dereference when the former attempts to start the check enables >>>> transaction. Thus, we panic during module exit. >>> I think this points to a broader problem of holding uninitialized smi_info >>> structs in smi_infos list. There are many places where handlers and other struct >>> members are assumed. Maybe a better design would be to remove SMIs from the list >>> if we have no intention of initializing them? >>> >> This begs the question: How did you produce this? From what I can tell, >> there is no way you can get to this code if you don't have a working and >> initialized smi_info structure, and that's not the only place this would >> have to be fixed if it wasn't. So it's not what you assume, I don't think >> it's an uninitialized smi_info structure on the list. > My kernel is missing 0944d889a2, wherein the dmi handling moved to a platform > device. Without this commit the driver discovers both ACPI and SMBIOS records > but only initializes the former; this is visible in the tracebacks below. > > Is there a case for pushing a similar patch to stable releases predating 0944d889a2 > to prevent this crash? It looks like you are using a Redhat 3.10 kernel. Is that right? -corey > Thank you for your time, > > Andrew > >> As usual with these sorts of things, please send tracebacks and reproduction >> procedures. > # dmesg | grep -i ipmi > [ 14.883554] ipmi message handler version 39.2 > [ 14.905543] ipmi device interface > [ 14.931149] ipmi_si IPI0001:00: ipmi_si: probing via ACPI > [ 14.937254] ipmi_si IPI0001:00: [io 0x0ce4-0x0ce6] regsize 1 spacing 1 irq 6 > [ 14.946767] ipmi_si: Adding ACPI-specified bt state machine > [ 14.954621] IPMI System Interface driver. > [ 14.975257] ipmi_si: probing via SMBIOS > [ 14.980446] ipmi_si: SMBIOS: mem 0xce4 regsize 1 spacing 1 irq 6 > [ 14.987163] ipmi_si: Adding SMBIOS-specified bt state machine > [ 14.996706] ipmi_si: probing via SPMI > [ 15.002351] ipmi_si: SPMI: io 0xce4 regsize 1 spacing 1 irq 6 > [ 15.010320] ipmi_si: Adding SPMI-specified bt state machine duplicate interface > [ 15.020056] ipmi_si: Trying ACPI-specified bt state machine at i/o address 0xce4, slave address 0x0, irq 6 > [ 15.066306] ipmi_si IPI0001:00: Using irq 6 > [ 15.077855] IPMI BT: req2rsp=2 secs retries=1 > [ 15.130045] ipmi_si IPI0001:00: Found new BMC (man_id: 0x000000, prod_id: 0x0101, dev_id: 0x20) > [ 15.140472] ipmi_si IPI0001:00: IPMI bt interface initialized > # rmmod ipmi_si > [ 85.492578] BUG: unable to handle kernel NULL pointer dereference at 0000000000000010 > [ 85.501346] IP: [<ffffffffc027840e>] start_check_enables+0x3e/0x80 [ipmi_si] > [ 85.509233] PGD 7fb3875067 PUD 7fbc222067 PMD 0 > [ 85.514421] Oops: 0000 [#1] SMP > [ 85.518056] Modules linked in: xt_CHECKSUM iptable_mangle ipt_MASQUERADE nf_nat_masquerade_ipv4 iptable_nat nf_nat_ipv4 nf_nat nf_conntrack_ipv4 nf_defrag_ipv4 xt_conntrack nf_conntrack ipt_REJECT nf_reject_ipv4 tun bridge stp llc ebtable_filter ebtables ip6table_filter ip6_tables iptable_filter dm_mirror dm_region_hash dm_log dm_mod iTCO_wdt iTCO_vendor_support intel_powerclamp coretemp vfat intel_rapl fat iosf_mbi kvm_intel kvm irqbypass crc32_pclmul ghash_clmulni_intel aesni_intel lrw i40e gf128mul glue_helper ablk_helper cryptd ptp pcspkr pps_core joydev sg i2c_i801 shpchp lpc_ich ipmi_si(-) wmi ipmi_devintf ipmi_msghandler nfit libnvdimm acpi_cpufreq nfsd auth_rpcgss nfs_acl lockd numatools(OE) grace hwperf(OE) binfmt_misc sunrpc ip_tables sr_mod cdrom xfs libcrc32c sd_mod crc_t10dif crct10dif_generic mgag200 i2c_algo_bit drm_kms_helper syscopyarea sysfillrect crct10dif_pclmul crct10dif_common sysimgblt crc32c_intel fb_sys_fops ahci ttm libahci uas drm libata usb_storage i2c_core > [ 85.616799] CPU: 241 PID: 5743 Comm: rmmod Tainted: G OE ------------ 3.10.0-693.el7.x86_64 #1 > [ 85.627674] Hardware name: HPE Superdome Flex/Superdome Flex, BIOS IP147.006.000.137.000.1711022001 11/02/2017 > [ 85.638843] task: ffff887fb8ac6eb0 ti: ffff887ffd30c000 task.ti: ffff887ffd30c000 > [ 85.647200] RIP: 0010:[<ffffffffc027840e>] [<ffffffffc027840e>] start_check_enables+0x3e/0x80 [ipmi_si] > [ 85.657794] RSP: 0018:ffff887ffd30fea8 EFLAGS: 00010246 > [ 85.663723] RAX: 0000000000000000 RBX: ffff88016930b000 RCX: 0000000000000006 > [ 85.671688] RDX: 0000000000000002 RSI: ffff887ffd30feae RDI: 0000000000000000 > [ 85.679655] RBP: ffff887ffd30fec0 R08: ffff88016930b1a0 R09: 00000001820001fb > [ 85.687623] R10: 00000000beb72001 R11: ffffea013efadc80 R12: ffffffffc02822c0 > [ 85.695589] R13: 0000000000000800 R14: 0000000001f222b0 R15: 0000000001f22010 > [ 85.703555] FS: 00007fb9a5c10740(0000) GS:ffff887fbea40000(0000) knlGS:0000000000000000 > [ 85.712587] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 > [ 85.719002] CR2: 0000000000000010 CR3: 0000007ffd2a5000 CR4: 00000000003407e0 > [ 85.726968] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 > [ 85.734936] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 > [ 85.742904] Stack: > [ 85.745150] 2f18887ffd30fec0 000000007706aaa0 ffff88016930b000 ffff887ffd30fed8 > [ 85.753456] ffffffffc027ae19 ffffffffc0281ff0 ffff887ffd30fef0 ffffffffc027b9cb > [ 85.761762] fffffffffffffff5 ffff887ffd30ff78 ffffffff810fe55b 0000000000000000 > [ 85.770063] Call Trace: > [ 85.772797] [<ffffffffc027ae19>] cleanup_one_si+0x149/0x180 [ipmi_si] > [ 85.780090] [<ffffffffc027b9cb>] cleanup_ipmi_si+0x6b/0xc0 [ipmi_si] > [ 85.787293] [<ffffffff810fe55b>] SyS_delete_module+0x19b/0x300 > [ 85.793913] [<ffffffff816b4fc9>] system_call_fastpath+0x16/0x1b > [ 85.800621] Code: ee 18 c6 45 ef 2f 65 48 8b 04 25 28 00 00 00 48 89 45 f0 31 c0 40 84 f6 75 33 48 8b 47 18 ba 02 00 00 00 48 8b 7f 10 48 8d 75 ee <ff> 50 10 48 8b 45 f0 65 48 33 04 25 28 00 00 00 c7 43 38 05 00 > [ 85.822638] RIP [<ffffffffc027840e>] start_check_enables+0x3e/0x80 [ipmi_si] > [ 85.830611] RSP <ffff887ffd30fea8> > [ 85.834504] CR2: 0000000000000010 > > > And with debug printks printing out some contents of the struct at the start of > module exit: > > # rmmod ipmi_si; dmesg -c > [ 1083.527776] smi_info ffff880fbb38f600 > [ 1083.527779] intf_num 0 > [ 1083.527779] intf ffff880fbb800000 > [ 1083.527780] *si_sm ffff880fbb144400 > [ 1083.527780] *handlers ffffffffa051bac0 > [ 1083.527780] si_type 2 > > [ 1083.527782] smi_info ffff880fbb38f200 > [ 1083.527783] intf_num 0 > [ 1083.527783] intf (null) > [ 1083.527784] *si_sm (null) > [ 1083.527785] *handlers (null) > [ 1083.527786] si_type 2 > > @@ -3961,6 +3985,15 @@ static void cleanup_ipmi_si(void) > if (!initialized) > return; > > + list_for_each_entry_safe(e, tmp_e, &smi_infos, link) { > + pr_crit("%20s %p\n", "smi_info", e); > + pr_crit("%20s %d\n", "intf_num", e->intf_num); > + pr_crit("%20s %p\n", "intf", e->intf); > + pr_crit("%20s %p\n", "*si_sm", e->si_sm); > + pr_crit("%20s %p\n", "*handlers", e->handlers); > + pr_crit("%20s %d\n\n", "si_type", e->si_type); > + } > + > #ifdef CONFIG_PCI > if (pci_registered) > pci_unregister_driver(&ipmi_pci_driver); >> If you are removing the module and this happens, there may be a race >> conditions, but this is the wrong fix. More likely that the structure gets >> cleaned up and this function is called afterwards. >> >> -corey >> >>> Andrew >>> >>>> Avoid panicking when there are uninitialized SMIs by checking for a handler >>>> pointer before starting the check enables transaction. >>>> >>>> Signed-off-by: Andrew Banman <abanman@hpe.com> >>>> --- >>>> drivers/char/ipmi/ipmi_si_intf.c | 2 +- >>>> 1 file changed, 1 insertion(+), 1 deletion(-) >>>> >>>> diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c >>>> index cb5719e..6c0b1b3 100644 >>>> --- a/drivers/char/ipmi/ipmi_si_intf.c >>>> +++ b/drivers/char/ipmi/ipmi_si_intf.c >>>> @@ -442,7 +442,7 @@ static void start_check_enables(struct smi_info >>>> *smi_info, bool start_timer) >>>> >>>> if (start_timer) >>>> start_new_msg(smi_info, msg, 2); >>>> - else >>>> + else if (smi_info->handlers) >>>> smi_info->handlers->start_transaction(smi_info->si_sm, msg, 2); >>>> smi_info->si_state = SI_CHECKING_ENABLES; >>>> } ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] drivers/char/ipmi_si: prevent null deref during module exit 2017-11-09 18:38 ` Corey Minyard @ 2017-11-09 18:54 ` Corey Minyard 2017-11-09 19:48 ` [PATCH] ipmi: Prefer ACPI system interfaces over SMBIOS ones minyard 0 siblings, 1 reply; 8+ messages in thread From: Corey Minyard @ 2017-11-09 18:54 UTC (permalink / raw) To: Andrew Banman Cc: Dimitri Sivanich, Anderson, Russ, Mike Travis, openipmi-developer, linux-kernel On 11/09/2017 12:38 PM, Corey Minyard wrote: > On 11/09/2017 12:02 PM, Andrew Banman wrote: >> On 11/8/17 2:00 PM, Corey Minyard wrote: >>> On 11/08/2017 11:11 AM, Andrew Banman wrote: >>>> On 11/8/17 11:06 AM, Andrew Banman wrote: >>>>> If there are uninitialized SMIs in the smi_infos list, i.e. with no >>>>> handlers set, then disable_si_irq() in cleanup_smi_one() will hit >>>>> a null >>>>> pointer dereference when the former attempts to start the check >>>>> enables >>>>> transaction. Thus, we panic during module exit. >>>> I think this points to a broader problem of holding uninitialized >>>> smi_info >>>> structs in smi_infos list. There are many places where handlers and >>>> other struct >>>> members are assumed. Maybe a better design would be to remove SMIs >>>> from the list >>>> if we have no intention of initializing them? >>>> >>> This begs the question: How did you produce this? From what I can >>> tell, >>> there is no way you can get to this code if you don't have a working >>> and >>> initialized smi_info structure, and that's not the only place this >>> would >>> have to be fixed if it wasn't. So it's not what you assume, I don't >>> think >>> it's an uninitialized smi_info structure on the list. >> My kernel is missing 0944d889a2, wherein the dmi handling moved to a >> platform >> device. Without this commit the driver discovers both ACPI and SMBIOS >> records >> but only initializes the former; this is visible in the tracebacks >> below. >> >> Is there a case for pushing a similar patch to stable releases >> predating 0944d889a2 >> to prevent this crash? > > It looks like you are using a Redhat 3.10 kernel. Is that right? Actually, never mind, I misread something. The following change should fix your issue: index b89078b..d6d9258 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c @@ -1805,8 +1805,10 @@ static struct smi_info *smi_info_alloc(void) { struct smi_info *info = kzalloc(sizeof(*info), GFP_KERNEL); - if (info) + if (info) { spin_lock_init(&info->si_lock); + info->interrupt_disabled = true; + } return info; } @@ -3603,7 +3605,6 @@ static int try_smi_init(struct smi_info *new_smi) for (i = 0; i < SI_NUM_STATS; i++) atomic_set(&new_smi->stats[i], 0); - new_smi->interrupt_disabled = true; atomic_set(&new_smi->need_watch, 0); rv = try_enable_event_buffer(new_smi); > > -corey > >> Thank you for your time, >> >> Andrew >> >>> As usual with these sorts of things, please send tracebacks and >>> reproduction >>> procedures. >> # dmesg | grep -i ipmi >> [ 14.883554] ipmi message handler version 39.2 >> [ 14.905543] ipmi device interface >> [ 14.931149] ipmi_si IPI0001:00: ipmi_si: probing via ACPI >> [ 14.937254] ipmi_si IPI0001:00: [io 0x0ce4-0x0ce6] regsize 1 >> spacing 1 irq 6 >> [ 14.946767] ipmi_si: Adding ACPI-specified bt state machine >> [ 14.954621] IPMI System Interface driver. >> [ 14.975257] ipmi_si: probing via SMBIOS >> [ 14.980446] ipmi_si: SMBIOS: mem 0xce4 regsize 1 spacing 1 irq 6 >> [ 14.987163] ipmi_si: Adding SMBIOS-specified bt state machine >> [ 14.996706] ipmi_si: probing via SPMI >> [ 15.002351] ipmi_si: SPMI: io 0xce4 regsize 1 spacing 1 irq 6 >> [ 15.010320] ipmi_si: Adding SPMI-specified bt state machine >> duplicate interface >> [ 15.020056] ipmi_si: Trying ACPI-specified bt state machine at i/o >> address 0xce4, slave address 0x0, irq 6 >> [ 15.066306] ipmi_si IPI0001:00: Using irq 6 >> [ 15.077855] IPMI BT: req2rsp=2 secs retries=1 >> [ 15.130045] ipmi_si IPI0001:00: Found new BMC (man_id: 0x000000, >> prod_id: 0x0101, dev_id: 0x20) >> [ 15.140472] ipmi_si IPI0001:00: IPMI bt interface initialized >> # rmmod ipmi_si >> [ 85.492578] BUG: unable to handle kernel NULL pointer dereference >> at 0000000000000010 >> [ 85.501346] IP: [<ffffffffc027840e>] start_check_enables+0x3e/0x80 >> [ipmi_si] >> [ 85.509233] PGD 7fb3875067 PUD 7fbc222067 PMD 0 >> [ 85.514421] Oops: 0000 [#1] SMP >> [ 85.518056] Modules linked in: xt_CHECKSUM iptable_mangle >> ipt_MASQUERADE nf_nat_masquerade_ipv4 iptable_nat nf_nat_ipv4 nf_nat >> nf_conntrack_ipv4 nf_defrag_ipv4 xt_conntrack nf_conntrack ipt_REJECT >> nf_reject_ipv4 tun bridge stp llc ebtable_filter ebtables >> ip6table_filter ip6_tables iptable_filter dm_mirror dm_region_hash >> dm_log dm_mod iTCO_wdt iTCO_vendor_support intel_powerclamp coretemp >> vfat intel_rapl fat iosf_mbi kvm_intel kvm irqbypass crc32_pclmul >> ghash_clmulni_intel aesni_intel lrw i40e gf128mul glue_helper >> ablk_helper cryptd ptp pcspkr pps_core joydev sg i2c_i801 shpchp >> lpc_ich ipmi_si(-) wmi ipmi_devintf ipmi_msghandler nfit libnvdimm >> acpi_cpufreq nfsd auth_rpcgss nfs_acl lockd numatools(OE) grace >> hwperf(OE) binfmt_misc sunrpc ip_tables sr_mod cdrom xfs libcrc32c >> sd_mod crc_t10dif crct10dif_generic mgag200 i2c_algo_bit >> drm_kms_helper syscopyarea sysfillrect crct10dif_pclmul >> crct10dif_common sysimgblt crc32c_intel fb_sys_fops ahci ttm libahci >> uas drm libata usb_storage i2c_core >> [ 85.616799] CPU: 241 PID: 5743 Comm: rmmod Tainted: G >> OE ------------ 3.10.0-693.el7.x86_64 #1 >> [ 85.627674] Hardware name: HPE Superdome Flex/Superdome Flex, BIOS >> IP147.006.000.137.000.1711022001 11/02/2017 >> [ 85.638843] task: ffff887fb8ac6eb0 ti: ffff887ffd30c000 task.ti: >> ffff887ffd30c000 >> [ 85.647200] RIP: 0010:[<ffffffffc027840e>] [<ffffffffc027840e>] >> start_check_enables+0x3e/0x80 [ipmi_si] >> [ 85.657794] RSP: 0018:ffff887ffd30fea8 EFLAGS: 00010246 >> [ 85.663723] RAX: 0000000000000000 RBX: ffff88016930b000 RCX: >> 0000000000000006 >> [ 85.671688] RDX: 0000000000000002 RSI: ffff887ffd30feae RDI: >> 0000000000000000 >> [ 85.679655] RBP: ffff887ffd30fec0 R08: ffff88016930b1a0 R09: >> 00000001820001fb >> [ 85.687623] R10: 00000000beb72001 R11: ffffea013efadc80 R12: >> ffffffffc02822c0 >> [ 85.695589] R13: 0000000000000800 R14: 0000000001f222b0 R15: >> 0000000001f22010 >> [ 85.703555] FS: 00007fb9a5c10740(0000) GS:ffff887fbea40000(0000) >> knlGS:0000000000000000 >> [ 85.712587] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 >> [ 85.719002] CR2: 0000000000000010 CR3: 0000007ffd2a5000 CR4: >> 00000000003407e0 >> [ 85.726968] DR0: 0000000000000000 DR1: 0000000000000000 DR2: >> 0000000000000000 >> [ 85.734936] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: >> 0000000000000400 >> [ 85.742904] Stack: >> [ 85.745150] 2f18887ffd30fec0 000000007706aaa0 ffff88016930b000 >> ffff887ffd30fed8 >> [ 85.753456] ffffffffc027ae19 ffffffffc0281ff0 ffff887ffd30fef0 >> ffffffffc027b9cb >> [ 85.761762] fffffffffffffff5 ffff887ffd30ff78 ffffffff810fe55b >> 0000000000000000 >> [ 85.770063] Call Trace: >> [ 85.772797] [<ffffffffc027ae19>] cleanup_one_si+0x149/0x180 >> [ipmi_si] >> [ 85.780090] [<ffffffffc027b9cb>] cleanup_ipmi_si+0x6b/0xc0 [ipmi_si] >> [ 85.787293] [<ffffffff810fe55b>] SyS_delete_module+0x19b/0x300 >> [ 85.793913] [<ffffffff816b4fc9>] system_call_fastpath+0x16/0x1b >> [ 85.800621] Code: ee 18 c6 45 ef 2f 65 48 8b 04 25 28 00 00 00 48 >> 89 45 f0 31 c0 40 84 f6 75 33 48 8b 47 18 ba 02 00 00 00 48 8b 7f 10 >> 48 8d 75 ee <ff> 50 10 48 8b 45 f0 65 48 33 04 25 28 00 00 00 c7 43 >> 38 05 00 >> [ 85.822638] RIP [<ffffffffc027840e>] >> start_check_enables+0x3e/0x80 [ipmi_si] >> [ 85.830611] RSP <ffff887ffd30fea8> >> [ 85.834504] CR2: 0000000000000010 >> >> >> And with debug printks printing out some contents of the struct at >> the start of >> module exit: >> >> # rmmod ipmi_si; dmesg -c >> [ 1083.527776] smi_info ffff880fbb38f600 >> [ 1083.527779] intf_num 0 >> [ 1083.527779] intf ffff880fbb800000 >> [ 1083.527780] *si_sm ffff880fbb144400 >> [ 1083.527780] *handlers ffffffffa051bac0 >> [ 1083.527780] si_type 2 >> >> [ 1083.527782] smi_info ffff880fbb38f200 >> [ 1083.527783] intf_num 0 >> [ 1083.527783] intf (null) >> [ 1083.527784] *si_sm (null) >> [ 1083.527785] *handlers (null) >> [ 1083.527786] si_type 2 >> >> @@ -3961,6 +3985,15 @@ static void cleanup_ipmi_si(void) >> if (!initialized) >> return; >> + list_for_each_entry_safe(e, tmp_e, &smi_infos, link) { >> + pr_crit("%20s %p\n", "smi_info", e); >> + pr_crit("%20s %d\n", "intf_num", e->intf_num); >> + pr_crit("%20s %p\n", "intf", e->intf); >> + pr_crit("%20s %p\n", "*si_sm", e->si_sm); >> + pr_crit("%20s %p\n", "*handlers", e->handlers); >> + pr_crit("%20s %d\n\n", "si_type", e->si_type); >> + } >> + >> #ifdef CONFIG_PCI >> if (pci_registered) >> pci_unregister_driver(&ipmi_pci_driver); >>> If you are removing the module and this happens, there may be a race >>> conditions, but this is the wrong fix. More likely that the >>> structure gets >>> cleaned up and this function is called afterwards. >>> >>> -corey >>> >>>> Andrew >>>> >>>>> Avoid panicking when there are uninitialized SMIs by checking for >>>>> a handler >>>>> pointer before starting the check enables transaction. >>>>> >>>>> Signed-off-by: Andrew Banman <abanman@hpe.com> >>>>> --- >>>>> drivers/char/ipmi/ipmi_si_intf.c | 2 +- >>>>> 1 file changed, 1 insertion(+), 1 deletion(-) >>>>> >>>>> diff --git a/drivers/char/ipmi/ipmi_si_intf.c >>>>> b/drivers/char/ipmi/ipmi_si_intf.c >>>>> index cb5719e..6c0b1b3 100644 >>>>> --- a/drivers/char/ipmi/ipmi_si_intf.c >>>>> +++ b/drivers/char/ipmi/ipmi_si_intf.c >>>>> @@ -442,7 +442,7 @@ static void start_check_enables(struct smi_info >>>>> *smi_info, bool start_timer) >>>>> >>>>> if (start_timer) >>>>> start_new_msg(smi_info, msg, 2); >>>>> - else >>>>> + else if (smi_info->handlers) >>>>> smi_info->handlers->start_transaction(smi_info->si_sm, msg, 2); >>>>> smi_info->si_state = SI_CHECKING_ENABLES; >>>>> } > > > ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH] ipmi: Prefer ACPI system interfaces over SMBIOS ones 2017-11-09 18:54 ` Corey Minyard @ 2017-11-09 19:48 ` minyard 2017-11-09 21:50 ` Andrew Banman 0 siblings, 1 reply; 8+ messages in thread From: minyard @ 2017-11-09 19:48 UTC (permalink / raw) To: Andrew Banman Cc: Dimitri Sivanich, Russ Anderson, Mike Travis, openipmi-developer, linux-kernel, Corey Minyard From: Corey Minyard <cminyard@mvista.com> The recent changes to add SMBIOS (DMI) IPMI interfaces as platform devices caused DMI to be selected before ACPI, causing ACPI type of operations to not work. Signed-off-by: Corey Minyard <cminyard@mvista.com> --- Andrew, I looked a bit more and found that I already had this queued for the next kernel release, it fixes your issue and another issue, too. If this works for you, I'll request this for stable. -corey drivers/char/ipmi/ipmi_si_intf.c | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index 39c55f4..f8e28ba 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c @@ -3425,7 +3425,7 @@ static inline void wait_for_timer_and_thread(struct smi_info *smi_info) del_timer_sync(&smi_info->si_timer); } -static int is_new_interface(struct smi_info *info) +static struct smi_info *find_dup_si(struct smi_info *info) { struct smi_info *e; @@ -3440,24 +3440,36 @@ static int is_new_interface(struct smi_info *info) */ if (info->slave_addr && !e->slave_addr) e->slave_addr = info->slave_addr; - return 0; + return e; } } - return 1; + return NULL; } static int add_smi(struct smi_info *new_smi) { int rv = 0; + struct smi_info *dup; mutex_lock(&smi_infos_lock); - if (!is_new_interface(new_smi)) { - pr_info(PFX "%s-specified %s state machine: duplicate\n", - ipmi_addr_src_to_str(new_smi->addr_source), - si_to_str[new_smi->si_type]); - rv = -EBUSY; - goto out_err; + dup = find_dup_si(new_smi); + if (dup) { + if (new_smi->addr_source == SI_ACPI && + dup->addr_source == SI_SMBIOS) { + /* We prefer ACPI over SMBIOS. */ + dev_info(dup->dev, + "Removing SMBIOS-specified %s state machine in favor of ACPI\n", + si_to_str[new_smi->si_type]); + cleanup_one_si(dup); + } else { + dev_info(new_smi->dev, + "%s-specified %s state machine: duplicate\n", + ipmi_addr_src_to_str(new_smi->addr_source), + si_to_str[new_smi->si_type]); + rv = -EBUSY; + goto out_err; + } } pr_info(PFX "Adding %s-specified %s state machine\n", @@ -3866,7 +3878,8 @@ static void cleanup_one_si(struct smi_info *to_clean) poll(to_clean); schedule_timeout_uninterruptible(1); } - disable_si_irq(to_clean, false); + if (to_clean->handlers) + disable_si_irq(to_clean, false); while (to_clean->curr_msg || (to_clean->si_state != SI_NORMAL)) { poll(to_clean); schedule_timeout_uninterruptible(1); -- 2.7.4 ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] ipmi: Prefer ACPI system interfaces over SMBIOS ones 2017-11-09 19:48 ` [PATCH] ipmi: Prefer ACPI system interfaces over SMBIOS ones minyard @ 2017-11-09 21:50 ` Andrew Banman 0 siblings, 0 replies; 8+ messages in thread From: Andrew Banman @ 2017-11-09 21:50 UTC (permalink / raw) To: minyard Cc: Dimitri Sivanich, Russ Anderson, Mike Travis, openipmi-developer, linux-kernel, Corey Minyard Corey, This patch worked on my system. Thank you! Tested-by: Andrew Banman <abanman@hpe.com> # insmod ipmi_si.ko; dmesg -c [ 225.793934] ipmi_si IPI0001:00: ipmi_si: probing via ACPI [ 225.799982] ipmi_si IPI0001:00: [io 0x0ce4-0x0ce6] regsize 1 spacing 1 irq 6 [ 225.807953] ipmi_si: Adding ACPI-specified bt state machine [ 225.814202] IPMI System Interface driver. [ 225.818895] ipmi_si: probing via SMBIOS [ 225.823183] ipmi_si: SMBIOS: mem 0xce4 regsize 1 spacing 1 irq 6 [ 225.829894] ipmi_si: Adding SMBIOS-specified bt state machine [ 225.836318] ipmi_si: probing via SPMI [ 225.840411] ipmi_si: SPMI: io 0xce4 regsize 1 spacing 1 irq 6 [ 225.846832] (NULL device *): SPMI-specified bt state machine: duplicate [ 225.854220] ipmi_si: Trying ACPI-specified bt state machine at i/o address 0xce4, slave address 0x0, irq 6 [ 225.870711] ipmi_si IPI0001:00: Using irq 6 [ 225.875530] ipmi_si IPI0001:00: Found new BMC (man_id: 0x000000, prod_id: 0x0101, dev_id: 0x20) [ 225.876266] IPMI BT: req2rsp=2 secs retries=1 [ 225.890166] ipmi_si IPI0001:00: IPMI bt interface initialized # rmmod ipmi_si.ko; dmesg -c # Andrew On 11/9/17 1:48 PM, minyard@acm.org wrote: > From: Corey Minyard <cminyard@mvista.com> > > The recent changes to add SMBIOS (DMI) IPMI interfaces as platform > devices caused DMI to be selected before ACPI, causing ACPI type > of operations to not work. > > Signed-off-by: Corey Minyard <cminyard@mvista.com> > --- > > Andrew, > > I looked a bit more and found that I already had this queued for the > next kernel release, it fixes your issue and another issue, too. > If this works for you, I'll request this for stable. > > -corey > > drivers/char/ipmi/ipmi_si_intf.c | 33 +++++++++++++++++++++++---------- > 1 file changed, 23 insertions(+), 10 deletions(-) > > diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c > index 39c55f4..f8e28ba 100644 > --- a/drivers/char/ipmi/ipmi_si_intf.c > +++ b/drivers/char/ipmi/ipmi_si_intf.c > @@ -3425,7 +3425,7 @@ static inline void wait_for_timer_and_thread(struct smi_info *smi_info) > del_timer_sync(&smi_info->si_timer); > } > > -static int is_new_interface(struct smi_info *info) > +static struct smi_info *find_dup_si(struct smi_info *info) > { > struct smi_info *e; > > @@ -3440,24 +3440,36 @@ static int is_new_interface(struct smi_info *info) > */ > if (info->slave_addr && !e->slave_addr) > e->slave_addr = info->slave_addr; > - return 0; > + return e; > } > } > > - return 1; > + return NULL; > } > > static int add_smi(struct smi_info *new_smi) > { > int rv = 0; > + struct smi_info *dup; > > mutex_lock(&smi_infos_lock); > - if (!is_new_interface(new_smi)) { > - pr_info(PFX "%s-specified %s state machine: duplicate\n", > - ipmi_addr_src_to_str(new_smi->addr_source), > - si_to_str[new_smi->si_type]); > - rv = -EBUSY; > - goto out_err; > + dup = find_dup_si(new_smi); > + if (dup) { > + if (new_smi->addr_source == SI_ACPI && > + dup->addr_source == SI_SMBIOS) { > + /* We prefer ACPI over SMBIOS. */ > + dev_info(dup->dev, > + "Removing SMBIOS-specified %s state machine in favor of ACPI\n", > + si_to_str[new_smi->si_type]); > + cleanup_one_si(dup); > + } else { > + dev_info(new_smi->dev, > + "%s-specified %s state machine: duplicate\n", > + ipmi_addr_src_to_str(new_smi->addr_source), > + si_to_str[new_smi->si_type]); > + rv = -EBUSY; > + goto out_err; > + } > } > > pr_info(PFX "Adding %s-specified %s state machine\n", > @@ -3866,7 +3878,8 @@ static void cleanup_one_si(struct smi_info *to_clean) > poll(to_clean); > schedule_timeout_uninterruptible(1); > } > - disable_si_irq(to_clean, false); > + if (to_clean->handlers) > + disable_si_irq(to_clean, false); > while (to_clean->curr_msg || (to_clean->si_state != SI_NORMAL)) { > poll(to_clean); > schedule_timeout_uninterruptible(1); > ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2017-11-09 21:50 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2017-11-08 17:06 [PATCH] drivers/char/ipmi_si: prevent null deref during module exit Andrew Banman 2017-11-08 17:11 ` Andrew Banman 2017-11-08 20:00 ` Corey Minyard 2017-11-09 18:02 ` Andrew Banman 2017-11-09 18:38 ` Corey Minyard 2017-11-09 18:54 ` Corey Minyard 2017-11-09 19:48 ` [PATCH] ipmi: Prefer ACPI system interfaces over SMBIOS ones minyard 2017-11-09 21:50 ` Andrew Banman
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®