public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/3] lib/maple_tree: fix potential NULL dereference in mas_pop_node()
@ 2026-03-12 18:40 Josh Law
  2026-03-12 18:40 ` [PATCH 2/3] lib/maple_tree: fix always-true condition in mas_erase() Josh Law
  2026-03-12 20:45 ` [PATCH 1/3] lib/maple_tree: fix potential NULL dereference in mas_pop_node() Andrew Morton
  0 siblings, 2 replies; 11+ messages in thread
From: Josh Law @ 2026-03-12 18:40 UTC (permalink / raw)
  To: Liam R . Howlett, Andrew Morton
  Cc: Alice Ryhl, Andrew Ballance, Josh Law, maple-tree, linux-mm,
	linux-kernel

If kmem_cache_alloc_from_sheaf() returns NULL (possible under
GFP_NOWAIT pressure), mas_pop_node() falls through to the out label
and dereferences the NULL pointer in memset(ret, 0, sizeof(*ret)).

Add a WARN_ON_ONCE NULL check after the sheaf allocation to bail out
early, matching the existing pattern for the !mas->sheaf case above.

Signed-off-by: Josh Law <objecting@objecting.org>
---
 lib/maple_tree.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/lib/maple_tree.c b/lib/maple_tree.c
index 739918e859e5..87a2ba6468ca 100644
--- a/lib/maple_tree.c
+++ b/lib/maple_tree.c
@@ -1063,6 +1063,8 @@ static __always_inline struct maple_node *mas_pop_node(struct ma_state *mas)
 		return NULL;
 
 	ret = kmem_cache_alloc_from_sheaf(maple_node_cache, GFP_NOWAIT, mas->sheaf);
+	if (WARN_ON_ONCE(!ret))
+		return NULL;
 
 out:
 	memset(ret, 0, sizeof(*ret));
-- 
2.34.1


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

* [PATCH 2/3] lib/maple_tree: fix always-true condition in mas_erase()
  2026-03-12 18:40 [PATCH 1/3] lib/maple_tree: fix potential NULL dereference in mas_pop_node() Josh Law
@ 2026-03-12 18:40 ` Josh Law
  2026-03-12 20:45 ` [PATCH 1/3] lib/maple_tree: fix potential NULL dereference in mas_pop_node() Andrew Morton
  1 sibling, 0 replies; 11+ messages in thread
From: Josh Law @ 2026-03-12 18:40 UTC (permalink / raw)
  To: Liam R . Howlett, Andrew Morton
  Cc: Alice Ryhl, Andrew Ballance, Josh Law, maple-tree, linux-mm,
	linux-kernel

The condition (!mas_is_active(mas) || !mas_is_start(mas)) is always
true because ma_active and ma_start are distinct enum values -- a
state can never be both simultaneously. This causes mas_erase() to
unconditionally reset the status to ma_start, discarding a valid
active walk position.

Change || to && so the reset only fires when the state is neither
active nor start, matching the equivalent guard in mas_walk().

Signed-off-by: Josh Law <objecting@objecting.org>
---
 lib/maple_tree.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/maple_tree.c b/lib/maple_tree.c
index 87a2ba6468ca..9727dcefbf65 100644
--- a/lib/maple_tree.c
+++ b/lib/maple_tree.c
@@ -5574,7 +5574,7 @@ void *mas_erase(struct ma_state *mas)
 	unsigned long index = mas->index;
 	MA_WR_STATE(wr_mas, mas, NULL);
 
-	if (!mas_is_active(mas) || !mas_is_start(mas))
+	if (!mas_is_active(mas) && !mas_is_start(mas))
 		mas->status = ma_start;
 
 write_retry:
-- 
2.34.1


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

* Re: [PATCH 1/3] lib/maple_tree: fix potential NULL dereference in mas_pop_node()
  2026-03-12 18:40 [PATCH 1/3] lib/maple_tree: fix potential NULL dereference in mas_pop_node() Josh Law
  2026-03-12 18:40 ` [PATCH 2/3] lib/maple_tree: fix always-true condition in mas_erase() Josh Law
@ 2026-03-12 20:45 ` Andrew Morton
  2026-03-12 20:49   ` Josh Law
  2026-03-12 23:22   ` Pedro Falcato
  1 sibling, 2 replies; 11+ messages in thread
