diff mbox series

[v2] clk: Skip clk provider registration when np is NULL

Message ID 20210426065618.588144-1-tudor.ambarus@microchip.com
State Accepted
Commit bb4031b8af804244a7e4349d38f6624f68664bd6
Headers show
Series [v2] clk: Skip clk provider registration when np is NULL | expand

Commit Message

Tudor Ambarus April 26, 2021, 6:56 a.m. UTC
commit 6579c8d97ad7 ("clk: Mark fwnodes when their clock provider is added")
revealed that clk/bcm/clk-raspberrypi.c driver calls
devm_of_clk_add_hw_provider(), with a NULL dev->of_node, which resulted in a
NULL pointer dereference in of_clk_add_hw_provider() when calling
fwnode_dev_initialized().

Returning 0 is reducing the if conditions in driver code and is being
consistent with the CONFIG_OF=n inline stub that returns 0 when CONFIG_OF
is disabled. The downside is that drivers will maybe register clkdev lookups
when they don't need to and waste some memory.

Reported-by: Marek Szyprowski <m.szyprowski@samsung.com>
Fixes: 6579c8d97ad7 ("clk: Mark fwnodes when their clock provider is added")
Fixes: 3c9ea42802a1 ("clk: Mark fwnodes when their clock provider is added/removed")
Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com>
Reviewed-by: Stephen Boyd <sboyd@kernel.org>
---
v2:
- s/return 0;/return; in void of_clk_del_provider()
- add second fixes tag and Stephen's R-b tag
The opinions on whether to return an error or zero were split. Returning 0
and skipping the logic was considered safer as we don't know for sure if
other drivers are affected. See:
https://lore.kernel.org/lkml/d24bebc5-0f78-021f-293f-e58defa32531@samsung.com/
https://lore.kernel.org/lkml/20210423171335.262316-1-tudor.ambarus@microchip.com/

 drivers/clk/clk.c | 9 +++++++++
 1 file changed, 9 insertions(+)

Comments

Guenter Roeck May 10, 2021, 7:36 p.m. UTC | #1
On Mon, Apr 26, 2021 at 09:56:18AM +0300, Tudor Ambarus wrote:
> commit 6579c8d97ad7 ("clk: Mark fwnodes when their clock provider is added")

> revealed that clk/bcm/clk-raspberrypi.c driver calls

> devm_of_clk_add_hw_provider(), with a NULL dev->of_node, which resulted in a

> NULL pointer dereference in of_clk_add_hw_provider() when calling

> fwnode_dev_initialized().

> 

> Returning 0 is reducing the if conditions in driver code and is being

> consistent with the CONFIG_OF=n inline stub that returns 0 when CONFIG_OF

> is disabled. The downside is that drivers will maybe register clkdev lookups

> when they don't need to and waste some memory.

> 

> Reported-by: Marek Szyprowski <m.szyprowski@samsung.com>

> Fixes: 6579c8d97ad7 ("clk: Mark fwnodes when their clock provider is added")

> Fixes: 3c9ea42802a1 ("clk: Mark fwnodes when their clock provider is added/removed")

> Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com>

> Reviewed-by: Stephen Boyd <sboyd@kernel.org>


Tested-by: Guenter Roeck <linux@roeck-us.net>


> ---

> v2:

> - s/return 0;/return; in void of_clk_del_provider()

> - add second fixes tag and Stephen's R-b tag

> The opinions on whether to return an error or zero were split. Returning 0

> and skipping the logic was considered safer as we don't know for sure if

> other drivers are affected. See:

> https://lore.kernel.org/lkml/d24bebc5-0f78-021f-293f-e58defa32531@samsung.com/

> https://lore.kernel.org/lkml/20210423171335.262316-1-tudor.ambarus@microchip.com/

> 

>  drivers/clk/clk.c | 9 +++++++++

>  1 file changed, 9 insertions(+)

> 

> diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c

> index a3b30f7de2ef..b47460b40d14 100644

> --- a/drivers/clk/clk.c

> +++ b/drivers/clk/clk.c

