linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] fuse: prevent possible NULL pointer dereference in fuse_iomap_writeback_{range,submit}()
@ 2025-09-03  8:34 Luis Henriques
  2025-09-03 17:03 ` Joanne Koong
  0 siblings, 1 reply; 8+ messages in thread
From: Luis Henriques @ 2025-09-03  8:34 UTC (permalink / raw)
  To: Miklos Szeredi, Joanne Koong
  Cc: linux-fsdevel, linux-kernel, kernel-dev, Luis Henriques

These two functions make use of the WARN_ON_ONCE() macro to help debugging
a NULL wpc->wb_ctx.  However, this doesn't prevent the possibility of NULL
pointer dereferences in the code.  This patch adds some extra defensive
checks to avoid these NULL pointer accesses.

Fixes: ef7e7cbb323f ("fuse: use iomap for writeback")
Signed-off-by: Luis Henriques <luis@igalia.com>
---
Hi!

This v2 results from Joanne's inputs -- I now believe that it is better to
keep the WARN_ON_ONCE() macros, but it's still good to try to minimise
the undesirable effects of a NULL wpc->wb_ctx.

I've also added the 'Fixes:' tag to the commit message.

 fs/fuse/file.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index 5525a4520b0f..990c287bc3e3 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -2135,14 +2135,18 @@ static ssize_t fuse_iomap_writeback_range(struct iomap_writepage_ctx *wpc,
 					  unsigned len, u64 end_pos)
 {
 	struct fuse_fill_wb_data *data = wpc->wb_ctx;
-	struct fuse_writepage_args *wpa = data->wpa;
-	struct fuse_args_pages *ap = &wpa->ia.ap;
+	struct fuse_writepage_args *wpa;
+	struct fuse_args_pages *ap;
 	struct inode *inode = wpc->inode;
 	struct fuse_inode *fi = get_fuse_inode(inode);
 	struct fuse_conn *fc = get_fuse_conn(inode);
 	loff_t offset = offset_in_folio(folio, pos);
 
-	WARN_ON_ONCE(!data);
+	if (WARN_ON_ONCE(!data))
+		return -EIO;
+
+	wpa = data->wpa;
+	ap = &wpa->ia.ap;
 
 	if (!data->ff) {
 		data->ff = fuse_write_file_get(fi);
@@ -2182,7 +2186,8 @@ static int fuse_iomap_writeback_submit(struct iomap_writepage_ctx *wpc,
 {
 	struct fuse_fill_wb_data *data = wpc->wb_ctx;
 
-	WARN_ON_ONCE(!data);
+	if (WARN_ON_ONCE(!data))
+		return error ? error : -EIO;
 
 	if (data->wpa) {
 		WARN_ON(!data->wpa->ia.ap.num_folios);

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

* Re: [PATCH v2] fuse: prevent possible NULL pointer dereference in fuse_iomap_writeback_{range,submit}()
  2025-09-03  8:34 [PATCH v2] fuse: prevent possible NULL pointer dereference in fuse_iomap_writeback_{range,submit}() Luis Henriques
@ 2025-09-03 17:03 ` Joanne Koong
  2025-09-03 20:08   ` Luis Henriques
  0 siblings, 1 reply; 8+ messages in thread
From: Joanne Koong @ 2025-09-03 17:03 UTC (permalink / raw)
  To: Luis Henriques; +Cc: Miklos Szeredi, linux-fsdevel, linux-kernel, kernel-dev

On Wed, Sep 3, 2025 at 1:35 AM Luis Henriques <luis@igalia.com> wrote:
>
> These two functions make use of the WARN_ON_ONCE() macro to help debugging
> a NULL wpc->wb_ctx.  However, this doesn't prevent the possibility of NULL
> pointer dereferences in the code.  This patch adds some extra defensive
> checks to avoid these NULL pointer accesses.
>
> Fixes: ef7e7cbb323f ("fuse: use iomap for writeback")
> Signed-off-by: Luis Henriques <luis@igalia.com>
> ---
> Hi!
>
> This v2 results from Joanne's inputs -- I now believe that it is better to
> keep the WARN_ON_ONCE() macros, but it's still good to try to minimise
> the undesirable effects of a NULL wpc->wb_ctx.
>
> I've also added the 'Fixes:' tag to the commit message.
>
>  fs/fuse/file.c | 13 +++++++++----
>  1 file changed, 9 insertions(+), 4 deletions(-)
>
> diff --git a/fs/fuse/file.c b/fs/fuse/file.c
> index 5525a4520b0f..990c287bc3e3 100644
> --- a/fs/fuse/file.c
> +++ b/fs/fuse/file.c
> @@ -2135,14 +2135,18 @@ static ssize_t fuse_iomap_writeback_range(struct iomap_writepage_ctx *wpc,
>                                           unsigned len, u64 end_pos)
>  {
>         struct fuse_fill_wb_data *data = wpc->wb_ctx;
> -       struct fuse_writepage_args *wpa = data->wpa;
> -       struct fuse_args_pages *ap = &wpa->ia.ap;
> +       struct fuse_writepage_args *wpa;
> +       struct fuse_args_pages *ap;
>         struct inode *inode = wpc->inode;
>         struct fuse_inode *fi = get_fuse_inode(inode);
>         struct fuse_conn *fc = get_fuse_conn(inode);
>         loff_t offset = offset_in_folio(folio, pos);
>
> -       WARN_ON_ONCE(!data);
> +       if (WARN_ON_ONCE(!data))
> +               return -EIO;

imo this WARN_ON_ONCE (and the one below) should be left as is instead
of embedded in the "if" construct. The data pointer passed in is set
by fuse and as such, we're able to reasonably guarantee that data is a
valid pointer. Looking at other examples of WARN_ON in the fuse
codebase, the places where an "if" construct is used are for cases
where the assumptions that are made are more delicate (eg folio
mapping state, in fuse_try_move_folio()) and less clearly obvious. I
think this WARN_ON_ONCE here and below should be left as is.


Thanks,
Joanne

> +
> +       wpa = data->wpa;
> +       ap = &wpa->ia.ap;
>
>         if (!data->ff) {
>                 data->ff = fuse_write_file_get(fi);
> @@ -2182,7 +2186,8 @@ static int fuse_iomap_writeback_submit(struct iomap_writepage_ctx *wpc,
>  {
>         struct fuse_fill_wb_data *data = wpc->wb_ctx;
>
> -       WARN_ON_ONCE(!data);
> +       if (WARN_ON_ONCE(!data))
> +               return error ? error : -EIO;
>
>         if (data->wpa) {
>                 WARN_ON(!data->wpa->ia.ap.num_folios);

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

* Re: [PATCH v2] fuse: prevent possible NULL pointer dereference in fuse_iomap_writeback_{range,submit}()
  2025-09-03 17:03 ` Joanne Koong
@ 2025-09-03 20:08   ` Luis Henriques
  2025-09-03 20:48     ` Darrick J. Wong
  0 siblings, 1 reply; 8+ messages in thread
From: Luis Henriques @ 2025-09-03 20:08 UTC (permalink / raw)
  To: Joanne Koong; +Cc: Miklos Szeredi, linux-fsdevel, linux-kernel, kernel-dev

On Wed, Sep 03 2025, Joanne Koong wrote:

> On Wed, Sep 3, 2025 at 1:35 AM Luis Henriques <luis@igalia.com> wrote:
>>
>> These two functions make use of the WARN_ON_ONCE() macro to help debugging
>> a NULL wpc->wb_ctx.  However, this doesn't prevent the possibility of NULL
>> pointer dereferences in the code.  This patch adds some extra defensive
>> checks to avoid these NULL pointer accesses.
>>
>> Fixes: ef7e7cbb323f ("fuse: use iomap for writeback")
>> Signed-off-by: Luis Henriques <luis@igalia.com>
>> ---
>> Hi!
>>
>> This v2 results from Joanne's inputs -- I now believe that it is better to
>> keep the WARN_ON_ONCE() macros, but it's still good to try to minimise
>> the undesirable effects of a NULL wpc->wb_ctx.
>>
>> I've also added the 'Fixes:' tag to the commit message.
>>
>>  fs/fuse/file.c | 13 +++++++++----
>>  1 file changed, 9 insertions(+), 4 deletions(-)
>>
>> diff --git a/fs/fuse/file.c b/fs/fuse/file.c
>> index 5525a4520b0f..990c287bc3e3 100644
>> --- a/fs/fuse/file.c
>> +++ b/fs/fuse/file.c
>> @@ -2135,14 +2135,18 @@ static ssize_t fuse_iomap_writeback_range(struct iomap_writepage_ctx *wpc,
>>                                           unsigned len, u64 end_pos)
>>  {
>>         struct fuse_fill_wb_data *data = wpc->wb_ctx;
>> -       struct fuse_writepage_args *wpa = data->wpa;
>> -       struct fuse_args_pages *ap = &wpa->ia.ap;
>> +       struct fuse_writepage_args *wpa;
>> +       struct fuse_args_pages *ap;
>>         struct inode *inode = wpc->inode;
>>         struct fuse_inode *fi = get_fuse_inode(inode);
>>         struct fuse_conn *fc = get_fuse_conn(inode);
>>         loff_t offset = offset_in_folio(folio, pos);
>>
>> -       WARN_ON_ONCE(!data);
>> +       if (WARN_ON_ONCE(!data))
>> +               return -EIO;
>
> imo this WARN_ON_ONCE (and the one below) should be left as is instead
> of embedded in the "if" construct. The data pointer passed in is set
> by fuse and as such, we're able to reasonably guarantee that data is a
> valid pointer. Looking at other examples of WARN_ON in the fuse
> codebase, the places where an "if" construct is used are for cases
> where the assumptions that are made are more delicate (eg folio
> mapping state, in fuse_try_move_folio()) and less clearly obvious. I
> think this WARN_ON_ONCE here and below should be left as is.

OK, thank you for your feedback, Joanne.  So, if Miklos agrees with that,
I guess we can drop this patch.

Cheers,
-- 
Luís

>
>
> Thanks,
> Joanne
>
>> +
>> +       wpa = data->wpa;
>> +       ap = &wpa->ia.ap;
>>
>>         if (!data->ff) {
>>                 data->ff = fuse_write_file_get(fi);
>> @@ -2182,7 +2186,8 @@ static int fuse_iomap_writeback_submit(struct iomap_writepage_ctx *wpc,
>>  {
>>         struct fuse_fill_wb_data *data = wpc->wb_ctx;
>>
>> -       WARN_ON_ONCE(!data);
>> +       if (WARN_ON_ONCE(!data))
>> +               return error ? error : -EIO;
>>
>>         if (data->wpa) {
>>                 WARN_ON(!data->wpa->ia.ap.num_folios);


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

* Re: [PATCH v2] fuse: prevent possible NULL pointer dereference in fuse_iomap_writeback_{range,submit}()
  2025-09-03 20:08   ` Luis Henriques
@ 2025-09-03 20:48     ` Darrick J. Wong
  2025-09-03 22:32       ` Joanne Koong
  0 siblings, 1 reply; 8+ messages in thread
From: Darrick J. Wong @ 2025-09-03 20:48 UTC (permalink / raw)
  To: Luis Henriques
  Cc: Joanne Koong, Miklos Szeredi, linux-fsdevel, linux-kernel,
	kernel-dev

On Wed, Sep 03, 2025 at 09:08:12PM +0100, Luis Henriques wrote:
> On Wed, Sep 03 2025, Joanne Koong wrote:
> 
> > On Wed, Sep 3, 2025 at 1:35 AM Luis Henriques <luis@igalia.com> wrote:
> >>
> >> These two functions make use of the WARN_ON_ONCE() macro to help debugging
> >> a NULL wpc->wb_ctx.  However, this doesn't prevent the possibility of NULL
> >> pointer dereferences in the code.  This patch adds some extra defensive
> >> checks to avoid these NULL pointer accesses.
> >>
> >> Fixes: ef7e7cbb323f ("fuse: use iomap for writeback")
> >> Signed-off-by: Luis Henriques <luis@igalia.com>
> >> ---
> >> Hi!
> >>
> >> This v2 results from Joanne's inputs -- I now believe that it is better to
> >> keep the WARN_ON_ONCE() macros, but it's still good to try to minimise
> >> the undesirable effects of a NULL wpc->wb_ctx.
> >>
> >> I've also added the 'Fixes:' tag to the commit message.
> >>
> >>  fs/fuse/file.c | 13 +++++++++----
> >>  1 file changed, 9 insertions(+), 4 deletions(-)
> >>
> >> diff --git a/fs/fuse/file.c b/fs/fuse/file.c
> >> index 5525a4520b0f..990c287bc3e3 100644
> >> --- a/fs/fuse/file.c
> >> +++ b/fs/fuse/file.c
> >> @@ -2135,14 +2135,18 @@ static ssize_t fuse_iomap_writeback_range(struct iomap_writepage_ctx *wpc,
> >>                                           unsigned len, u64 end_pos)
> >>  {
> >>         struct fuse_fill_wb_data *data = wpc->wb_ctx;
> >> -       struct fuse_writepage_args *wpa = data->wpa;
> >> -       struct fuse_args_pages *ap = &wpa->ia.ap;
> >> +       struct fuse_writepage_args *wpa;
> >> +       struct fuse_args_pages *ap;
> >>         struct inode *inode = wpc->inode;
> >>         struct fuse_inode *fi = get_fuse_inode(inode);
> >>         struct fuse_conn *fc = get_fuse_conn(inode);
> >>         loff_t offset = offset_in_folio(folio, pos);
> >>
> >> -       WARN_ON_ONCE(!data);
> >> +       if (WARN_ON_ONCE(!data))
> >> +               return -EIO;
> >
> > imo this WARN_ON_ONCE (and the one below) should be left as is instead
> > of embedded in the "if" construct. The data pointer passed in is set
> > by fuse and as such, we're able to reasonably guarantee that data is a
> > valid pointer. Looking at other examples of WARN_ON in the fuse
> > codebase, the places where an "if" construct is used are for cases
> > where the assumptions that are made are more delicate (eg folio
> > mapping state, in fuse_try_move_folio()) and less clearly obvious. I
> > think this WARN_ON_ONCE here and below should be left as is.
> 
> OK, thank you for your feedback, Joanne.  So, if Miklos agrees with that,
> I guess we can drop this patch.

AFAICT, this function can only be called by other iomap-using functions
in file.c, and those other functions always set
iomap_writepage_ctx::wb_ctx so I /think/ the assertions aren't necessary
at all...

> Cheers,
> -- 
> Luís
> 
> >
> >
> > Thanks,
> > Joanne
> >
> >> +
> >> +       wpa = data->wpa;
> >> +       ap = &wpa->ia.ap;
> >>
> >>         if (!data->ff) {

...because if someone fails to set wpc->wb_ctx, this line will crash the
kernel at least as much as the WARN_ON would.  IOWs, the WARN_ONs aren't
necessary but I don't think they hurt much.

You could introduce a CONFIG_FUSE_DEBUG option and hide some assertions
and whatnot behind it, ala CONFIG_FUSE_IOMAP_DEBUG*:

https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/tree/fs/fuse/iomap_priv.h?h=djwong-wtf&id=170269a48ae83ea7ce1e23ea5ff39995600efff0

--D

> >>                 data->ff = fuse_write_file_get(fi);
> >> @@ -2182,7 +2186,8 @@ static int fuse_iomap_writeback_submit(struct iomap_writepage_ctx *wpc,
> >>  {
> >>         struct fuse_fill_wb_data *data = wpc->wb_ctx;
> >>
> >> -       WARN_ON_ONCE(!data);
> >> +       if (WARN_ON_ONCE(!data))
> >> +               return error ? error : -EIO;
> >>
> >>         if (data->wpa) {
> >>                 WARN_ON(!data->wpa->ia.ap.num_folios);
> 
> 

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

* Re: [PATCH v2] fuse: prevent possible NULL pointer dereference in fuse_iomap_writeback_{range,submit}()
  2025-09-03 20:48     ` Darrick J. Wong
@ 2025-09-03 22:32       ` Joanne Koong
  2025-09-04  2:46         ` Darrick J. Wong
  2025-09-04  8:24         ` Luis Henriques
  0 siblings, 2 replies; 8+ messages in thread
From: Joanne Koong @ 2025-09-03 22:32 UTC (permalink / raw)
  To: Darrick J. Wong
  Cc: Luis Henriques, Miklos Szeredi, linux-fsdevel, linux-kernel,
	kernel-dev

On Wed, Sep 3, 2025 at 1:48 PM Darrick J. Wong <djwong@kernel.org> wrote:
>
> On Wed, Sep 03, 2025 at 09:08:12PM +0100, Luis Henriques wrote:
> > On Wed, Sep 03 2025, Joanne Koong wrote:
> >
> > > On Wed, Sep 3, 2025 at 1:35 AM Luis Henriques <luis@igalia.com> wrote:
> > >>
> > >> These two functions make use of the WARN_ON_ONCE() macro to help debugging
> > >> a NULL wpc->wb_ctx.  However, this doesn't prevent the possibility of NULL
> > >> pointer dereferences in the code.  This patch adds some extra defensive
> > >> checks to avoid these NULL pointer accesses.
> > >>
> > >> Fixes: ef7e7cbb323f ("fuse: use iomap for writeback")
> > >> Signed-off-by: Luis Henriques <luis@igalia.com>
> > >> ---
> > >> Hi!
> > >>
> > >> This v2 results from Joanne's inputs -- I now believe that it is better to
> > >> keep the WARN_ON_ONCE() macros, but it's still good to try to minimise
> > >> the undesirable effects of a NULL wpc->wb_ctx.
> > >>
> > >> I've also added the 'Fixes:' tag to the commit message.
> > >>
> > >>  fs/fuse/file.c | 13 +++++++++----
> > >>  1 file changed, 9 insertions(+), 4 deletions(-)
> > >>
> > >> diff --git a/fs/fuse/file.c b/fs/fuse/file.c
> > >> index 5525a4520b0f..990c287bc3e3 100644
> > >> --- a/fs/fuse/file.c
> > >> +++ b/fs/fuse/file.c
> > >> @@ -2135,14 +2135,18 @@ static ssize_t fuse_iomap_writeback_range(struct iomap_writepage_ctx *wpc,
> > >>                                           unsigned len, u64 end_pos)
> > >>  {
> > >>         struct fuse_fill_wb_data *data = wpc->wb_ctx;
> > >> -       struct fuse_writepage_args *wpa = data->wpa;
> > >> -       struct fuse_args_pages *ap = &wpa->ia.ap;
> > >> +       struct fuse_writepage_args *wpa;
> > >> +       struct fuse_args_pages *ap;
> > >>         struct inode *inode = wpc->inode;
> > >>         struct fuse_inode *fi = get_fuse_inode(inode);
> > >>         struct fuse_conn *fc = get_fuse_conn(inode);
> > >>         loff_t offset = offset_in_folio(folio, pos);
> > >>
> > >> -       WARN_ON_ONCE(!data);
> > >> +       if (WARN_ON_ONCE(!data))
> > >> +               return -EIO;
> > >
> > > imo this WARN_ON_ONCE (and the one below) should be left as is instead
> > > of embedded in the "if" construct. The data pointer passed in is set
> > > by fuse and as such, we're able to reasonably guarantee that data is a
> > > valid pointer. Looking at other examples of WARN_ON in the fuse
> > > codebase, the places where an "if" construct is used are for cases
> > > where the assumptions that are made are more delicate (eg folio
> > > mapping state, in fuse_try_move_folio()) and less clearly obvious. I
> > > think this WARN_ON_ONCE here and below should be left as is.
> >
> > OK, thank you for your feedback, Joanne.  So, if Miklos agrees with that,
> > I guess we can drop this patch.

I think having the two lines "wpa = data->wpa;" and "ap = &wpa->ia.ap"
moved to below the "WARN_ON_ONCE(!data);" would still be useful

>
> AFAICT, this function can only be called by other iomap-using functions
> in file.c, and those other functions always set
> iomap_writepage_ctx::wb_ctx so I /think/ the assertions aren't necessary
> at all...
>
> > Cheers,
> > --
> > Luís
> >
> > >
> > >
> > > Thanks,
> > > Joanne
> > >
> > >> +
> > >> +       wpa = data->wpa;
> > >> +       ap = &wpa->ia.ap;
> > >>
> > >>         if (!data->ff) {
>
> ...because if someone fails to set wpc->wb_ctx, this line will crash the
> kernel at least as much as the WARN_ON would.  IOWs, the WARN_ONs aren't
> necessary but I don't think they hurt much.
>

Oh, I see. Actually, this explanation makes a lot of sense. When I was
looking at the other WARN_ON usages in fuse, I noticed they were also
used even if it's logically proven that the code path can never be
triggered. But I guess what you're saying is that WARN_ONs in general
should be used if it's otherwise somehow undetectable / non-obvious
that the condition is violated? That makes sense to me, and checks out
with the other fuse WARN_ON uses.

I'm fine with just removing the WARN_ON(!data) here and below. I think
I added some more WARN_ONs in my other fuse iomap patchset, so I'll
remove those as well when I send out a new version.

> You could introduce a CONFIG_FUSE_DEBUG option and hide some assertions
> and whatnot behind it, ala CONFIG_FUSE_IOMAP_DEBUG*:
>
> https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/tree/fs/fuse/iomap_priv.h?h=djwong-wtf&id=170269a48ae83ea7ce1e23ea5ff39995600efff0
>

In that case, personally I'd much prefer removing the WARN_ONs here
than having a new config for it.

Thanks,
Joanne

> --D
>
> > >>                 data->ff = fuse_write_file_get(fi);
> > >> @@ -2182,7 +2186,8 @@ static int fuse_iomap_writeback_submit(struct iomap_writepage_ctx *wpc,
> > >>  {
> > >>         struct fuse_fill_wb_data *data = wpc->wb_ctx;
> > >>
> > >> -       WARN_ON_ONCE(!data);
> > >> +       if (WARN_ON_ONCE(!data))
> > >> +               return error ? error : -EIO;
> > >>
> > >>         if (data->wpa) {
> > >>                 WARN_ON(!data->wpa->ia.ap.num_folios);
> >
> >

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

* Re: [PATCH v2] fuse: prevent possible NULL pointer dereference in fuse_iomap_writeback_{range,submit}()
  2025-09-03 22:32       ` Joanne Koong
@ 2025-09-04  2:46         ` Darrick J. Wong
  2025-09-04  8:24         ` Luis Henriques
  1 sibling, 0 replies; 8+ messages in thread
From: Darrick J. Wong @ 2025-09-04  2:46 UTC (permalink / raw)
  To: Joanne Koong
  Cc: Luis Henriques, Miklos Szeredi, linux-fsdevel, linux-kernel,
	kernel-dev

On Wed, Sep 03, 2025 at 03:32:40PM -0700, Joanne Koong wrote:
> On Wed, Sep 3, 2025 at 1:48 PM Darrick J. Wong <djwong@kernel.org> wrote:
> >
> > On Wed, Sep 03, 2025 at 09:08:12PM +0100, Luis Henriques wrote:
> > > On Wed, Sep 03 2025, Joanne Koong wrote:
> > >
> > > > On Wed, Sep 3, 2025 at 1:35 AM Luis Henriques <luis@igalia.com> wrote:
> > > >>
> > > >> These two functions make use of the WARN_ON_ONCE() macro to help debugging
> > > >> a NULL wpc->wb_ctx.  However, this doesn't prevent the possibility of NULL
> > > >> pointer dereferences in the code.  This patch adds some extra defensive
> > > >> checks to avoid these NULL pointer accesses.
> > > >>
> > > >> Fixes: ef7e7cbb323f ("fuse: use iomap for writeback")
> > > >> Signed-off-by: Luis Henriques <luis@igalia.com>
> > > >> ---
> > > >> Hi!
> > > >>
> > > >> This v2 results from Joanne's inputs -- I now believe that it is better to
> > > >> keep the WARN_ON_ONCE() macros, but it's still good to try to minimise
> > > >> the undesirable effects of a NULL wpc->wb_ctx.
> > > >>
> > > >> I've also added the 'Fixes:' tag to the commit message.
> > > >>
> > > >>  fs/fuse/file.c | 13 +++++++++----
> > > >>  1 file changed, 9 insertions(+), 4 deletions(-)
> > > >>
> > > >> diff --git a/fs/fuse/file.c b/fs/fuse/file.c
> > > >> index 5525a4520b0f..990c287bc3e3 100644
> > > >> --- a/fs/fuse/file.c
> > > >> +++ b/fs/fuse/file.c
> > > >> @@ -2135,14 +2135,18 @@ static ssize_t fuse_iomap_writeback_range(struct iomap_writepage_ctx *wpc,
> > > >>                                           unsigned len, u64 end_pos)
> > > >>  {
> > > >>         struct fuse_fill_wb_data *data = wpc->wb_ctx;
> > > >> -       struct fuse_writepage_args *wpa = data->wpa;
> > > >> -       struct fuse_args_pages *ap = &wpa->ia.ap;
> > > >> +       struct fuse_writepage_args *wpa;
> > > >> +       struct fuse_args_pages *ap;
> > > >>         struct inode *inode = wpc->inode;
> > > >>         struct fuse_inode *fi = get_fuse_inode(inode);
> > > >>         struct fuse_conn *fc = get_fuse_conn(inode);
> > > >>         loff_t offset = offset_in_folio(folio, pos);
> > > >>
> > > >> -       WARN_ON_ONCE(!data);
> > > >> +       if (WARN_ON_ONCE(!data))
> > > >> +               return -EIO;
> > > >
> > > > imo this WARN_ON_ONCE (and the one below) should be left as is instead
> > > > of embedded in the "if" construct. The data pointer passed in is set
> > > > by fuse and as such, we're able to reasonably guarantee that data is a
> > > > valid pointer. Looking at other examples of WARN_ON in the fuse
> > > > codebase, the places where an "if" construct is used are for cases
> > > > where the assumptions that are made are more delicate (eg folio
> > > > mapping state, in fuse_try_move_folio()) and less clearly obvious. I
> > > > think this WARN_ON_ONCE here and below should be left as is.
> > >
> > > OK, thank you for your feedback, Joanne.  So, if Miklos agrees with that,
> > > I guess we can drop this patch.
> 
> I think having the two lines "wpa = data->wpa;" and "ap = &wpa->ia.ap"
> moved to below the "WARN_ON_ONCE(!data);" would still be useful

<shrug> Compilers are magic, they can rearrange the function unless you
explicitly put in barriers or data dependencies to prevent that. 8-)

> >
> > AFAICT, this function can only be called by other iomap-using functions
> > in file.c, and those other functions always set
> > iomap_writepage_ctx::wb_ctx so I /think/ the assertions aren't necessary
> > at all...
> >
> > > Cheers,
> > > --
> > > Luís
> > >
> > > >
> > > >
> > > > Thanks,
> > > > Joanne
> > > >
> > > >> +
> > > >> +       wpa = data->wpa;
> > > >> +       ap = &wpa->ia.ap;
> > > >>
> > > >>         if (!data->ff) {
> >
> > ...because if someone fails to set wpc->wb_ctx, this line will crash the
> > kernel at least as much as the WARN_ON would.  IOWs, the WARN_ONs aren't
> > necessary but I don't think they hurt much.
> >
> 
> Oh, I see. Actually, this explanation makes a lot of sense. When I was
> looking at the other WARN_ON usages in fuse, I noticed they were also
> used even if it's logically proven that the code path can never be
> triggered. But I guess what you're saying is that WARN_ONs in general
> should be used if it's otherwise somehow undetectable / non-obvious
> that the condition is violated? That makes sense to me, and checks out
> with the other fuse WARN_ON uses.
> 
> I'm fine with just removing the WARN_ON(!data) here and below. I think
> I added some more WARN_ONs in my other fuse iomap patchset, so I'll
> remove those as well when I send out a new version.

<nod>

> > You could introduce a CONFIG_FUSE_DEBUG option and hide some assertions
> > and whatnot behind it, ala CONFIG_FUSE_IOMAP_DEBUG*:
> >
> > https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/tree/fs/fuse/iomap_priv.h?h=djwong-wtf&id=170269a48ae83ea7ce1e23ea5ff39995600efff0
> >
> 
> In that case, personally I'd much prefer removing the WARN_ONs here
> than having a new config for it.

<nod> I added it to mine because there are a lot of things that iomap
/can/ get cranky about, so it's useful to have a "BAD_DATA" macro that
screams when the fuse server feeds garbage to the kernel.

--D

> Thanks,
> Joanne
> 
> > --D
> >
> > > >>                 data->ff = fuse_write_file_get(fi);
> > > >> @@ -2182,7 +2186,8 @@ static int fuse_iomap_writeback_submit(struct iomap_writepage_ctx *wpc,
> > > >>  {
> > > >>         struct fuse_fill_wb_data *data = wpc->wb_ctx;
> > > >>
> > > >> -       WARN_ON_ONCE(!data);
> > > >> +       if (WARN_ON_ONCE(!data))
> > > >> +               return error ? error : -EIO;
> > > >>
> > > >>         if (data->wpa) {
> > > >>                 WARN_ON(!data->wpa->ia.ap.num_folios);
> > >
> > >

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

* Re: [PATCH v2] fuse: prevent possible NULL pointer dereference in fuse_iomap_writeback_{range,submit}()
  2025-09-03 22:32       ` Joanne Koong
  2025-09-04  2:46         ` Darrick J. Wong
@ 2025-09-04  8:24         ` Luis Henriques
  2025-09-04  8:40           ` Miklos Szeredi
  1 sibling, 1 reply; 8+ messages in thread
From: Luis Henriques @ 2025-09-04  8:24 UTC (permalink / raw)
  To: Joanne Koong
  Cc: Darrick J. Wong, Miklos Szeredi, linux-fsdevel, linux-kernel,
	kernel-dev


On Wed, Sep 03 2025, Joanne Koong wrote:

> On Wed, Sep 3, 2025 at 1:48 PM Darrick J. Wong <djwong@kernel.org> wrote:

>> ...because if someone fails to set wpc->wb_ctx, this line will crash the
>> kernel at least as much as the WARN_ON would.  IOWs, the WARN_ONs aren't
>> necessary but I don't think they hurt much.
>>
>
> Oh, I see. Actually, this explanation makes a lot of sense. When I was
> looking at the other WARN_ON usages in fuse, I noticed they were also
> used even if it's logically proven that the code path can never be
> triggered. But I guess what you're saying is that WARN_ONs in general
> should be used if it's otherwise somehow undetectable / non-obvious
> that the condition is violated? That makes sense to me, and checks out
> with the other fuse WARN_ON uses.
>
> I'm fine with just removing the WARN_ON(!data) here and below. I think
> I added some more WARN_ONs in my other fuse iomap patchset, so I'll
> remove those as well when I send out a new version.

I don't have a preference between v1 and v2 of this patch.  v1 removed the
WARNs because I don't think they are useful:

1. the assertions are never true, but
2. if they are, they are useless because we'll hit a NULL pointer
   dereference anyway.

v2 tries to fix the code assuming the assertions can be triggered.

So, yeah I'll just leave the 3 options (v1, v2, or do nothing) on the
table :-)

Cheers,
-- 
Luís

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

* Re: [PATCH v2] fuse: prevent possible NULL pointer dereference in fuse_iomap_writeback_{range,submit}()
  2025-09-04  8:24         ` Luis Henriques
@ 2025-09-04  8:40           ` Miklos Szeredi
  0 siblings, 0 replies; 8+ messages in thread
From: Miklos Szeredi @ 2025-09-04  8:40 UTC (permalink / raw)
  To: Luis Henriques
  Cc: Joanne Koong, Darrick J. Wong, linux-fsdevel, linux-kernel,
	kernel-dev

On Thu, 4 Sept 2025 at 10:24, Luis Henriques <luis@igalia.com> wrote:

> I don't have a preference between v1 and v2 of this patch.  v1 removed the
> WARNs because I don't think they are useful:
>
> 1. the assertions are never true, but
> 2. if they are, they are useless because we'll hit a NULL pointer
>    dereference anyway.
>
> v2 tries to fix the code assuming the assertions can be triggered.
>
> So, yeah I'll just leave the 3 options (v1, v2, or do nothing) on the
> table :-)

WARN_ON is a useful tool to document interface constrains.  But so is
dereferencing of a pointer.

V2 style WARN_ON should only be used if it's difficult to prove that
the condition will evaluate to false and we don't want the kernel to
crash in some unknown corner case.  AFAICS it is not the case here, so
I'd opt for v1.

Thanks,
Miklos

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

end of thread, other threads:[~2025-09-04  8:48 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-03  8:34 [PATCH v2] fuse: prevent possible NULL pointer dereference in fuse_iomap_writeback_{range,submit}() Luis Henriques
2025-09-03 17:03 ` Joanne Koong
2025-09-03 20:08   ` Luis Henriques
2025-09-03 20:48     ` Darrick J. Wong
2025-09-03 22:32       ` Joanne Koong
2025-09-04  2:46         ` Darrick J. Wong
2025-09-04  8:24         ` Luis Henriques
2025-09-04  8:40           ` Miklos Szeredi

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).