From: Andrew Morton @ 2026-03-12 20:45 UTC (permalink / raw)
  To: Josh Law
  Cc: Liam R . Howlett, Alice Ryhl, Andrew Ballance, Josh Law,
	maple-tree, linux-mm, linux-kernel

On Thu, 12 Mar 2026 18:40:53 +0000 Josh Law <hlcj1234567@gmail.com> wrote:

> If kmem_cache_alloc_from_sheaf() returns NULL (possible under
> GFP_NOWAIT pressure), mas_pop_node() falls through to the out label
> and dereferences the NULL pointer in memset(ret, 0, sizeof(*ret)).

This is such a glaring bug that I wonder if we're missing something.

> Add a WARN_ON_ONCE NULL check after the sheaf allocation to bail out
> early, matching the existing pattern for the !mas->sheaf case above.
> 
> Signed-off-by: Josh Law <objecting@objecting.org>
> ---
>  lib/maple_tree.c | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/lib/maple_tree.c b/lib/maple_tree.c
> index 739918e859e5..87a2ba6468ca 100644
> --- a/lib/maple_tree.c
> +++ b/lib/maple_tree.c
> @@ -1063,6 +1063,8 @@ static __always_inline struct maple_node *mas_pop_node(struct ma_state *mas)
>  		return NULL;
>  
>  	ret = kmem_cache_alloc_from_sheaf(maple_node_cache, GFP_NOWAIT, mas->sheaf);
> +	if (WARN_ON_ONCE(!ret))
> +		return NULL;

If we're going to do this then we may as well restore !__GFP_NOWARN,
get more relevant information.

But a GFP_NOWAIT allocation attempt can fail relatively easily so
callers must be equipped to handle it - perhaps no need for any
warning.



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

* Re: [PATCH 1/3] lib/maple_tree: fix potential NULL dereference in mas_pop_node()
  2026-03-12 20:45 ` [PATCH 1/3] lib/maple_tree: fix potential NULL dereference in mas_pop_node() Andrew Morton
@ 2026-03-12 20:49   ` Josh Law
  2026-03-12 20:56     ` Josh Law
  2026-03-12 23:00     ` Alice Ryhl
  2026-03-12 23:22   ` Pedro Falcato
  1 sibling, 2 replies; 11+ messages in thread
From: Josh Law @ 2026-03-12 20:49 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Liam R . Howlett, Alice Ryhl, Andrew Ballance, Josh Law,
	maple-tree, linux-mm, linux-kernel

12 Mar 2026 20:45:32 Andrew Morton <akpm@linux-foundation.org>:

> On Thu, 12 Mar 2026 18:40:53 +0000 Josh Law <hlcj1234567@gmail.com> wrote:
>
>> If kmem_cache_alloc_from_sheaf() returns NULL (possible under
>> GFP_NOWAIT pressure), mas_pop_node() falls through to the out label
>> and dereferences the NULL pointer in memset(ret, 0, sizeof(*ret)).
>
> This is such a glaring bug that I wonder if we're missing something.
>
>> Add a WARN_ON_ONCE NULL check after the sheaf allocation to bail out
>> early, matching the existing pattern for the !mas->sheaf case above.
>>
>> Signed-off-by: Josh Law <objecting@objecting.org>
>> ---
>> lib/maple_tree.c | 2 ++
>> 1 file changed, 2 insertions(+)
>>
>> diff --git a/lib/maple_tree.c b/lib/maple_tree.c
>> index 739918e859e5..87a2ba6468ca 100644
>> --- a/lib/maple_tree.c
>> +++ b/lib/maple_tree.c
>> @@ -1063,6 +1063,8 @@ static __always_inline struct maple_node *mas_pop_node(struct ma_state *mas)
>>         return NULL;
>>
>>     ret = kmem_cache_alloc_from_sheaf(maple_node_cache, GFP_NOWAIT, mas->sheaf);
>> +   if (WARN_ON_ONCE(!ret))
>> +       return NULL;
>
> If we're going to do this then we may as well restore !__GFP_NOWARN,
> get more relevant information.
>
> But a GFP_NOWAIT allocation attempt can fail relatively easily so
> callers must be equipped to handle it - perhaps no need for any
> warning.

Well, fair enough, but WARN_ON is equivalent to a "oops! Something went wrong! We will continue anyway", NOWARN is quite bad for logging that that went wrong, usually it's BUG_ON that causes said kernel panics and that, which is a bit overkill, that's why I didn't add it, and it warns once, then bails, that's why I'm a bit on the iffy side about adding NOWARN, what's your opinion on this, do you think a NOWARN is better then warn on once?


V/R



Josh law

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

* Re: [PATCH 1/3] lib/maple_tree: fix potential NULL dereference in mas_pop_node()
  2026-03-12 20:49   ` Josh Law