> @@ -4552,6 +4552,9 @@ int of_clk_add_provider(struct device_node *np,

>  	struct of_clk_provider *cp;

>  	int ret;

>  

> +	if (!np)

> +		return 0;

> +

>  	cp = kzalloc(sizeof(*cp), GFP_KERNEL);

>  	if (!cp)

>  		return -ENOMEM;

> @@ -4591,6 +4594,9 @@ int of_clk_add_hw_provider(struct device_node *np,

>  	struct of_clk_provider *cp;

>  	int ret;

>  

> +	if (!np)

> +		return 0;

> +

>  	cp = kzalloc(sizeof(*cp), GFP_KERNEL);

>  	if (!cp)

>  		return -ENOMEM;

> @@ -4688,6 +4694,9 @@ void of_clk_del_provider(struct device_node *np)

>  {

>  	struct of_clk_provider *cp;

>  

> +	if (!np)

> +		return;

> +

>  	mutex_lock(&of_clk_mutex);

>  	list_for_each_entry(cp, &of_clk_providers, link) {

>  		if (cp->node == np) {

> -- 

> 2.25.1

>
Nathan Chancellor May 10, 2021, 8:20 p.m. UTC | #2
On Mon, Apr 26, 2021 at 09:56:18AM +0300, Tudor Ambarus wrote:
> commit 6579c8d97ad7 ("clk: Mark fwnodes when their clock provider is added")

> revealed that clk/bcm/clk-raspberrypi.c driver calls

> devm_of_clk_add_hw_provider(), with a NULL dev->of_node, which resulted in a

> NULL pointer dereference in of_clk_add_hw_provider() when calling

> fwnode_dev_initialized().

> 

> Returning 0 is reducing the if conditions in driver code and is being

> consistent with the CONFIG_OF=n inline stub that returns 0 when CONFIG_OF

> is disabled. The downside is that drivers will maybe register clkdev lookups

> when they don't need to and waste some memory.

> 

> Reported-by: Marek Szyprowski <m.szyprowski@samsung.com>

> Fixes: 6579c8d97ad7 ("clk: Mark fwnodes when their clock provider is added")

> Fixes: 3c9ea42802a1 ("clk: Mark fwnodes when their clock provider is added/removed")

> Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com>

> Reviewed-by: Stephen Boyd <sboyd@kernel.org>


Tested-by: Nathan Chancellor <nathan@kernel.org>


> ---

> v2:

> - s/return 0;/return; in void of_clk_del_provider()

> - add second fixes tag and Stephen's R-b tag

> The opinions on whether to return an error or zero were split. Returning 0

> and skipping the logic was considered safer as we don't know for sure if

> other drivers are affected. See:

> https://lore.kernel.org/lkml/d24bebc5-0f78-021f-293f-e58defa32531@samsung.com/

> https://lore.kernel.org/lkml/20210423171335.262316-1-tudor.ambarus@microchip.com/

> 

>  drivers/clk/clk.c | 9 +++++++++

>  1 file changed, 9 insertions(+)

> 

> diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c

> index a3b30f7de2ef..b47460b40d14 100644

> --- a/drivers/clk/clk.c

> +++ b/drivers/clk/clk.c

> @@ -4552,6 +4552,9 @@ int of_clk_add_provider(struct device_node *np,

>  	struct of_clk_provider *cp;

>  	int ret;

>  

> +	if (!np)

> +		return 0;

> +

>  	cp = kzalloc(sizeof(*cp), GFP_KERNEL);

>  	if (!cp)

>  		return -ENOMEM;

> @@ -4591,6 +4594,9 @@ int of_clk_add_hw_provider(struct device_node *np,

>  	struct of_clk_provider *cp;

>  	int ret;

>  

> +	if (!np)

> +		return 0;

> +

>  	cp = kzalloc(sizeof(*cp), GFP_KERNEL);

>  	if (!cp)

>  		return -ENOMEM;

> @@ -4688,6 +4694,9 @@ void of_clk_del_provider(struct device_node *np)

>  {

>  	struct of_clk_provider *cp;

>  

> +	if (!np)

> +		return;

> +

>  	mutex_lock(&of_clk_mutex);

>  	list_for_each_entry(cp, &of_clk_providers, link) {

>  		if (cp->node == np) {

> -- 

> 2.25.1

>
Greg Kroah-Hartman May 11, 2021, 7:11 a.m. UTC | #3
On Mon, May 10, 2021 at 12:36:45PM -0700, Guenter Roeck wrote:
> On Mon, Apr 26, 2021 at 09:56:18AM +0300, Tudor Ambarus wrote:

> > commit 6579c8d97ad7 ("clk: Mark fwnodes when their clock provider is added")

> > revealed that clk/bcm/clk-raspberrypi.c driver calls

> > devm_of_clk_add_hw_provider(), with a NULL dev->of_node, which resulted in a

> > NULL pointer dereference in of_clk_add_hw_provider() when calling

> > fwnode_dev_initialized().

> > 

> > Returning 0 is reducing the if conditions in driver code and is being

> > consistent with the CONFIG_OF=n inline stub that returns 0 when CONFIG_OF

> > is disabled. The downside is that drivers will maybe register clkdev lookups

> > when they don't need to and waste some memory.

> > 

> > Reported-by: Marek Szyprowski <m.szyprowski@samsung.com>

> > Fixes: 6579c8d97ad7 ("clk: Mark fwnodes when their clock provider is added")

> > Fixes: 3c9ea42802a1 ("clk: Mark fwnodes when their clock provider is added/removed")

> > Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com>

> > Reviewed-by: Stephen Boyd <sboyd@kernel.org>

> 

> Tested-by: Guenter Roeck <linux@roeck-us.net>


Now applied to my tree, thanks and sorry for the delay, I thought this
was going through the clk tree.

greg k-h
diff mbox series

Patch

diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index a3b30f7de2ef..b47460b40d14 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -4552,6 +4552,9 @@  int of_clk_add_provider(struct device_node *np,
 	struct of_clk_provider *cp;
 	int ret;
 
+	if (!np)
+		return 0;
+
 	cp = kzalloc(sizeof(*cp), GFP_KERNEL);
 	if (!cp)
 		return -ENOMEM;
@@ -4591,6 +4594,9 @@  int of_clk_add_hw_provider(struct device_node *np,
 	struct of_clk_provider *cp;
 	int ret;
 
+	if (!np)
+		return 0;
+
 	cp = kzalloc(sizeof(*cp), GFP_KERNEL);
 	if (!cp)
 		return -ENOMEM;
@@ -4688,6 +4694,9 @@  void of_clk_del_provider(struct device_node *np)
 {
 	struct of_clk_provider *cp;
 
+	if (!np)
+		return;
+
 	mutex_lock(&of_clk_mutex);
 	list_for_each_entry(cp, &of_clk_providers, link) {
 		if (cp->node == np) {