linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Fix corruption error in rh_alloc_fixed()
@ 2008-12-09 14:28 Guillaume Knispel
  2008-12-09 15:03 ` Timur Tabi
  2008-12-17 16:11 ` Kumar Gala
  0 siblings, 2 replies; 11+ messages in thread
From: Guillaume Knispel @ 2008-12-09 14:28 UTC (permalink / raw)
  To: linuxppc-dev; +Cc: Joakim Tjernlund, Pantelis Antoniou, Li Yang, Timur Tabi

There is an error in rh_alloc_fixed() of the Remote Heap code:
If there is at least one free block blk won't be NULL at the end of the
search loop, so -ENOMEM won't be returned and the else branch of
"if (bs == s || be == e)" will be taken, corrupting the management
structures.

Signed-off-by: Guillaume Knispel <gknispel@proformatique.com>
---
Fix an error in rh_alloc_fixed() that made allocations succeed when
they should fail, and corrupted management structures.

diff --git a/arch/powerpc/lib/rheap.c b/arch/powerpc/lib/rheap.c
index 29b2941..45907c1 100644
--- a/arch/powerpc/lib/rheap.c
+++ b/arch/powerpc/lib/rheap.c
@@ -556,6 +556,7 @@ unsigned long rh_alloc_fixed(rh_info_t * info, unsigned long start, int size, co
 		be = blk->start + blk->size;
 		if (s >= bs && e <= be)
 			break;
+		blk = NULL;
 	}
 
 	if (blk == NULL)

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

* Re: [PATCH] Fix corruption error in rh_alloc_fixed()
  2008-12-09 14:28 [PATCH] Fix corruption error in rh_alloc_fixed() Guillaume Knispel
@ 2008-12-09 15:03 ` Timur Tabi
  2008-12-09 15:14   ` Guillaume Knispel
  2008-12-17 16:11 ` Kumar Gala
  1 sibling, 1 reply; 11+ messages in thread
From: Timur Tabi @ 2008-12-09 15:03 UTC (permalink / raw)
  To: Guillaume Knispel
  Cc: linuxppc-dev, Pantelis Antoniou, Li Yang, Joakim Tjernlund

Guillaume Knispel wrote:
> There is an error in rh_alloc_fixed() of the Remote Heap code:
> If there is at least one free block blk won't be NULL at the end of the
> search loop, so -ENOMEM won't be returned and the else branch of
> "if (bs == s || be == e)" will be taken, corrupting the management
> structures.
> 
> Signed-off-by: Guillaume Knispel <gknispel@proformatique.com>
> ---
> Fix an error in rh_alloc_fixed() that made allocations succeed when
> they should fail, and corrupted management structures.
> 
> diff --git a/arch/powerpc/lib/rheap.c b/arch/powerpc/lib/rheap.c
> index 29b2941..45907c1 100644
> --- a/arch/powerpc/lib/rheap.c
> +++ b/arch/powerpc/lib/rheap.c
> @@ -556,6 +556,7 @@ unsigned long rh_alloc_fixed(rh_info_t * info, unsigned long start, int size, co
>  		be = blk->start + blk->size;
>  		if (s >= bs && e <= be)
>  			break;
> +		blk = NULL;
>  	}
>  
>  	if (blk == NULL)

This is a good catch, however, wouldn't it be better to do this:

	list_for_each(l, &info->free_list) {
		blk = list_entry(l, rh_block_t, list);
		/* The range must lie entirely inside one free block */
		bs = blk->start;
		be = blk->start + blk->size;
		if (s >= bs && e <= be)
			break;
	}

-	if (blk == NULL)
+	if (blk == &info->free_list)
		return (unsigned long) -ENOMEM;

I haven't tested this, but the if-statement at the end of the loop is meant to
check whether the list_for_each() loop got to the end or not.

What do you think?

-- 
Timur Tabi
Linux kernel developer at Freescale

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

* Re: [PATCH] Fix corruption error in rh_alloc_fixed()
  2008-12-09 15:03 ` Timur Tabi
@ 2008-12-09 15:14   ` Guillaume Knispel
  2008-12-09 15:16     ` Timur Tabi
  0 siblings, 1 reply; 11+ messages in thread
