diff mbox series

[v2] PM / devfreq: Fix kernel oops on governor module load

Message ID 20190621213949.27018-1-ezequiel@collabora.com (mailing list archive)
State Not Applicable, archived
Headers show
Series [v2] PM / devfreq: Fix kernel oops on governor module load | expand

Commit Message

Ezequiel Garcia June 21, 2019, 9:39 p.m. UTC
A bit unexpectedly (but still documented), request_module may
return a positive value, in case of a modprobe error.
This is currently causing issues in the devfreq framework.

When a request_module exits with a positive value, we currently
return that via ERR_PTR. However, because the value is positive,
it's not a ERR_VALUE proper, and is therefore treated as a
valid struct devfreq_governor pointer, leading to a kernel oops.

Fix this by returning -EINVAL if request_module returns a positive
value.

Fixes: b53b0128052ff ("PM / devfreq: Fix static checker warning in try_then_request_governor")
Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
---
Changes from v1:
* Rework the fix as suggested by Enric and Chanwoo,
  handling the return vaue.
---
 drivers/devfreq/devfreq.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Chanwoo Choi June 22, 2019, 10:46 a.m. UTC | #1
Hi,

2019년 6월 22일 (토) 오전 6:42, Ezequiel Garcia <ezequiel@collabora.com>님이 작성:
>
> A bit unexpectedly (but still documented), request_module may
> return a positive value, in case of a modprobe error.
> This is currently causing issues in the devfreq framework.
>
> When a request_module exits with a positive value, we currently
> return that via ERR_PTR. However, because the value is positive,
> it's not a ERR_VALUE proper, and is therefore treated as a
> valid struct devfreq_governor pointer, leading to a kernel oops.
>
> Fix this by returning -EINVAL if request_module returns a positive
> value.
>
> Fixes: b53b0128052ff ("PM / devfreq: Fix static checker warning in try_then_request_governor")
> Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
> ---
> Changes from v1:
> * Rework the fix as suggested by Enric and Chanwoo,
>   handling the return vaue.
> ---
>  drivers/devfreq/devfreq.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c
> index 6b6991f0e873..258f70c1e48f 100644
> --- a/drivers/devfreq/devfreq.c
> +++ b/drivers/devfreq/devfreq.c
> @@ -257,7 +257,7 @@ static struct devfreq_governor *try_then_request_governor(const char *name)
>                 /* Restore previous state before return */
>                 mutex_lock(&devfreq_list_lock);
>                 if (err)
> -                       return ERR_PTR(err);
> +                       return (err < 0) ? ERR_PTR(err) : ERR_PTR(-EINVAL);
>
>                 governor = find_devfreq_governor(name);
>         }

Thanks you for fix-up.
Reviewed-by: Chanwoo Choi <cw00.choi@samsung.com>

But, you are missing the stable mailing list. In order to apply this
fix-up patch,\
you have to send it to stable mailing list. Please send it.
MyungJoo Ham June 24, 2019, 7:37 a.m. UTC | #2
> A bit unexpectedly (but still documented), request_module may
> return a positive value, in case of a modprobe error.
> This is currently causing issues in the devfreq framework.
> 
> When a request_module exits with a positive value, we currently
> return that via ERR_PTR. However, because the value is positive,
> it's not a ERR_VALUE proper, and is therefore treated as a
> valid struct devfreq_governor pointer, leading to a kernel oops.
> 
> Fix this by returning -EINVAL if request_module returns a positive
> value.
> 
> Fixes: b53b0128052ff ("PM / devfreq: Fix static checker warning in try_then_request_governor")
> Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
> ---
> Changes from v1:
> * Rework the fix as suggested by Enric and Chanwoo,
>   handling the return vaue.
> ---
>  drivers/devfreq/devfreq.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)

Acked-by: MyungJoo Ham <myungjoo.ham@samsung.com>
Ezequiel Garcia July 10, 2019, 6:30 p.m. UTC | #3
Hello Chanwoo,