@ 2026-03-12 20:56     ` Josh Law
  2026-03-12 21:14       ` Josh Law
  2026-03-12 23:00     ` Alice Ryhl
  1 sibling, 1 reply; 11+ messages in thread
From: Josh Law @ 2026-03-12 20:56 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Liam R . Howlett, Alice Ryhl, Andrew Ballance, Josh Law,
	maple-tree, linux-mm, linux-kernel

12 Mar 2026 20:49:21 Josh Law <hlcj1234567@gmail.com>:

> 12 Mar 2026 20:45:32 Andrew Morton <akpm@linux-foundation.org>:
>
>> On Thu, 12 Mar 2026 18:40:53 +0000 Josh Law <hlcj1234567@gmail.com> wrote:
>>
>>> If kmem_cache_alloc_from_sheaf() returns NULL (possible under
>>> GFP_NOWAIT pressure), mas_pop_node() falls through to the out label
>>> and dereferences the NULL pointer in memset(ret, 0, sizeof(*ret)).
>>
>> This is such a glaring bug that I wonder if we're missing something.
>>
>>> Add a WARN_ON_ONCE NULL check after the sheaf allocation to bail out
>>> early, matching the existing pattern for the !mas->sheaf case above.
>>>
>>> Signed-off-by: Josh Law <objecting@objecting.org>
>>> ---
>>> lib/maple_tree.c | 2 ++
>>> 1 file changed, 2 insertions(+)
>>>
>>> diff --git a/lib/maple_tree.c b/lib/maple_tree.c
>>> index 739918e859e5..87a2ba6468ca 100644
>>> --- a/lib/maple_tree.c
>>> +++ b/lib/maple_tree.c
>>> @@ -1063,6 +1063,8 @@ static __always_inline struct maple_node *mas_pop_node(struct ma_state *mas)
>>>         return NULL;
>>>
>>>     ret = kmem_cache_alloc_from_sheaf(maple_node_cache, GFP_NOWAIT, mas->sheaf);
>>> +   if (WARN_ON_ONCE(!ret))
>>> +       return NULL;
>>
>> If we're going to do this then we may as well restore !__GFP_NOWARN,
>> get more relevant information.
>>
>> But a GFP_NOWAIT allocation attempt can fail relatively easily so
>> callers must be equipped to handle it - perhaps no need for any
>> warning.
>
> Well, fair enough, but WARN_ON is equivalent to a "oops! Something went wrong! We will continue anyway", NOWARN is quite bad for logging that that went wrong, usually it's BUG_ON that causes said kernel panics and that, which is a bit overkill, that's why I didn't add it, and it warns once, then bails, that's why I'm a bit on the iffy side about adding NOWARN, what's your opinion on this, do you think a NOWARN is better then warn on once?
>
>
> V/R
>
>
>
> Josh law

I checked the callers as you suggested. In lib/maple_tree.c at lines 2352 and 6039, mas_pop_node() is called inside loops where the return value is used immediately (passed to ma_mnode_ptr or bitwise-ORed) without any NULL validation.
If kmem_cache_alloc_from_sheaf() fails under GFP_NOWAIT pressure, these callers will trigger a kernel panic.

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

* Re: [PATCH 1/3] lib/maple_tree: fix potential NULL dereference in mas_pop_node()
  2026-03-12 20:56     ` Josh Law