From: Guillaume Knispel @ 2008-12-09 15:14 UTC (permalink / raw)
  To: Timur Tabi
  Cc: Joakim Tjernlund, Guillaume Knispel, Pantelis Antoniou,
	linuxppc-dev, Li Yang

On Tue, 09 Dec 2008 09:03:19 -0600
Timur Tabi <timur@freescale.com> wrote:

> Guillaume Knispel wrote:
> > There is an error in rh_alloc_fixed() of the Remote Heap code:
> > If there is at least one free block blk won't be NULL at the end of the
> > search loop, so -ENOMEM won't be returned and the else branch of
> > "if (bs == s || be == e)" will be taken, corrupting the management
> > structures.
> > 
> > Signed-off-by: Guillaume Knispel <gknispel@proformatique.com>
> > ---
> > Fix an error in rh_alloc_fixed() that made allocations succeed when
> > they should fail, and corrupted management structures.
> > 
> > diff --git a/arch/powerpc/lib/rheap.c b/arch/powerpc/lib/rheap.c
> > index 29b2941..45907c1 100644
> > --- a/arch/powerpc/lib/rheap.c
> > +++ b/arch/powerpc/lib/rheap.c
> > @@ -556,6 +556,7 @@ unsigned long rh_alloc_fixed(rh_info_t * info, unsigned long start, int size, co
> >  		be = blk->start + blk->size;
> >  		if (s >= bs && e <= be)
> >  			break;
> > +		blk = NULL;
> >  	}
> >  
> >  	if (blk == NULL)
> 
> This is a good catch, however, wouldn't it be better to do this:
> 
> 	list_for_each(l, &info->free_list) {
> 		blk = list_entry(l, rh_block_t, list);
> 		/* The range must lie entirely inside one free block */
> 		bs = blk->start;
> 		be = blk->start + blk->size;
> 		if (s >= bs && e <= be)
> 			break;
> 	}
> 
> -	if (blk == NULL)
> +	if (blk == &info->free_list)
> 		return (unsigned long) -ENOMEM;
> 
> I haven't tested this, but the if-statement at the end of the loop is meant to
> check whether the list_for_each() loop got to the end or not.
> 
> What do you think?

blk = NULL; at the end of the loop is what is done in the more used
rh_alloc_align(), so for consistency either we change both or we use
the same construction here.
I also think that testing for &info->free_list is harder to understand
because you must have the linked list implementation in your head
(which a kernel developer should anyway so this is not so important)

Guillaume Knispel

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

* Re: [PATCH] Fix corruption error in rh_alloc_fixed()
  2008-12-09 15:14   ` Guillaume Knispel
@ 2008-12-09 15:16     ` Timur Tabi
  2008-12-14 18:50       ` Guillaume Knispel
  0 siblings, 1 reply; 11+ messages in thread
From: Timur Tabi @ 2008-12-09 15:16 UTC (permalink / raw)
  To: Guillaume Knispel
  Cc: linuxppc-dev, Pantelis Antoniou, Li Yang, Joakim Tjernlund

Guillaume Knispel wrote:

> blk = NULL; at the end of the loop is what is done in the more used
> rh_alloc_align(), so for consistency either we change both or we use
> the same construction here.
> I also think that testing for &info->free_list is harder to understand
> because you must have the linked list implementation in your head
> (which a kernel developer should anyway so this is not so important)

Fair enough.

Acked-by: Timur Tabi <timur@freescale.com>

-- 
Timur Tabi
Linux kernel developer at Freescale

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

* Re: [PATCH] Fix corruption error in rh_alloc_fixed()
  2008-12-09 15:16     ` Timur Tabi
@ 2008-12-14 18:50       ` Guillaume Knispel
  2008-12-14 21:21         ` Paul Mackerras
  0 siblings, 1 reply; 11+ messages in thread
From: Guillaume Knispel @ 2008-12-14 18:50 UTC (permalink / raw)
  To: Kumar Gala
  Cc: Tjernlund, Joakim, Pantelis Antoniou, linuxppc-dev, Li Yang, Timur Tabi

On Tue, 09 Dec 2008 09:16:50 -0600
Timur Tabi <timur@freescale.com> wrote:

> Guillaume Knispel wrote:
> 
> > blk = NULL; at the end of the loop is what is done in the more used
> > rh_alloc_align(), so for consistency either we change both or we use
> > the same construction here.
> > I also think that testing for &info->free_list is harder to understand
> > because you must have the linked list implementation in your head
> > (which a kernel developer should anyway so this is not so important)
> 
> Fair enough.
> 
> Acked-by: Timur Tabi <timur@freescale.com>
> 

Kumar, can this go into your tree ?
(copying the patch under so you have it at hand)

There is an error in rh_alloc_fixed() of the Remote Heap code:
If there is at least one free block blk won't be NULL at the end of the
search loop, so -ENOMEM won't be returned and the else branch of
"if (bs == s || be == e)" will be taken, corrupting the management
structures.

Signed-off-by: Guillaume Knispel <gknispel@proformatique.com>
---
Fix an error in rh_alloc_fixed() that made allocations succeed when
they should fail, and corrupted management structures.

diff --git a/arch/powerpc/lib/rheap.c b/arch/powerpc/lib/rheap.c
index 29b2941..45907c1 100644
--- a/arch/powerpc/lib/rheap.c
+++ b/arch/powerpc/lib/rheap.c
@@ -556,6 +556,7 @@ unsigned long rh_alloc_fixed(rh_info_t * info, unsigned long start, int size, co
 		be = blk->start + blk->size;
 		if (s >= bs && e <= be)
 			break;
+		blk = NULL;
 	}
 
 	if (blk == NULL)

-- 
Guillaume KNISPEL

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

* Re: [PATCH] Fix corruption error in rh_alloc_fixed()
  2008-12-14 18:50       ` Guillaume Knispel
@ 2008-12-14 21:21         ` Paul Mackerras
  2008-12-15  0:32           ` Guillaume Knispel
  0 siblings, 1 reply; 11+ messages in thread
From: Paul Mackerras @ 2008-12-14 21:21 UTC (permalink / raw)
  To: Guillaume Knispel
  Cc: Tjernlund, Pantelis Antoniou, linuxppc-dev, Li Yang, Timur Tabi

Guillaume Knispel writes:

> On Tue, 09 Dec 2008 09:16:50 -0600
> Timur Tabi <timur@freescale.com> wrote:
> 
> > Guillaume Knispel wrote:
> > 
> > > blk = NULL; at the end of the loop is what is done in the more used
> > > rh_alloc_align(), so for consistency either we change both or we use
> > > the same construction here.
> > > I also think that testing for &info->free_list is harder to understand
> > > because you must have the linked list implementation in your head
> > > (which a kernel developer should anyway so this is not so important)
> > 
> > Fair enough.
> > 
> > Acked-by: Timur Tabi <timur@freescale.com>
> > 
> 
> Kumar, can this go into your tree ?
> (copying the patch under so you have it at hand)
> 
> There is an error in rh_alloc_fixed() of the Remote Heap code:
> If there is at least one free block blk won't be NULL at the end of the
> search loop, so -ENOMEM won't be returned and the else branch of
> "if (bs == s || be == e)" will be taken, corrupting the management
> structures.
> 
> Signed-off-by: Guillaume Knispel <gknispel@proformatique.com>
> ---
> Fix an error in rh_alloc_fixed() that made allocations succeed when
> they should fail, and corrupted management structures.

What's the impact of this?  Can it cause an oops?

Is it a regression from 2.6.27?  Should we be putting it in 2.6.28?

Paul.

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

* Re: [PATCH] Fix corruption error in rh_alloc_fixed()
  2008-12-14 21:21         ` Paul Mackerras
@ 2008-12-15  0:32           ` Guillaume Knispel
  2008-12-16 18:23             ` Kumar Gala
  0 siblings, 1 reply; 11+ messages in thread
From: Guillaume Knispel @ 2008-12-15  0:32 UTC (permalink / raw)
  To: Paul Mackerras
  Cc: Tjernlund, Pantelis Antoniou, linuxppc-dev, Li Yang, Timur Tabi

On Mon, 15 Dec 2008 08:21:05 +1100
Paul Mackerras <paulus@samba.org> wrote:

> Guillaume Knispel writes:
> 
> > On Tue, 09 Dec 2008 09:16:50 -0600
> > Timur Tabi <timur@freescale.com> wrote:
> > 
> > > Guillaume Knispel wrote:
> > > 
> > > > blk = NULL; at the end of the loop is what is done in the more used
> > > > rh_alloc_align(), so for consistency either we change both or we use
> > > > the same construction here.
> > > > I also think that testing for &info->free_list is harder to understand
> > > > because you must have the linked list implementation in your head
> > > > (which a kernel developer should anyway so this is not so important)
> > > 
> > > Fair enough.
> > > 
> > > Acked-by: Timur Tabi <timur@freescale.com>
> > > 
> > 
> > Kumar, can this go into your tree ?
> > (copying the patch under so you have it at hand)
> > 
> > There is an error in rh_alloc_fixed() of the Remote Heap code:
> > If there is at least one free block blk won't be NULL at the end of the
> > search loop, so -ENOMEM won't be returned and the else branch of
> > "if (bs == s || be == e)" will be taken, corrupting the management
> > structures.
> > 
> > Signed-off-by: Guillaume Knispel <gknispel@proformatique.com>
> > ---
> > Fix an error in rh_alloc_fixed() that made allocations succeed when
> > they should fail, and corrupted management structures.
> 
> What's the impact of this?  Can it cause an oops?
> 
> Is it a regression from 2.6.27?  Should we be putting it in 2.6.28?
> 
> Paul.

The problem obviously only affect people that make use of
rh_alloc_fixed(), which is the case when you program an MCC or a QMC
controller of the CPM. Without the patch cpm_muram_alloc_fixed()
succeed when it should not, for example when trying to allocate out of
range areas or already allocated areas, so it is possible that buffer
descriptors or other control structures used by other controllers get
corrupted.

Digging into ooooold Linux (like 2.6.9, I haven't checked before),
the problem seems to always have been present.

Without this patch I experienced oops (sometimes panic, sometimes not)
in various unrelated part (probably an indirect result of either
corruption of rheap management structures or corruption caused by the
CPM using crazy overwritten data) and also initialization of
multi-channel control structures putting other communication
controllers out-of-order.

The only risk I can think off is that it could break some out of tree
kernel space code which worked because of luck and a double error - for
example when doing a single DPRam allocation from offset 0 while
leaving an area reserved at the base of the DPRam. So I think it should
be put in 2.6.28.

Guillaume Knispel

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

* Re: [PATCH] Fix corruption error in rh_alloc_fixed()
  2008-12-15  0:32           ` Guillaume Knispel
@ 2008-12-16 18:23             ` Kumar Gala
  2008-12-17  1:13               ` Paul Mackerras
  0 siblings, 1 reply; 11+ messages in thread
From: Kumar Gala @ 2008-12-16 18:23 UTC (permalink / raw)
  To: Paul Mackerras
  Cc: Tjernlund, Guillaume Knispel, Pantelis Antoniou,
	linuxppc-dev list, Li Yang, Timur Tabi

>
> The problem obviously only affect people that make use of
> rh_alloc_fixed(), which is the case when you program an MCC or a QMC
> controller of the CPM. Without the patch cpm_muram_alloc_fixed()
> succeed when it should not, for example when trying to allocate out of
> range areas or already allocated areas, so it is possible that buffer
> descriptors or other control structures used by other controllers get
> corrupted.
>
> Digging into ooooold Linux (like 2.6.9, I haven't checked before),
> the problem seems to always have been present.
>
> Without this patch I experienced oops (sometimes panic, sometimes not)
> in various unrelated part (probably an indirect result of either
> corruption of rheap management structures or corruption caused by the
> CPM using crazy overwritten data) and also initialization of
> multi-channel control structures putting other communication
> controllers out-of-order.
>
> The only risk I can think off is that it could break some out of tree
> kernel space code which worked because of luck and a double error -  
> for
> example when doing a single DPRam allocation from offset 0 while
> leaving an area reserved at the base of the DPRam. So I think it  
> should
> be put in 2.6.28.

Paul are you planning on picking this up for .28 if not I'll pick it  
up for .29

- k

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

* Re: [PATCH] Fix corruption error in rh_alloc_fixed()
  2008-12-16 18:23             ` Kumar Gala
@ 2008-12-17  1:13               ` Paul Mackerras
  2008-12-17 16:00                 ` Kumar Gala
  0 siblings, 1 reply; 11+ messages in thread
From: Paul Mackerras @ 2008-12-17  1:13 UTC (permalink / raw)
  To: Kumar Gala
  Cc: Tjernlund, Guillaume Knispel, Pantelis Antoniou,
	linuxppc-dev list, Li Yang, Timur Tabi

Kumar Gala writes:

> Paul are you planning on picking this up for .28 if not I'll pick it  
> up for .29

I was waiting for you to say if it needed to go in .28.  Sounds like
you don't think it's that urgent then?

Paul.

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

* Re: [PATCH] Fix corruption error in rh_alloc_fixed()
  2008-12-17  1:13               ` Paul Mackerras
@ 2008-12-17 16:00                 ` Kumar Gala
  0 siblings, 0 replies; 11+ messages in thread
From: Kumar Gala @ 2008-12-17 16:00 UTC (permalink / raw)
  To: Paul Mackerras
  Cc: Tjernlund, Guillaume Knispel, Pantelis Antoniou,
	linuxppc-dev list, Li Yang, Timur Tabi


On Dec 16, 2008, at 7:13 PM, Paul Mackerras wrote:

> Kumar Gala writes:
>
>> Paul are you planning on picking this up for .28 if not I'll pick it
>> up for .29
>
> I was waiting for you to say if it needed to go in .28.  Sounds like
> you don't think it's that urgent then?

Since I have another patch for .28 I'll include in my merge tree.

- k

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

* Re: [PATCH] Fix corruption error in rh_alloc_fixed()
  2008-12-09 14:28 [PATCH] Fix corruption error in rh_alloc_fixed() Guillaume Knispel
  2008-12-09 15:03 ` Timur Tabi
@ 2008-12-17 16:11 ` Kumar Gala
  1 sibling, 0 replies; 11+ messages in thread
From: Kumar Gala @ 2008-12-17 16:11 UTC (permalink / raw)
  To: Guillaume Knispel
  Cc: linuxppc-dev, Pantelis Antoniou, Li Yang, Timur Tabi, Joakim Tjernlund


On Dec 9, 2008, at 8:28 AM, Guillaume Knispel wrote:

> There is an error in rh_alloc_fixed() of the Remote Heap code:
> If there is at least one free block blk won't be NULL at the end of  
> the
> search loop, so -ENOMEM won't be returned and the else branch of
> "if (bs == s || be == e)" will be taken, corrupting the management
> structures.
>
> Signed-off-by: Guillaume Knispel <gknispel@proformatique.com>
> ---
> Fix an error in rh_alloc_fixed() that made allocations succeed when
> they should fail, and corrupted management structures.
>
> diff --git a/arch/powerpc/lib/rheap.c b/arch/powerpc/lib/rheap.c
> index 29b2941..45907c1 100644
> --- a/arch/powerpc/lib/rheap.c
> +++ b/arch/powerpc/lib/rheap.c
> @@ -556,6 +556,7 @@ unsigned long rh_alloc_fixed(rh_info_t * info,  
> unsigned long start, int size, co
> 		be = blk->start + blk->size;
> 		if (s >= bs && e <= be)
> 			break;
> +		blk = NULL;
> 	}
>
> 	if (blk == NULL)

applied

- k

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

end of thread, other threads:[~2008-12-17 16:13 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-12-09 14:28 [PATCH] Fix corruption error in rh_alloc_fixed() Guillaume Knispel
2008-12-09 15:03 ` Timur Tabi
2008-12-09 15:14   ` Guillaume Knispel
2008-12-09 15:16     ` Timur Tabi
2008-12-14 18:50       ` Guillaume Knispel
2008-12-14 21:21         ` Paul Mackerras
2008-12-15  0:32           ` Guillaume Knispel
2008-12-16 18:23             ` Kumar Gala
2008-12-17  1:13               ` Paul Mackerras
2008-12-17 16:00                 ` Kumar Gala
2008-12-17 16:11 ` Kumar Gala

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).