On Sat, 2019-06-22 at 19:46 +0900, Chanwoo Choi wrote:
> Hi,
> 
> 2019년 6월 22일 (토) 오전 6:42, Ezequiel Garcia <ezequiel@collabora.com>님이 작성:
> > A bit unexpectedly (but still documented), request_module may
> > return a positive value, in case of a modprobe error.
> > This is currently causing issues in the devfreq framework.
> > 
> > When a request_module exits with a positive value, we currently
> > return that via ERR_PTR. However, because the value is positive,
> > it's not a ERR_VALUE proper, and is therefore treated as a
> > valid struct devfreq_governor pointer, leading to a kernel oops.
> > 
> > Fix this by returning -EINVAL if request_module returns a positive
> > value.
> > 
> > Fixes: b53b0128052ff ("PM / devfreq: Fix static checker warning in try_then_request_governor")
> > Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
> > ---
> > Changes from v1:
> > * Rework the fix as suggested by Enric and Chanwoo,
> >   handling the return vaue.
> > ---
> >  drivers/devfreq/devfreq.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c
> > index 6b6991f0e873..258f70c1e48f 100644
> > --- a/drivers/devfreq/devfreq.c
> > +++ b/drivers/devfreq/devfreq.c
> > @@ -257,7 +257,7 @@ static struct devfreq_governor *try_then_request_governor(const char *name)
> >                 /* Restore previous state before return */
> >                 mutex_lock(&devfreq_list_lock);
> >                 if (err)
> > -                       return ERR_PTR(err);
> > +                       return (err < 0) ? ERR_PTR(err) : ERR_PTR(-EINVAL);
> > 
> >                 governor = find_devfreq_governor(name);
> >         }
> 
> Thanks you for fix-up.
> Reviewed-by: Chanwoo Choi <cw00.choi@samsung.com>
> 
> But, you are missing the stable mailing list. In order to apply this
> fix-up patch,\
> you have to send it to stable mailing list. Please send it.
> 
> 

If I understand correctly, you or any of the devfreq maintainer
can simply add a Cc: stable@vger.kernel.org tag.

This is documented as Option 1 in stable-kernel-rules.rst.

The Acked-by and Reviewed-by tags need to be collected anyway :-)

Thanks!
Eze
Chanwoo Choi July 11, 2019, 2:49 a.m. UTC | #4
Hi,

On 19. 7. 11. 오전 3:30, Ezequiel Garcia wrote:
> Hello Chanwoo,
> 
> On Sat, 2019-06-22 at 19:46 +0900, Chanwoo Choi wrote:
>> Hi,
>>
>> 2019년 6월 22일 (토) 오전 6:42, Ezequiel Garcia <ezequiel@collabora.com>님이 작성:
>>> A bit unexpectedly (but still documented), request_module may
>>> return a positive value, in case of a modprobe error.
>>> This is currently causing issues in the devfreq framework.
>>>
>>> When a request_module exits with a positive value, we currently
>>> return that via ERR_PTR. However, because the value is positive,
>>> it's not a ERR_VALUE proper, and is therefore treated as a
>>> valid struct devfreq_governor pointer, leading to a kernel oops.
>>>
>>> Fix this by returning -EINVAL if request_module returns a positive
>>> value.
>>>
>>> Fixes: b53b0128052ff ("PM / devfreq: Fix static checker warning in try_then_request_governor")
>>> Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
>>> ---
>>> Changes from v1:
>>> * Rework the fix as suggested by Enric and Chanwoo,
>>>   handling the return vaue.
>>> ---
>>>  drivers/devfreq/devfreq.c | 2 +-
>>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c
>>> index 6b6991f0e873..258f70c1e48f 100644
>>> --- a/drivers/devfreq/devfreq.c
>>> +++ b/drivers/devfreq/devfreq.c
>>> @@ -257,7 +257,7 @@ static struct devfreq_governor *try_then_request_governor(const char *name)
>>>                 /* Restore previous state before return */
>>>                 mutex_lock(&devfreq_list_lock);
>>>                 if (err)
>>> -                       return ERR_PTR(err);
>>> +                       return (err < 0) ? ERR_PTR(err) : ERR_PTR(-EINVAL);
>>>
>>>                 governor = find_devfreq_governor(name);
>>>         }
>>
>> Thanks you for fix-up.
>> Reviewed-by: Chanwoo Choi <cw00.choi@samsung.com>
>>
>> But, you are missing the stable mailing list. In order to apply this
>> fix-up patch,\
>> you have to send it to stable mailing list. Please send it.
>>
>>
> 
> If I understand correctly, you or any of the devfreq maintainer
> can simply add a Cc: stable@vger.kernel.org tag.

Originally, the author have to send the stable mailing list
with the required style. You can do it.

> 
> This is documented as Option 1 in stable-kernel-rules.rst.
> 
> The Acked-by and Reviewed-by tags need to be collected anyway :-)

This patch[1] was picked to devfreq.git.
[1] https://git.kernel.org/pub/scm/linux/kernel/git/mzx/devfreq.git/commit/?h=for-next&id=4f065f69ebc2bdf1fbe224816a3c471babd370dd

> 
> Thanks!
> Eze
> 
> 
>
diff mbox series

Patch

diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c
index 6b6991f0e873..258f70c1e48f 100644
--- a/drivers/devfreq/devfreq.c
+++ b/drivers/devfreq/devfreq.c
@@ -257,7 +257,7 @@  static struct devfreq_governor *try_then_request_governor(const char *name)
 		/* Restore previous state before return */
 		mutex_lock(&devfreq_list_lock);
 		if (err)
-			return ERR_PTR(err);
+			return (err < 0) ? ERR_PTR(err) : ERR_PTR(-EINVAL);
 
 		governor = find_devfreq_governor(name);
 	}