@ 2026-03-12 21:14       ` Josh Law
  0 siblings, 0 replies; 11+ messages in thread
From: Josh Law @ 2026-03-12 21:14 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Liam R . Howlett, Alice Ryhl, Andrew Ballance, Josh Law,
	maple-tree, linux-mm, linux-kernel

12 Mar 2026 20:56:16 Josh Law <hlcj1234567@gmail.com>:

> 12 Mar 2026 20:49:21 Josh Law <hlcj1234567@gmail.com>:
>
>> 12 Mar 2026 20:45:32 Andrew Morton <akpm@linux-foundation.org>:
>>
>>> On Thu, 12 Mar 2026 18:40:53 +0000 Josh Law <hlcj1234567@gmail.com> wrote:
>>>
>>>> If kmem_cache_alloc_from_sheaf() returns NULL (possible under
>>>> GFP_NOWAIT pressure), mas_pop_node() falls through to the out label
>>>> and dereferences the NULL pointer in memset(ret, 0, sizeof(*ret)).
>>>
>>> This is such a glaring bug that I wonder if we're missing something.
>>>
>>>> Add a WARN_ON_ONCE NULL check after the sheaf allocation to bail out
>>>> early, matching the existing pattern for the !mas->sheaf case above.
>>>>
>>>> Signed-off-by: Josh Law <objecting@objecting.org>
>>>> ---
>>>> lib/maple_tree.c | 2 ++
>>>> 1 file changed, 2 insertions(+)
>>>>
>>>> diff --git a/lib/maple_tree.c b/lib/maple_tree.c
>>>> index 739918e859e5..87a2ba6468ca 100644
>>>> --- a/lib/maple_tree.c
>>>> +++ b/lib/maple_tree.c
>>>> @@ -1063,6 +1063,8 @@ static __always_inline struct maple_node *mas_pop_node(struct ma_state *mas)
>>>>         return NULL;
>>>>
>>>>     ret = kmem_cache_alloc_from_sheaf(maple_node_cache, GFP_NOWAIT, mas->sheaf);
>>>> +   if (WARN_ON_ONCE(!ret))
>>>> +       return NULL;
>>>
>>> If we're going to do this then we may as well restore !__GFP_NOWARN,
>>> get more relevant information.
>>>
>>> But a GFP_NOWAIT allocation attempt can fail relatively easily so
>>> callers must be equipped to handle it - perhaps no need for any
>>> warning.
>>
>> Well, fair enough, but WARN_ON is equivalent to a "oops! Something went wrong! We will continue anyway", NOWARN is quite bad for logging that that went wrong, usually it's BUG_ON that causes said kernel panics and that, which is a bit overkill, that's why I didn't add it, and it warns once, then bails, that's why I'm a bit on the iffy side about adding NOWARN, what's your opinion on this, do you think a NOWARN is better then warn on once?
>>
>>
>> V/R
>>
>>
>>
>> Josh law
>
> I checked the callers as you suggested. In lib/maple_tree.c at lines 2352 and 6039, mas_pop_node() is called inside loops where the return value is used immediately (passed to ma_mnode_ptr or bitwise-ORed) without any NULL validation.
> If kmem_cache_alloc_from_sheaf() fails under GFP_NOWAIT pressure, these callers will trigger a kernel panic.

Yeah in my opinion I think this may need to be merged.. if you would like I can add the NOWARN

V/R

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

* Re: [PATCH 1/3] lib/maple_tree: fix potential NULL dereference in mas_pop_node()
  2026-03-12 20:49   ` Josh Law
  2026-03-12 20:56     ` Josh Law
@ 2026-03-12 23:00     ` Alice Ryhl
  1 sibling, 0 replies; 11+ messages in thread
From: Alice Ryhl @ 2026-03-12 23:00 UTC (permalink / raw)
  To: Josh Law
  Cc: Andrew Morton, Liam R . Howlett, Andrew Ballance, Josh Law,
	maple-tree, linux-mm, linux-kernel

On Thu, Mar 12, 2026 at 08:49:20PM +0000, Josh Law wrote:
> 12 Mar 2026 20:45:32 Andrew Morton <akpm@linux-foundation.org>:
> 
> > On Thu, 12 Mar 2026 18:40:53 +0000 Josh Law <hlcj1234567@gmail.com> wrote:
> >
> >> If kmem_cache_alloc_from_sheaf() returns NULL (possible under
> >> GFP_NOWAIT pressure), mas_pop_node() falls through to the out label
> >> and dereferences the NULL pointer in memset(ret, 0, sizeof(*ret)).
> >
> > This is such a glaring bug that I wonder if we're missing something.
> >
> >> Add a WARN_ON_ONCE NULL check after the sheaf allocation to bail out
> >> early, matching the existing pattern for the !mas->sheaf case above.
> >>
> >> Signed-off-by: Josh Law <objecting@objecting.org>
> >> ---
> >> lib/maple_tree.c | 2 ++
> >> 1 file changed, 2 insertions(+)
> >>
> >> diff --git a/lib/maple_tree.c b/lib/maple_tree.c
> >> index 739918e859e5..87a2ba6468ca 100644
> >> --- a/lib/maple_tree.c
> >> +++ b/lib/maple_tree.c
> >> @@ -1063,6 +1063,8 @@ static __always_inline struct maple_node *mas_pop_node(struct ma_state *mas)
> >>         return NULL;
> >>
> >>     ret = kmem_cache_alloc_from_sheaf(maple_node_cache, GFP_NOWAIT, mas->sheaf);
> >> +   if (WARN_ON_ONCE(!ret))
> >> +       return NULL;
> >
> > If we're going to do this then we may as well restore !__GFP_NOWARN,
> > get more relevant information.
> >
> > But a GFP_NOWAIT allocation attempt can fail relatively easily so
> > callers must be equipped to handle it - perhaps no need for any
> > warning.
> 
> Well, fair enough, but WARN_ON is equivalent to a "oops! Something
> went wrong! We will continue anyway", NOWARN is quite bad for logging
> that that went wrong, usually it's BUG_ON that causes said kernel
> panics and that, which is a bit overkill, that's why I didn't add it,
> and it warns once, then bails, that's why I'm a bit on the iffy side
> about adding NOWARN, what's your opinion on this, do you think a
> NOWARN is better then warn on once?

The WARN_ON option must only be used for conditions that indicate a
kernel bug. Memory pressure is not a kernel bug, so WARN_ON is wrong
here. In fact, depending on kernel configuration, WARN_ON_ONCE may crash
the kernel.

Alice

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

* Re: [PATCH 1/3] lib/maple_tree: fix potential NULL dereference in mas_pop_node()
  2026-03-12 20:45 ` [PATCH 1/3] lib/maple_tree: fix potential NULL dereference in mas_pop_node() Andrew Morton
  2026-03-12 20:49   ` Josh Law
@ 2026-03-12 23:22   ` Pedro Falcato
  2026-03-13  7:17     ` Josh Law
  1 sibling, 1 reply; 11+ messages in thread
From: Pedro Falcato @ 2026-03-12 23:22 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Josh Law, Liam R . Howlett, Alice Ryhl, Andrew Ballance, Josh Law,
	maple-tree, linux-mm, linux-kernel

On Thu, Mar 12, 2026 at 01:45:31PM -0700, Andrew Morton wrote:
> On Thu, 12 Mar 2026 18:40:53 +0000 Josh Law <hlcj1234567@gmail.com> wrote:
> 
> > If kmem_cache_alloc_from_sheaf() returns NULL (possible under
> > GFP_NOWAIT pressure), mas_pop_node() falls through to the out label
> > and dereferences the NULL pointer in memset(ret, 0, sizeof(*ret)).
> 
> This is such a glaring bug that I wonder if we're missing something.

According to my local copy of lib/maple_tree.c:

mas_pop_node() - Get a previously allocated maple node from the maple state.

Note the "previously" :) kmem_cache_alloc_from_sheaf() can only fail if you
run out of objects in the sheaf.

So yeah, this "bug" looks bogus.

-- 
Pedro

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

* Re: [PATCH 1/3] lib/maple_tree: fix potential NULL dereference in mas_pop_node()
  2026-03-12 23:22   ` Pedro Falcato
@ 2026-03-13  7:17     ` Josh Law
  2026-03-13  9:05       ` Pedro Falcato
  0 siblings, 1 reply; 11+ messages in thread
From: Josh Law @ 2026-03-13  7:17 UTC (permalink / raw)
  To: Pedro Falcato
  Cc: Andrew Morton, Liam R . Howlett, Alice Ryhl, Andrew Ballance,
	Josh Law, maple-tree, linux-mm, linux-kernel

12 Mar 2026 23:22:48 Pedro Falcato <pfalcato@suse.de>:

> On Thu, Mar 12, 2026 at 01:45:31PM -0700, Andrew Morton wrote:
>> On Thu, 12 Mar 2026 18:40:53 +0000 Josh Law <hlcj1234567@gmail.com> wrote:
>>
>>> If kmem_cache_alloc_from_sheaf() returns NULL (possible under
>>> GFP_NOWAIT pressure), mas_pop_node() falls through to the out label
>>> and dereferences the NULL pointer in memset(ret, 0, sizeof(*ret)).
>>
>> This is such a glaring bug that I wonder if we're missing something.
>
> According to my local copy of lib/maple_tree.c:
>
> mas_pop_node() - Get a previously allocated maple node from the maple state.
>
> Note the "previously" :) kmem_cache_alloc_from_sheaf() can only fail if you
> run out of objects in the sheaf.
>
> So yeah, this "bug" looks bogus.
>
> --
> Pedro

Hi Pedro,

I see the comment regarding 'previously allocated' nodes. However,
mas_pop_node() explicitly calls kmem_cache_alloc_from_sheaf() with
GFP_NOWAIT. If there is any path—even an unexpected one—where the
sheaf is exhausted or the allocator fails, the code immediately
performs a memset on the NULL pointer.

Even if this is a 'should never happen' scenario, returning NULL is
safer than a kernel panic. As Andrew noted, the current structure
allows a fall-through directly into a dereference. My patch ensures
we handle that edge case safely.

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

* Re: [PATCH 1/3] lib/maple_tree: fix potential NULL dereference in mas_pop_node()
  2026-03-13  7:17     ` Josh Law
@ 2026-03-13  9:05       ` Pedro Falcato
  2026-03-13 16:11         ` Josh Law
  0 siblings, 1 reply; 11+ messages in thread
From: Pedro Falcato @ 2026-03-13  9:05 UTC (permalink / raw)
  To: Josh Law
  Cc: Andrew Morton, Liam R . Howlett, Alice Ryhl, Andrew Ballance,
	Josh Law, maple-tree, linux-mm, linux-kernel

On Fri, Mar 13, 2026 at 07:17:17AM +0000, Josh Law wrote:
> 12 Mar 2026 23:22:48 Pedro Falcato <pfalcato@suse.de>:
> 
> > On Thu, Mar 12, 2026 at 01:45:31PM -0700, Andrew Morton wrote:
> >> On Thu, 12 Mar 2026 18:40:53 +0000 Josh Law <hlcj1234567@gmail.com> wrote:
> >>
> >>> If kmem_cache_alloc_from_sheaf() returns NULL (possible under
> >>> GFP_NOWAIT pressure), mas_pop_node() falls through to the out label
> >>> and dereferences the NULL pointer in memset(ret, 0, sizeof(*ret)).
> >>
> >> This is such a glaring bug that I wonder if we're missing something.
> >
> > According to my local copy of lib/maple_tree.c:
> >
> > mas_pop_node() - Get a previously allocated maple node from the maple state.
> >
> > Note the "previously" :) kmem_cache_alloc_from_sheaf() can only fail if you
> > run out of objects in the sheaf.
> >
> > So yeah, this "bug" looks bogus.
> >
> > --
> > Pedro
> 
> Hi Pedro,
> 
> I see the comment regarding 'previously allocated' nodes. However,
> mas_pop_node() explicitly calls kmem_cache_alloc_from_sheaf() with
> GFP_NOWAIT. If there is any path—even an unexpected one—where the
> sheaf is exhausted or the allocator fails, the code immediately
> performs a memset on the NULL pointer.

And? This does not happen, simply. If it does, your maple tree is hosed
and, really, you're not recovering from it.

> 
> Even if this is a 'should never happen' scenario, returning NULL is
> safer than a kernel panic. As Andrew noted, the current structure
> allows a fall-through directly into a dereference. My patch ensures
> we handle that edge case safely.

... and now because none of the mas_pop_node() callers ever checks for NULL
(why would they, they preallocated those same nodes before), you safely
dereference NULL away from mas_pop_node!.

-- 
Pedro

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

* Re: [PATCH 1/3] lib/maple_tree: fix potential NULL dereference in mas_pop_node()
  2026-03-13  9:05       ` Pedro Falcato
@ 2026-03-13 16:11         ` Josh Law
  0 siblings, 0 replies; 11+ messages in thread
From: Josh Law @ 2026-03-13 16:11 UTC (permalink / raw)
  To: Pedro Falcato
  Cc: Andrew Morton, Liam R . Howlett, Alice Ryhl, Andrew Ballance,
	Josh Law, maple-tree, linux-mm, linux-kernel

13 Mar 2026 09:05:37 Pedro Falcato <pfalcato@suse.de>:

> On Fri, Mar 13, 2026 at 07:17:17AM +0000, Josh Law wrote:
>> 12 Mar 2026 23:22:48 Pedro Falcato <pfalcato@suse.de>:
>>
>>> On Thu, Mar 12, 2026 at 01:45:31PM -0700, Andrew Morton wrote:
>>>> On Thu, 12 Mar 2026 18:40:53 +0000 Josh Law <hlcj1234567@gmail.com> wrote:
>>>>
>>>>> If kmem_cache_alloc_from_sheaf() returns NULL (possible under
>>>>> GFP_NOWAIT pressure), mas_pop_node() falls through to the out label
>>>>> and dereferences the NULL pointer in memset(ret, 0, sizeof(*ret)).
>>>>
>>>> This is such a glaring bug that I wonder if we're missing something.
>>>
>>> According to my local copy of lib/maple_tree.c:
>>>
>>> mas_pop_node() - Get a previously allocated maple node from the maple state.
>>>
>>> Note the "previously" :) kmem_cache_alloc_from_sheaf() can only fail if you
>>> run out of objects in the sheaf.
>>>
>>> So yeah, this "bug" looks bogus.
>>>
>>> --
>>> Pedro
>>
>> Hi Pedro,
>>
>> I see the comment regarding 'previously allocated' nodes. However,
>> mas_pop_node() explicitly calls kmem_cache_alloc_from_sheaf() with
>> GFP_NOWAIT. If there is any path—even an unexpected one—where the
>> sheaf is exhausted or the allocator fails, the code immediately
>> performs a memset on the NULL pointer.
>
> And? This does not happen, simply. If it does, your maple tree is hosed
> and, really, you're not recovering from it.
>
>>
>> Even if this is a 'should never happen' scenario, returning NULL is
>> safer than a kernel panic. As Andrew noted, the current structure
>> allows a fall-through directly into a dereference. My patch ensures
>> we handle that edge case safely.
>
> ... and now because none of the mas_pop_node() callers ever checks for NULL
> (why would they, they preallocated those same nodes before), you safely
> dereference NULL away from mas_pop_node!.
>
> --
> Pedro

Hi Pedro,

I see your point regarding the invariants of the sheaf. If the
pre-allocation logic is guaranteed, then a NULL return here implies
a fundamental corruption of the maple state.

My concern was primarily the 'fall-through' structure which makes the
dereference look accidental rather than intentional. However, if
the callers aren't prepared to handle a NULL return anyway, simply
returning NULL doesn't solve the underlying panic.

I'll take this as a lesson in understanding function invariants
before jumping to defensive checks. Thanks for the technical
explanation.


V/R

Josh law

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

end of thread, other threads:[~2026-03-13 16:11 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-12 18:40 [PATCH 1/3] lib/maple_tree: fix potential NULL dereference in mas_pop_node() Josh Law
2026-03-12 18:40 ` [PATCH 2/3] lib/maple_tree: fix always-true condition in mas_erase() Josh Law
2026-03-12 20:45 ` [PATCH 1/3] lib/maple_tree: fix potential NULL dereference in mas_pop_node() Andrew Morton
2026-03-12 20:49   ` Josh Law
2026-03-12 20:56     ` Josh Law
2026-03-12 21:14       ` Josh Law
2026-03-12 23:00     ` Alice Ryhl
2026-03-12 23:22   ` Pedro Falcato
2026-03-13  7:17     ` Josh Law
2026-03-13  9:05       ` Pedro Falcato
2026-03-13 16:11         ` Josh Law

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox