* [PATCH v1 0/2] net: rfkill: Fix 2 bugs within rfkill_set_hw_state_reason() @ 2024-06-07 14:40 Zijun Hu 2024-06-07 14:40 ` [PATCH v1 1/2] net: rfkill: Fix a wrongly handling error case Zijun Hu 2024-06-07 14:40 ` [PATCH v1 2/2] net: rfkill: Fix a logic error within rfkill_set_hw_state_reason() Zijun Hu 0 siblings, 2 replies; 12+ messages in thread From: Zijun Hu @ 2024-06-07 14:40 UTC (permalink / raw) To: johannes, davem, edumazet, kuba, pabeni, emmanuel.grumbach Cc: linux-wireless, netdev This patch series are to fix 2 bugs for kernel API within kernel API rfkill_set_hw_state_reason(). Zijun Hu (2): net: rfkill: Fix a wrongly handling error case net: rfkill: Fix a logic error within rfkill_set_hw_state_reason() net/rfkill/core.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) -- 2.7.4 ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v1 1/2] net: rfkill: Fix a wrongly handling error case 2024-06-07 14:40 [PATCH v1 0/2] net: rfkill: Fix 2 bugs within rfkill_set_hw_state_reason() Zijun Hu @ 2024-06-07 14:40 ` Zijun Hu 2024-06-12 8:15 ` Johannes Berg 2024-06-07 14:40 ` [PATCH v1 2/2] net: rfkill: Fix a logic error within rfkill_set_hw_state_reason() Zijun Hu 1 sibling, 1 reply; 12+ messages in thread From: Zijun Hu @ 2024-06-07 14:40 UTC (permalink / raw) To: johannes, davem, edumazet, kuba, pabeni, emmanuel.grumbach Cc: linux-wireless, netdev, Zijun Hu Kernel API rfkill_set_hw_state_reason() does not return current combined block state when its parameter @reason is invalid, that is wrong according to its comments. Fixed by returning API required value, also use pr_err() instead of WARN() for this error case handling. Fixes: 14486c82612a ("rfkill: add a reason to the HW rfkill state") Signed-off-by: Zijun Hu <quic_zijuhu@quicinc.com> --- net/rfkill/core.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/net/rfkill/core.c b/net/rfkill/core.c index c3feb4f49d09..0dc982b4fce6 100644 --- a/net/rfkill/core.c +++ b/net/rfkill/core.c @@ -543,13 +543,15 @@ bool rfkill_set_hw_state_reason(struct rfkill *rfkill, { unsigned long flags; bool ret, prev; + const unsigned long reason_mask = RFKILL_HARD_BLOCK_SIGNAL | + RFKILL_HARD_BLOCK_NOT_OWNER; BUG_ON(!rfkill); - if (WARN(reason & - ~(RFKILL_HARD_BLOCK_SIGNAL | RFKILL_HARD_BLOCK_NOT_OWNER), - "hw_state reason not supported: 0x%lx", reason)) - return blocked; + if (reason & ~reason_mask) { + pr_err("hw_state reason not supported: 0x%lx\n", reason); + return rfkill_blocked(rfkill); + } spin_lock_irqsave(&rfkill->lock, flags); prev = !!(rfkill->hard_block_reasons & reason); -- 2.7.4 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v1 1/2] net: rfkill: Fix a wrongly handling error case 2024-06-07 14:40 ` [PATCH v1 1/2] net: rfkill: Fix a wrongly handling error case Zijun Hu @ 2024-06-12 8:15 ` Johannes Berg 2024-06-12 10:12 ` quic_zijuhu 0 siblings, 1 reply; 12+ messages in thread From: Johannes Berg @ 2024-06-12 8:15 UTC (permalink / raw) To: Zijun Hu, davem, edumazet, kuba, pabeni, emmanuel.grumbach Cc: linux-wireless, netdev > > use pr_err() instead of WARN() > for this error case handling. I don't see anything wrong with the WARN here, it's the user/driver calling it completely incorrectly. I also don't really think this is a *fix*, if you used the API incorrectly you can't necessarily expect a correct return value, I guess, but anyway it shouldn't happen in the first place. I'm happy to take the return value change (only) as a cleanup, if you wish to resend that. > Fixed by Please also read https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches johannes ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v1 1/2] net: rfkill: Fix a wrongly handling error case 2024-06-12 8:15 ` Johannes Berg @ 2024-06-12 10:12 ` quic_zijuhu 2024-06-12 10:14 ` Johannes Berg 0 siblings, 1 reply; 12+ messages in thread From: quic_zijuhu @ 2024-06-12 10:12 UTC (permalink / raw) To: Johannes Berg, davem, edumazet, kuba, pabeni, emmanuel.grumbach Cc: linux-wireless, netdev On 6/12/2024 4:15 PM, Johannes Berg wrote: >> >> use pr_err() instead of WARN() >> for this error case handling. > > I don't see anything wrong with the WARN here, it's the user/driver > calling it completely incorrectly. > the function is a kernel API and it is handing invalid user input. below comments for WARN() seems say that pr_err() is better than WARN() for this case. include/asm-generic/bug.h: /* * WARN(), WARN_ON(), WARN_ON_ONCE(), and so on can be used to report * significant kernel issues that need prompt attention if they should ever * appear at runtime. * * Do not use these macros when checking for invalid external inputs * (e.g. invalid system call arguments, or invalid data coming from * network/devices), and on transient conditions like ENOMEM or EAGAIN. * These macros should be used for recoverable kernel issues only. * For invalid external inputs, transient conditions, etc use * pr_err[_once/_ratelimited]() followed by dump_stack(), if necessary. * Do not include "BUG"/"WARNING" in format strings manually to make these * conditions distinguishable from kernel issues. * * Use the versions with printk format strings to provide better diagnostics. */ > I also don't really think this is a *fix*, if you used the API > incorrectly you can't necessarily expect a correct return value, I > guess, but anyway it shouldn't happen in the first place. > okay, will remove term fix and fix tag. the API returns type bool for block state, the type bool can't cover case for invalid user input. > I'm happy to take the return value change (only) as a cleanup, if you > wish to resend that. > i am pleasure to resend it after code review done. >> Fixed by > > Please also read > https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches > okay, thank you > johannes ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v1 1/2] net: rfkill: Fix a wrongly handling error case 2024-06-12 10:12 ` quic_zijuhu @ 2024-06-12 10:14 ` Johannes Berg 0 siblings, 0 replies; 12+ messages in thread From: Johannes Berg @ 2024-06-12 10:14 UTC (permalink / raw) To: quic_zijuhu, davem, edumazet, kuba, pabeni, emmanuel.grumbach Cc: linux-wireless, netdev On Wed, 2024-06-12 at 18:12 +0800, quic_zijuhu wrote: > On 6/12/2024 4:15 PM, Johannes Berg wrote: > > > > > > use pr_err() instead of WARN() > > > for this error case handling. > > > > I don't see anything wrong with the WARN here, it's the user/driver > > calling it completely incorrectly. > > > the function is a kernel API Sure. > and it is handing invalid user input. No. johannes ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v1 2/2] net: rfkill: Fix a logic error within rfkill_set_hw_state_reason() 2024-06-07 14:40 [PATCH v1 0/2] net: rfkill: Fix 2 bugs within rfkill_set_hw_state_reason() Zijun Hu 2024-06-07 14:40 ` [PATCH v1 1/2] net: rfkill: Fix a wrongly handling error case Zijun Hu @ 2024-06-07 14:40 ` Zijun Hu 2024-06-12 8:18 ` Johannes Berg 2024-06-12 10:18 ` Johannes Berg 1 sibling, 2 replies; 12+ messages in thread From: Zijun Hu @ 2024-06-07 14:40 UTC (permalink / raw) To: johannes, davem, edumazet, kuba, pabeni, emmanuel.grumbach Cc: linux-wireless, netdev, Zijun Hu Kernel API rfkill_set_hw_state_reason() wrongly gets previous block state by using its parameter @reason as reason mask. Fixed by using @reason_mask as reason mask. Fixes: 14486c82612a ("rfkill: add a reason to the HW rfkill state") Signed-off-by: Zijun Hu <quic_zijuhu@quicinc.com> --- net/rfkill/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/rfkill/core.c b/net/rfkill/core.c index 0dc982b4fce6..ee7a751b6c5a 100644 --- a/net/rfkill/core.c +++ b/net/rfkill/core.c @@ -554,7 +554,7 @@ bool rfkill_set_hw_state_reason(struct rfkill *rfkill, } spin_lock_irqsave(&rfkill->lock, flags); - prev = !!(rfkill->hard_block_reasons & reason); + prev = !!(rfkill->hard_block_reasons & reason_mask); if (blocked) { rfkill->state |= RFKILL_BLOCK_HW; rfkill->hard_block_reasons |= reason; -- 2.7.4 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v1 2/2] net: rfkill: Fix a logic error within rfkill_set_hw_state_reason() 2024-06-07 14:40 ` [PATCH v1 2/2] net: rfkill: Fix a logic error within rfkill_set_hw_state_reason() Zijun Hu @ 2024-06-12 8:18 ` Johannes Berg 2024-06-12 9:43 ` quic_zijuhu 2024-06-12 10:18 ` Johannes Berg 1 sibling, 1 reply; 12+ messages in thread From: Johannes Berg @ 2024-06-12 8:18 UTC (permalink / raw) To: Zijun Hu, davem, edumazet, kuba, pabeni, emmanuel.grumbach Cc: linux-wireless, netdev On Fri, 2024-06-07 at 22:40 +0800, Zijun Hu wrote: > Kernel API rfkill_set_hw_state_reason() wrongly gets previous block state > by using its parameter @reason as reason mask. Using reason as a mask is perfectly valid. And checking that the bit changed also seems valid. We might want to not schedule the worker if it's not needed, but that's a different issue, I don't see a real bug here? johannes ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v1 2/2] net: rfkill: Fix a logic error within rfkill_set_hw_state_reason() 2024-06-12 8:18 ` Johannes Berg @ 2024-06-12 9:43 ` quic_zijuhu 2024-06-12 10:10 ` Johannes Berg 2024-06-12 10:11 ` Johannes Berg 0 siblings, 2 replies; 12+ messages in thread From: quic_zijuhu @ 2024-06-12 9:43 UTC (permalink / raw) To: Johannes Berg, davem, edumazet, kuba, pabeni, emmanuel.grumbach Cc: linux-wireless, netdev On 6/12/2024 4:18 PM, Johannes Berg wrote: > On Fri, 2024-06-07 at 22:40 +0800, Zijun Hu wrote: >> Kernel API rfkill_set_hw_state_reason() wrongly gets previous block state >> by using its parameter @reason as reason mask. > > Using reason as a mask is perfectly valid. > > And checking that the bit changed also seems valid. > i don't think so as explained below. let us assume @rfkill->hard_block_reasons has value RFKILL_HARD_BLOCK_SIGNAL which means block state before __rfkill_set_sw_state(..., true, RFKILL_HARD_BLOCK_NOT_OWNER) is invoked. @prev should mean previous block state, @prev will have false based on current logic, it is wrong since rfkill have block state before the call. > We might want to not schedule the worker if it's not needed, but that's > a different issue, I don't see a real bug here? > the worker will be unneccessarily scheduled for above example based on current logic even if the rfkill always stay in block state. > johannes > ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v1 2/2] net: rfkill: Fix a logic error within rfkill_set_hw_state_reason() 2024-06-12 9:43 ` quic_zijuhu @ 2024-06-12 10:10 ` Johannes Berg 2024-06-12 10:11 ` Johannes Berg 1 sibling, 0 replies; 12+ messages in thread From: Johannes Berg @ 2024-06-12 10:10 UTC (permalink / raw) To: quic_zijuhu, davem, edumazet, kuba, pabeni, emmanuel.grumbach Cc: linux-wireless, netdev On Wed, 2024-06-12 at 17:43 +0800, quic_zijuhu wrote: > On 6/12/2024 4:18 PM, Johannes Berg wrote: > > On Fri, 2024-06-07 at 22:40 +0800, Zijun Hu wrote: > > > Kernel API rfkill_set_hw_state_reason() wrongly gets previous block state > > > by using its parameter @reason as reason mask. > > > > Using reason as a mask is perfectly valid. > > > > And checking that the bit changed also seems valid. > > > i don't think so as explained below. > let us assume @rfkill->hard_block_reasons has value > RFKILL_HARD_BLOCK_SIGNAL which means block state before > __rfkill_set_sw_state(..., true, RFKILL_HARD_BLOCK_NOT_OWNER) is invoked. > > @prev should mean previous block state, > no. johannes ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v1 2/2] net: rfkill: Fix a logic error within rfkill_set_hw_state_reason() 2024-06-12 9:43 ` quic_zijuhu 2024-06-12 10:10 ` Johannes Berg @ 2024-06-12 10:11 ` Johannes Berg 1 sibling, 0 replies; 12+ messages in thread From: Johannes Berg @ 2024-06-12 10:11 UTC (permalink / raw) To: quic_zijuhu, davem, edumazet, kuba, pabeni, emmanuel.grumbach Cc: linux-wireless, netdev On Wed, 2024-06-12 at 17:43 +0800, quic_zijuhu wrote: > On 6/12/2024 4:18 PM, Johannes Berg wrote: > > On Fri, 2024-06-07 at 22:40 +0800, Zijun Hu wrote: > > > Kernel API rfkill_set_hw_state_reason() wrongly gets previous block state > > > by using its parameter @reason as reason mask. > > > > Using reason as a mask is perfectly valid. > > > > And checking that the bit changed also seems valid. > > > i don't think so as explained below. > let us assume @rfkill->hard_block_reasons has value > RFKILL_HARD_BLOCK_SIGNAL which means block state before > __rfkill_set_sw_state(..., true, RFKILL_HARD_BLOCK_NOT_OWNER) is invoked. > > @prev should mean previous block state, @prev will have false based on > current logic, it is wrong since rfkill have block state before the call. > > > We might want to not schedule the worker if it's not needed, but that's > > a different issue, I don't see a real bug here? > > > the worker will be unneccessarily scheduled for above example based on > current logic even if the rfkill always stay in block state. > > But yes, this is right. It's just not a bug. johannes ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v1 2/2] net: rfkill: Fix a logic error within rfkill_set_hw_state_reason() 2024-06-07 14:40 ` [PATCH v1 2/2] net: rfkill: Fix a logic error within rfkill_set_hw_state_reason() Zijun Hu 2024-06-12 8:18 ` Johannes Berg @ 2024-06-12 10:18 ` Johannes Berg 2024-06-12 10:35 ` quic_zijuhu 1 sibling, 1 reply; 12+ messages in thread From: Johannes Berg @ 2024-06-12 10:18 UTC (permalink / raw) To: Zijun Hu, davem, edumazet, kuba, pabeni, emmanuel.grumbach Cc: linux-wireless, netdev On Fri, 2024-06-07 at 22:40 +0800, Zijun Hu wrote: > Kernel API rfkill_set_hw_state_reason() wrongly gets previous block state > by using its parameter @reason as reason mask. > > Fixed by using @reason_mask as reason mask. > Actually, this *introduces* a bug. I'll leave it to you to figure out what that is, I'm not convinced that you're actually doing *anything* useful here. johannes ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v1 2/2] net: rfkill: Fix a logic error within rfkill_set_hw_state_reason() 2024-06-12 10:18 ` Johannes Berg @ 2024-06-12 10:35 ` quic_zijuhu 0 siblings, 0 replies; 12+ messages in thread From: quic_zijuhu @ 2024-06-12 10:35 UTC (permalink / raw) To: Johannes Berg, davem, edumazet, kuba, pabeni, emmanuel.grumbach Cc: linux-wireless, netdev On 6/12/2024 6:18 PM, Johannes Berg wrote: > On Fri, 2024-06-07 at 22:40 +0800, Zijun Hu wrote: >> Kernel API rfkill_set_hw_state_reason() wrongly gets previous block state >> by using its parameter @reason as reason mask. >> >> Fixed by using @reason_mask as reason mask. >> > > Actually, this *introduces* a bug. I'll leave it to you to figure out > what that is, I'm not convinced that you're actually doing *anything* > useful here. > i feels that current logic is weird and it is very difficult to understand when i read rfkill code. i think it deserves a comments for current logic if it is right. current logic was introduced by below code applet of the commit Commit: 14486c82612a ("rfkill: add a reason to the HW rfkill state") - prev = !!(rfkill->state & RFKILL_BLOCK_HW); - if (blocked) + prev = !!(rfkill->hard_block_reasons & reason); + if (blocked) { rfkill->state |= RFKILL_BLOCK_HW; i maybe need to find history to try to understand current logic if it is right. > johannes ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2024-06-12 10:36 UTC | newest] Thread overview: 12+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-06-07 14:40 [PATCH v1 0/2] net: rfkill: Fix 2 bugs within rfkill_set_hw_state_reason() Zijun Hu 2024-06-07 14:40 ` [PATCH v1 1/2] net: rfkill: Fix a wrongly handling error case Zijun Hu 2024-06-12 8:15 ` Johannes Berg 2024-06-12 10:12 ` quic_zijuhu 2024-06-12 10:14 ` Johannes Berg 2024-06-07 14:40 ` [PATCH v1 2/2] net: rfkill: Fix a logic error within rfkill_set_hw_state_reason() Zijun Hu 2024-06-12 8:18 ` Johannes Berg 2024-06-12 9:43 ` quic_zijuhu 2024-06-12 10:10 ` Johannes Berg 2024-06-12 10:11 ` Johannes Berg 2024-06-12 10:18 ` Johannes Berg 2024-06-12 10:35 ` quic_zijuhu
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox