All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] ARM/PCI: bios32: Fix pcibios_init_resource() error return path
@ 2017-07-10 12:34 Lorenzo Pieralisi
  2017-07-10 12:34 ` [PATCH 2/2] MIPS/PCI: Fix pcibios_scan_bus() NULL check code path Lorenzo Pieralisi
  2017-07-10 14:57 ` [PATCH 1/2] ARM/PCI: bios32: Fix pcibios_init_resource() error return path Bjorn Helgaas
  0 siblings, 2 replies; 6+ messages in thread
From: Lorenzo Pieralisi @ 2017-07-10 12:34 UTC (permalink / raw)
  To: linux-pci
  Cc: linux-kernel, Lorenzo Pieralisi, Jason Cooper, Bjorn Helgaas,
	Russell King, Andrew Lunn

Since commit 97ad2bdcbe85 ("ARM/PCI: Convert PCI scan API to
pci_scan_root_bus_bridge()") struct pci_sys_data is allocated through
pci_alloc_host_bridge() which implies that, if pcibios_init_resource()
fails, the pci_sys_data should be freed along with struct pci_host_bridge
members through pci_free_host_bridge() instead of a simple kfree.

Fix commit 97ad2bdcbe85 ("ARM/PCI: Convert PCI scan API to
pci_scan_root_bus_bridge()") by updating pcibios_init_resource()
error path.

Fixes: 97ad2bdcbe85 ("ARM/PCI: Convert PCI scan API to pci_scan_root_bus_bridge()")
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Jason Cooper <jason@lakedaemon.net>
CC: Bjorn Helgaas <bhelgaas@google.com>
Cc: Russell King <linux@armlinux.org.uk>
Cc: Andrew Lunn <andrew@lunn.ch>
---
 arch/arm/kernel/bios32.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c
index 56dc1a3..c1809fb 100644
--- a/arch/arm/kernel/bios32.c
+++ b/arch/arm/kernel/bios32.c
@@ -480,7 +480,7 @@ static void pcibios_init_hw(struct device *parent, struct hw_pci *hw,
 
 			ret = pcibios_init_resource(nr, sys, hw->io_optional);
 			if (ret)  {
-				kfree(sys);
+				pci_free_host_bridge(bridge);
 				break;
 			}
 
-- 
2.10.0

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/2] MIPS/PCI: Fix pcibios_scan_bus() NULL check code path
  2017-07-10 12:34 [PATCH 1/2] ARM/PCI: bios32: Fix pcibios_init_resource() error return path Lorenzo Pieralisi
@ 2017-07-10 12:34 ` Lorenzo Pieralisi
  2017-07-10 14:55   ` Bjorn Helgaas
  2017-07-10 14:57 ` [PATCH 1/2] ARM/PCI: bios32: Fix pcibios_init_resource() error return path Bjorn Helgaas
  1 sibling, 1 reply; 6+ messages in thread
From: Lorenzo Pieralisi @ 2017-07-10 12:34 UTC (permalink / raw)
  To: linux-pci
  Cc: linux-kernel, Lorenzo Pieralisi, Ralf Baechle, Paul Burton,
	Bjorn Helgaas

If pci_scan_root_bus() fails (ie returns NULL) pcibios_scan_bus() must
return immediately since the struct pci_bus pointer it returns is not
valid and cannot be used.

Move code checking the pci_scan_root_bus() return value to reinstate
proper pcibios_scanbus() error path behaviour.

Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Paul Burton <paul.burton@imgtec.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
---
 arch/mips/pci/pci-legacy.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/arch/mips/pci/pci-legacy.c b/arch/mips/pci/pci-legacy.c
index 174575a..71d62f8 100644
--- a/arch/mips/pci/pci-legacy.c
+++ b/arch/mips/pci/pci-legacy.c
@@ -89,16 +89,16 @@ static void pcibios_scanbus(struct pci_controller *hose)
 	pci_add_resource(&resources, hose->busn_resource);
 	bus = pci_scan_root_bus(NULL, next_busno, hose->pci_ops, hose,
 				&resources);
-	hose->bus = bus;
-
-	need_domain_info = need_domain_info || pci_domain_nr(bus);
-	set_pci_need_domain_info(hose, need_domain_info);
-
 	if (!bus) {
 		pci_free_resource_list(&resources);
 		return;
 	}
 
+	hose->bus = bus;
+
+	need_domain_info = need_domain_info || pci_domain_nr(bus);
+	set_pci_need_domain_info(hose, need_domain_info);
+
 	next_busno = bus->busn_res.end + 1;
 	/* Don't allow 8-bit bus number overflow inside the hose -
 	   reserve some space for bridges. */
-- 
2.10.0

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/2] MIPS/PCI: Fix pcibios_scan_bus() NULL check code path
  2017-07-10 12:34 ` [PATCH 2/2] MIPS/PCI: Fix pcibios_scan_bus() NULL check code path Lorenzo Pieralisi
@ 2017-07-10 14:55   ` Bjorn Helgaas
  2017-07-10 15:49     ` Lorenzo Pieralisi
  0 siblings, 1 reply; 6+ messages in thread
From: Bjorn Helgaas @ 2017-07-10 14:55 UTC (permalink / raw)
  To: Lorenzo Pieralisi
  Cc: linux-pci, linux-kernel, Ralf Baechle, Paul Burton, Bjorn Helgaas

On Mon, Jul 10, 2017 at 01:34:09PM +0100, Lorenzo Pieralisi wrote:
> If pci_scan_root_bus() fails (ie returns NULL) pcibios_scan_bus() must
> return immediately since the struct pci_bus pointer it returns is not
> valid and cannot be used.
> 
> Move code checking the pci_scan_root_bus() return value to reinstate
> proper pcibios_scanbus() error path behaviour.
> 
> Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Cc: Ralf Baechle <ralf@linux-mips.org>
> Cc: Paul Burton <paul.burton@imgtec.com>
> Cc: Bjorn Helgaas <bhelgaas@google.com>

I agree this is certainly broken.  In fact, I think I broke it with
9e808eb6a768 ("PCI: Cleanup control flow") in 2015.  So probably v4.14
material?

> ---
>  arch/mips/pci/pci-legacy.c | 10 +++++-----
>  1 file changed, 5 insertions(+), 5 deletions(-)
> 
> diff --git a/arch/mips/pci/pci-legacy.c b/arch/mips/pci/pci-legacy.c
> index 174575a..71d62f8 100644
> --- a/arch/mips/pci/pci-legacy.c
> +++ b/arch/mips/pci/pci-legacy.c
> @@ -89,16 +89,16 @@ static void pcibios_scanbus(struct pci_controller *hose)
>  	pci_add_resource(&resources, hose->busn_resource);
>  	bus = pci_scan_root_bus(NULL, next_busno, hose->pci_ops, hose,
>  				&resources);
> -	hose->bus = bus;
> -
> -	need_domain_info = need_domain_info || pci_domain_nr(bus);
> -	set_pci_need_domain_info(hose, need_domain_info);
> -
>  	if (!bus) {
>  		pci_free_resource_list(&resources);
>  		return;
>  	}
>  
> +	hose->bus = bus;
> +
> +	need_domain_info = need_domain_info || pci_domain_nr(bus);
> +	set_pci_need_domain_info(hose, need_domain_info);
> +
>  	next_busno = bus->busn_res.end + 1;
>  	/* Don't allow 8-bit bus number overflow inside the hose -
>  	   reserve some space for bridges. */
> -- 
> 2.10.0
> 

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/2] ARM/PCI: bios32: Fix pcibios_init_resource() error return path
  2017-07-10 12:34 [PATCH 1/2] ARM/PCI: bios32: Fix pcibios_init_resource() error return path Lorenzo Pieralisi
  2017-07-10 12:34 ` [PATCH 2/2] MIPS/PCI: Fix pcibios_scan_bus() NULL check code path Lorenzo Pieralisi
@ 2017-07-10 14:57 ` Bjorn Helgaas
  1 sibling, 0 replies; 6+ messages in thread
From: Bjorn Helgaas @ 2017-07-10 14:57 UTC (permalink / raw)
  To: Lorenzo Pieralisi
  Cc: linux-pci, linux-kernel, Jason Cooper, Bjorn Helgaas,
	Russell King, Andrew Lunn

On Mon, Jul 10, 2017 at 01:34:08PM +0100, Lorenzo Pieralisi wrote:
> Since commit 97ad2bdcbe85 ("ARM/PCI: Convert PCI scan API to
> pci_scan_root_bus_bridge()") struct pci_sys_data is allocated through
> pci_alloc_host_bridge() which implies that, if pcibios_init_resource()
> fails, the pci_sys_data should be freed along with struct pci_host_bridge
> members through pci_free_host_bridge() instead of a simple kfree.
> 
> Fix commit 97ad2bdcbe85 ("ARM/PCI: Convert PCI scan API to
> pci_scan_root_bus_bridge()") by updating pcibios_init_resource()
> error path.
> 
> Fixes: 97ad2bdcbe85 ("ARM/PCI: Convert PCI scan API to pci_scan_root_bus_bridge()")
> Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Cc: Jason Cooper <jason@lakedaemon.net>
> CC: Bjorn Helgaas <bhelgaas@google.com>
> Cc: Russell King <linux@armlinux.org.uk>
> Cc: Andrew Lunn <andrew@lunn.ch>

Applied to for-linus for v4.13, thanks!

> ---
>  arch/arm/kernel/bios32.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c
> index 56dc1a3..c1809fb 100644
> --- a/arch/arm/kernel/bios32.c
> +++ b/arch/arm/kernel/bios32.c
> @@ -480,7 +480,7 @@ static void pcibios_init_hw(struct device *parent, struct hw_pci *hw,
>  
>  			ret = pcibios_init_resource(nr, sys, hw->io_optional);
>  			if (ret)  {
> -				kfree(sys);
> +				pci_free_host_bridge(bridge);
>  				break;
>  			}
>  
> -- 
> 2.10.0
> 

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/2] MIPS/PCI: Fix pcibios_scan_bus() NULL check code path
  2017-07-10 14:55   ` Bjorn Helgaas
@ 2017-07-10 15:49     ` Lorenzo Pieralisi
  2017-07-10 16:38       ` Bjorn Helgaas
  0 siblings, 1 reply; 6+ messages in thread
From: Lorenzo Pieralisi @ 2017-07-10 15:49 UTC (permalink / raw)
  To: Bjorn Helgaas
  Cc: linux-pci, linux-kernel, Ralf Baechle, Paul Burton, Bjorn Helgaas

On Mon, Jul 10, 2017 at 09:55:53AM -0500, Bjorn Helgaas wrote:
> On Mon, Jul 10, 2017 at 01:34:09PM +0100, Lorenzo Pieralisi wrote:
> > If pci_scan_root_bus() fails (ie returns NULL) pcibios_scan_bus() must
> > return immediately since the struct pci_bus pointer it returns is not
> > valid and cannot be used.
> > 
> > Move code checking the pci_scan_root_bus() return value to reinstate
> > proper pcibios_scanbus() error path behaviour.
> > 
> > Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> > Cc: Ralf Baechle <ralf@linux-mips.org>
> > Cc: Paul Burton <paul.burton@imgtec.com>
> > Cc: Bjorn Helgaas <bhelgaas@google.com>
> 
> I agree this is certainly broken.  In fact, I think I broke it with
> 9e808eb6a768 ("PCI: Cleanup control flow") in 2015.  So probably v4.14
> material?

Yes that makes sense, I spotted it since I am preparing patches to
remove pci_fixup_irqs() from the kernel (by removing it from all arches
that still use it), I think that technically:

88555b481958 ("MIPS: PCI: Support for CONFIG_PCI_DOMAINS_GENERIC")

created a possible breakage (ie by using the possible NULL bus pointer),
if you merge it in one branch for 4.14 I will base the pci_fixup_irqs()
removal on top of it and post the series, just let me know please.

Thanks !
Lorenzo

> > ---
> >  arch/mips/pci/pci-legacy.c | 10 +++++-----
> >  1 file changed, 5 insertions(+), 5 deletions(-)
> > 
> > diff --git a/arch/mips/pci/pci-legacy.c b/arch/mips/pci/pci-legacy.c
> > index 174575a..71d62f8 100644
> > --- a/arch/mips/pci/pci-legacy.c
> > +++ b/arch/mips/pci/pci-legacy.c
> > @@ -89,16 +89,16 @@ static void pcibios_scanbus(struct pci_controller *hose)
> >  	pci_add_resource(&resources, hose->busn_resource);
> >  	bus = pci_scan_root_bus(NULL, next_busno, hose->pci_ops, hose,
> >  				&resources);
> > -	hose->bus = bus;
> > -
> > -	need_domain_info = need_domain_info || pci_domain_nr(bus);
> > -	set_pci_need_domain_info(hose, need_domain_info);
> > -
> >  	if (!bus) {
> >  		pci_free_resource_list(&resources);
> >  		return;
> >  	}
> >  
> > +	hose->bus = bus;
> > +
> > +	need_domain_info = need_domain_info || pci_domain_nr(bus);
> > +	set_pci_need_domain_info(hose, need_domain_info);
> > +
> >  	next_busno = bus->busn_res.end + 1;
> >  	/* Don't allow 8-bit bus number overflow inside the hose -
> >  	   reserve some space for bridges. */
> > -- 
> > 2.10.0
> > 

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/2] MIPS/PCI: Fix pcibios_scan_bus() NULL check code path
  2017-07-10 15:49     ` Lorenzo Pieralisi
@ 2017-07-10 16:38       ` Bjorn Helgaas
  0 siblings, 0 replies; 6+ messages in thread
From: Bjorn Helgaas @ 2017-07-10 16:38 UTC (permalink / raw)
  To: Lorenzo Pieralisi
  Cc: linux-pci, linux-kernel, Ralf Baechle, Paul Burton, Bjorn Helgaas

On Mon, Jul 10, 2017 at 04:49:24PM +0100, Lorenzo Pieralisi wrote:
> On Mon, Jul 10, 2017 at 09:55:53AM -0500, Bjorn Helgaas wrote:
> > On Mon, Jul 10, 2017 at 01:34:09PM +0100, Lorenzo Pieralisi wrote:
> > > If pci_scan_root_bus() fails (ie returns NULL) pcibios_scan_bus() must
> > > return immediately since the struct pci_bus pointer it returns is not
> > > valid and cannot be used.
> > > 
> > > Move code checking the pci_scan_root_bus() return value to reinstate
> > > proper pcibios_scanbus() error path behaviour.
> > > 
> > > Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> > > Cc: Ralf Baechle <ralf@linux-mips.org>
> > > Cc: Paul Burton <paul.burton@imgtec.com>
> > > Cc: Bjorn Helgaas <bhelgaas@google.com>
> > 
> > I agree this is certainly broken.  In fact, I think I broke it with
> > 9e808eb6a768 ("PCI: Cleanup control flow") in 2015.  So probably v4.14
> > material?
> 
> Yes that makes sense, I spotted it since I am preparing patches to
> remove pci_fixup_irqs() from the kernel (by removing it from all arches
> that still use it), I think that technically:
> 
> 88555b481958 ("MIPS: PCI: Support for CONFIG_PCI_DOMAINS_GENERIC")
> 
> created a possible breakage (ie by using the possible NULL bus pointer),
> if you merge it in one branch for 4.14 I will base the pci_fixup_irqs()
> removal on top of it and post the series, just let me know please.

Ah, you're right.  I created some poor style (checking the return
value after intervening code) with 9e808eb6a768, and then 88555b481958
fell into the trap I had laid.

I put this on pci/irq-fixups for a continuation of your work and
started it off with this patch.

I will rebase the branch after -rc1, but that shouldn't be a problem
for you because I normally apply patches from email rather than
pulling them directly.  I'll be on vacation July 14-28, so that
probably won't happen until August.

Thanks!

> > > ---
> > >  arch/mips/pci/pci-legacy.c | 10 +++++-----
> > >  1 file changed, 5 insertions(+), 5 deletions(-)
> > > 
> > > diff --git a/arch/mips/pci/pci-legacy.c b/arch/mips/pci/pci-legacy.c
> > > index 174575a..71d62f8 100644
> > > --- a/arch/mips/pci/pci-legacy.c
> > > +++ b/arch/mips/pci/pci-legacy.c
> > > @@ -89,16 +89,16 @@ static void pcibios_scanbus(struct pci_controller *hose)
> > >  	pci_add_resource(&resources, hose->busn_resource);
> > >  	bus = pci_scan_root_bus(NULL, next_busno, hose->pci_ops, hose,
> > >  				&resources);
> > > -	hose->bus = bus;
> > > -
> > > -	need_domain_info = need_domain_info || pci_domain_nr(bus);
> > > -	set_pci_need_domain_info(hose, need_domain_info);
> > > -
> > >  	if (!bus) {
> > >  		pci_free_resource_list(&resources);
> > >  		return;
> > >  	}
> > >  
> > > +	hose->bus = bus;
> > > +
> > > +	need_domain_info = need_domain_info || pci_domain_nr(bus);
> > > +	set_pci_need_domain_info(hose, need_domain_info);
> > > +
> > >  	next_busno = bus->busn_res.end + 1;
> > >  	/* Don't allow 8-bit bus number overflow inside the hose -
> > >  	   reserve some space for bridges. */
> > > -- 
> > > 2.10.0
> > > 

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2017-07-10 16:38 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-07-10 12:34 [PATCH 1/2] ARM/PCI: bios32: Fix pcibios_init_resource() error return path Lorenzo Pieralisi
2017-07-10 12:34 ` [PATCH 2/2] MIPS/PCI: Fix pcibios_scan_bus() NULL check code path Lorenzo Pieralisi
2017-07-10 14:55   ` Bjorn Helgaas
2017-07-10 15:49     ` Lorenzo Pieralisi
2017-07-10 16:38       ` Bjorn Helgaas
2017-07-10 14:57 ` [PATCH 1/2] ARM/PCI: bios32: Fix pcibios_init_resource() error return path Bjorn Helgaas

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.