All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] dnotify: Fix ENOMEM handling
@ 2017-10-31  9:33 Jan Kara
  2017-10-31  9:33 ` [PATCH 1/2] dnotify: Handle errors from fsnotify_add_mark_locked() in fcntl_dirnotify() Jan Kara
  2017-10-31  9:33 ` [PATCH 2/2] fsnotify: Protect bail out path of fsnotify_add_mark_locked() properly Jan Kara
  0 siblings, 2 replies; 12+ messages in thread
From: Jan Kara @ 2017-10-31  9:33 UTC (permalink / raw)
  To: linux-fsdevel; +Cc: amir73il


Hello,

in response to syzkaller reported I plan to push following two fixes to
my tree. Review is welcome.

								Honza

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

* [PATCH 1/2] dnotify: Handle errors from fsnotify_add_mark_locked() in fcntl_dirnotify()
  2017-10-31  9:33 [PATCH 0/2] dnotify: Fix ENOMEM handling Jan Kara
@ 2017-10-31  9:33 ` Jan Kara
  2017-10-31 12:11   ` Amir Goldstein
  2017-10-31  9:33 ` [PATCH 2/2] fsnotify: Protect bail out path of fsnotify_add_mark_locked() properly Jan Kara
  1 sibling, 1 reply; 12+ messages in thread
From: Jan Kara @ 2017-10-31  9:33 UTC (permalink / raw)
  To: linux-fsdevel; +Cc: amir73il, Jan Kara

fsnotify_add_mark_locked() can fail (e.g. because of ENOMEM since commit
9dd813c15b2c "fsnotify: Move mark list head from object into dedicated
structure"). Handle this error properly in fcntl_dirnotify() as
otherwise we just hit BUG_ON(dn_mark->dn) in dnotify_free_mark().

Reported-by: syzkaller
Fixes: 9dd813c15b2c101168808d4f5941a29985758973
Signed-off-by: Jan Kara <jack@suse.cz>
---
 fs/notify/dnotify/dnotify.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/fs/notify/dnotify/dnotify.c b/fs/notify/dnotify/dnotify.c
index cba328315929..a50183bd0ab9 100644
--- a/fs/notify/dnotify/dnotify.c
+++ b/fs/notify/dnotify/dnotify.c
@@ -319,7 +319,9 @@ int fcntl_dirnotify(int fd, struct file *filp, unsigned long arg)
 		dn_mark = container_of(fsn_mark, struct dnotify_mark, fsn_mark);
 		spin_lock(&fsn_mark->lock);
 	} else {
-		fsnotify_add_mark_locked(new_fsn_mark, inode, NULL, 0);
+		error = fsnotify_add_mark_locked(new_fsn_mark, inode, NULL, 0);
+		if (error)
+			goto out_err;
 		spin_lock(&new_fsn_mark->lock);
 		fsn_mark = new_fsn_mark;
 		dn_mark = new_dn_mark;
@@ -345,6 +347,7 @@ int fcntl_dirnotify(int fd, struct file *filp, unsigned long arg)
 		 */
 		if (dn_mark == new_dn_mark)
 			destroy = 1;
+		error = 0;
 		goto out;
 	}
 
-- 
2.12.3

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

* [PATCH 2/2] fsnotify: Protect bail out path of fsnotify_add_mark_locked() properly
  2017-10-31  9:33 [PATCH 0/2] dnotify: Fix ENOMEM handling Jan Kara
  2017-10-31  9:33 ` [PATCH 1/2] dnotify: Handle errors from fsnotify_add_mark_locked() in fcntl_dirnotify() Jan Kara
@ 2017-10-31  9:33 ` Jan Kara
  2017-10-31 12:26   ` Amir Goldstein
  1 sibling, 1 reply; 12+ messages in thread
From: Jan Kara @ 2017-10-31  9:33 UTC (permalink / raw)
  To: linux-fsdevel; +Cc: amir73il, Jan Kara

When fsnotify_add_mark_locked() fails it cleans up the mark it was
adding. Since the mark is already visible in group's list, we should
protect update of mark->flags with mark->lock. I'm not aware of any real
issues this could cause (since we also hold group->mark_mutex) but
better be safe and obey locking rules properly.

Signed-off-by: Jan Kara <jack@suse.cz>
---
 fs/notify/mark.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/fs/notify/mark.c b/fs/notify/mark.c
index 9991f8826734..47a827975b58 100644
--- a/fs/notify/mark.c
+++ b/fs/notify/mark.c
@@ -599,9 +599,11 @@ int fsnotify_add_mark_locked(struct fsnotify_mark *mark, struct inode *inode,
 
 	return ret;
 err:
+	spin_lock(&mark->lock);
 	mark->flags &= ~(FSNOTIFY_MARK_FLAG_ALIVE |
 			 FSNOTIFY_MARK_FLAG_ATTACHED);
 	list_del_init(&mark->g_list);
+	spin_unlock(&mark->lock);
 	atomic_dec(&group->num_marks);
 
 	fsnotify_put_mark(mark);
-- 
2.12.3

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

* Re: [PATCH 1/2] dnotify: Handle errors from fsnotify_add_mark_locked() in fcntl_dirnotify()
  2017-10-31  9:33 ` [PATCH 1/2] dnotify: Handle errors from fsnotify_add_mark_locked() in fcntl_dirnotify() Jan Kara
@ 2017-10-31 12:11   ` Amir Goldstein
  2017-10-31 15:45     ` Jan Kara
  0 siblings, 1 reply; 12+ messages in thread
From: Amir Goldstein @ 2017-10-31 12:11 UTC (permalink / raw)
  To: Jan Kara; +Cc: linux-fsdevel

On Tue, Oct 31, 2017 at 11:33 AM, Jan Kara <jack@suse.cz> wrote:
> fsnotify_add_mark_locked() can fail (e.g. because of ENOMEM since commit
> 9dd813c15b2c "fsnotify: Move mark list head from object into dedicated
> structure").

Since we have the Fixes: tag, I rather have the regression commit only in Fixes:
tag (with the subject) and this description can start with:
"fsnotify_add_mark_locked() can fail, but we do not check its return value."

> Handle this error properly in fcntl_dirnotify() as
> otherwise we just hit BUG_ON(dn_mark->dn) in dnotify_free_mark().
>
> Reported-by: syzkaller
> Fixes: 9dd813c15b2c101168808d4f5941a29985758973

I think for some backport maintainers the "cc: stable # v4.12" tags
matters.

> Signed-off-by: Jan Kara <jack@suse.cz>
> ---
>  fs/notify/dnotify/dnotify.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/fs/notify/dnotify/dnotify.c b/fs/notify/dnotify/dnotify.c
> index cba328315929..a50183bd0ab9 100644
> --- a/fs/notify/dnotify/dnotify.c
> +++ b/fs/notify/dnotify/dnotify.c
> @@ -319,7 +319,9 @@ int fcntl_dirnotify(int fd, struct file *filp, unsigned long arg)
>                 dn_mark = container_of(fsn_mark, struct dnotify_mark, fsn_mark);
>                 spin_lock(&fsn_mark->lock);
>         } else {
> -               fsnotify_add_mark_locked(new_fsn_mark, inode, NULL, 0);
> +               error = fsnotify_add_mark_locked(new_fsn_mark, inode, NULL, 0);
> +               if (error)
> +                       goto out_err;

out_err is not unlocking dnotify_group->mark_mutex, and probably need to
put fsn_mark as well?

>                 spin_lock(&new_fsn_mark->lock);
>                 fsn_mark = new_fsn_mark;
>                 dn_mark = new_dn_mark;
> @@ -345,6 +347,7 @@ int fcntl_dirnotify(int fd, struct file *filp, unsigned long arg)
>                  */
>                 if (dn_mark == new_dn_mark)
>                         destroy = 1;
> +               error = 0;
>                 goto out;
>         }
>
> --
> 2.12.3
>

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

* Re: [PATCH 2/2] fsnotify: Protect bail out path of fsnotify_add_mark_locked() properly
  2017-10-31  9:33 ` [PATCH 2/2] fsnotify: Protect bail out path of fsnotify_add_mark_locked() properly Jan Kara
@ 2017-10-31 12:26   ` Amir Goldstein
  2017-10-31 12:50     ` Greg KH
  2017-10-31 16:10     ` Jan Kara
  0 siblings, 2 replies; 12+ messages in thread
From: Amir Goldstein @ 2017-10-31 12:26 UTC (permalink / raw)
  To: Jan Kara; +Cc: linux-fsdevel, Greg KH

On Tue, Oct 31, 2017 at 11:33 AM, Jan Kara <jack@suse.cz> wrote:
> When fsnotify_add_mark_locked() fails it cleans up the mark it was
> adding. Since the mark is already visible in group's list, we should
> protect update of mark->flags with mark->lock. I'm not aware of any real
> issues this could cause (since we also hold group->mark_mutex) but
> better be safe and obey locking rules properly.
>
> Signed-off-by: Jan Kara <jack@suse.cz>

Reviewed-by: Amir Goldstein <amir73il@gmail.com>

IMO, even though this does not fix a concrete bug, if it's worth
fixing in upstream, it's worth fixing in stable.
A future stable fix may either make this into a concrete bug
or just be harder to apply.

So I suggest to add the Fixes: and Cc: stable tags.

Greg,

Do you agree with this reasoning?


> ---
>  fs/notify/mark.c | 2 ++
>  1 file changed, 2 insertions(+)
>
> diff --git a/fs/notify/mark.c b/fs/notify/mark.c
> index 9991f8826734..47a827975b58 100644
> --- a/fs/notify/mark.c
> +++ b/fs/notify/mark.c
> @@ -599,9 +599,11 @@ int fsnotify_add_mark_locked(struct fsnotify_mark *mark, struct inode *inode,
>
>         return ret;
>  err:
> +       spin_lock(&mark->lock);
>         mark->flags &= ~(FSNOTIFY_MARK_FLAG_ALIVE |
>                          FSNOTIFY_MARK_FLAG_ATTACHED);
>         list_del_init(&mark->g_list);
> +       spin_unlock(&mark->lock);
>         atomic_dec(&group->num_marks);
>
>         fsnotify_put_mark(mark);
> --
> 2.12.3
>

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

* Re: [PATCH 2/2] fsnotify: Protect bail out path of fsnotify_add_mark_locked() properly
  2017-10-31 12:26   ` Amir Goldstein
@ 2017-10-31 12:50     ` Greg KH
  2017-10-31 12:57       ` Amir Goldstein
  2017-10-31 16:10     ` Jan Kara
  1 sibling, 1 reply; 12+ messages in thread
From: Greg KH @ 2017-10-31 12:50 UTC (permalink / raw)
  To: Amir Goldstein; +Cc: Jan Kara, linux-fsdevel

On Tue, Oct 31, 2017 at 02:26:35PM +0200, Amir Goldstein wrote:
> On Tue, Oct 31, 2017 at 11:33 AM, Jan Kara <jack@suse.cz> wrote:
> > When fsnotify_add_mark_locked() fails it cleans up the mark it was
> > adding. Since the mark is already visible in group's list, we should
> > protect update of mark->flags with mark->lock. I'm not aware of any real
> > issues this could cause (since we also hold group->mark_mutex) but
> > better be safe and obey locking rules properly.
> >
> > Signed-off-by: Jan Kara <jack@suse.cz>
> 
> Reviewed-by: Amir Goldstein <amir73il@gmail.com>
> 
> IMO, even though this does not fix a concrete bug, if it's worth
> fixing in upstream, it's worth fixing in stable.
> A future stable fix may either make this into a concrete bug
> or just be harder to apply.
> 
> So I suggest to add the Fixes: and Cc: stable tags.
> 
> Greg,
> 
> Do you agree with this reasoning?

If it doesn't fix an actual bug, how does that fit with the stable
kernel rules?

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

* Re: [PATCH 2/2] fsnotify: Protect bail out path of fsnotify_add_mark_locked() properly
  2017-10-31 12:50     ` Greg KH
@ 2017-10-31 12:57       ` Amir Goldstein
  2017-10-31 13:40         ` Greg KH
  0 siblings, 1 reply; 12+ messages in thread
From: Amir Goldstein @ 2017-10-31 12:57 UTC (permalink / raw)
  To: Greg KH; +Cc: Jan Kara, linux-fsdevel

On Tue, Oct 31, 2017 at 2:50 PM, Greg KH <gregkh@linuxfoundation.org> wrote:
> On Tue, Oct 31, 2017 at 02:26:35PM +0200, Amir Goldstein wrote:
>> On Tue, Oct 31, 2017 at 11:33 AM, Jan Kara <jack@suse.cz> wrote:
>> > When fsnotify_add_mark_locked() fails it cleans up the mark it was
>> > adding. Since the mark is already visible in group's list, we should
>> > protect update of mark->flags with mark->lock. I'm not aware of any real
>> > issues this could cause (since we also hold group->mark_mutex) but
>> > better be safe and obey locking rules properly.
>> >
>> > Signed-off-by: Jan Kara <jack@suse.cz>
>>
>> Reviewed-by: Amir Goldstein <amir73il@gmail.com>
>>
>> IMO, even though this does not fix a concrete bug, if it's worth
>> fixing in upstream, it's worth fixing in stable.
>> A future stable fix may either make this into a concrete bug
>> or just be harder to apply.
>>
>> So I suggest to add the Fixes: and Cc: stable tags.
>>
>> Greg,
>>
>> Do you agree with this reasoning?
>
> If it doesn't fix an actual bug, how does that fit with the stable
> kernel rules?
>

So this is the case of incorrect code w.r.t locking rules
that either does not hit a bug because of an indirect protection
(as Jan wrote in commit) or we did not find how to hit a bug.

Not sure how you want to call this, but if you think it doesn't belong
for stable we won't send it. That's why I called for your opinion.

Thanks,
Amir.

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

* Re: [PATCH 2/2] fsnotify: Protect bail out path of fsnotify_add_mark_locked() properly
  2017-10-31 12:57       ` Amir Goldstein
@ 2017-10-31 13:40         ` Greg KH
  0 siblings, 0 replies; 12+ messages in thread
From: Greg KH @ 2017-10-31 13:40 UTC (permalink / raw)
  To: Amir Goldstein; +Cc: Jan Kara, linux-fsdevel

On Tue, Oct 31, 2017 at 02:57:49PM +0200, Amir Goldstein wrote:
> On Tue, Oct 31, 2017 at 2:50 PM, Greg KH <gregkh@linuxfoundation.org> wrote:
> > On Tue, Oct 31, 2017 at 02:26:35PM +0200, Amir Goldstein wrote:
> >> On Tue, Oct 31, 2017 at 11:33 AM, Jan Kara <jack@suse.cz> wrote:
> >> > When fsnotify_add_mark_locked() fails it cleans up the mark it was
> >> > adding. Since the mark is already visible in group's list, we should
> >> > protect update of mark->flags with mark->lock. I'm not aware of any real
> >> > issues this could cause (since we also hold group->mark_mutex) but
> >> > better be safe and obey locking rules properly.
> >> >
> >> > Signed-off-by: Jan Kara <jack@suse.cz>
> >>
> >> Reviewed-by: Amir Goldstein <amir73il@gmail.com>
> >>
> >> IMO, even though this does not fix a concrete bug, if it's worth
> >> fixing in upstream, it's worth fixing in stable.
> >> A future stable fix may either make this into a concrete bug
> >> or just be harder to apply.
> >>
> >> So I suggest to add the Fixes: and Cc: stable tags.
> >>
> >> Greg,
> >>
> >> Do you agree with this reasoning?
> >
> > If it doesn't fix an actual bug, how does that fit with the stable
> > kernel rules?
> >
> 
> So this is the case of incorrect code w.r.t locking rules
> that either does not hit a bug because of an indirect protection
> (as Jan wrote in commit) or we did not find how to hit a bug.
> 
> Not sure how you want to call this, but if you think it doesn't belong
> for stable we won't send it. That's why I called for your opinion.

How about we get the opinion of the developer and maintainer of the
subsystem, I will defer to them...

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

* Re: [PATCH 1/2] dnotify: Handle errors from fsnotify_add_mark_locked() in fcntl_dirnotify()
  2017-10-31 12:11   ` Amir Goldstein
@ 2017-10-31 15:45     ` Jan Kara
  2017-10-31 16:15       ` Jan Kara
  0 siblings, 1 reply; 12+ messages in thread
From: Jan Kara @ 2017-10-31 15:45 UTC (permalink / raw)
  To: Amir Goldstein; +Cc: Jan Kara, linux-fsdevel

On Tue 31-10-17 14:11:49, Amir Goldstein wrote:
> On Tue, Oct 31, 2017 at 11:33 AM, Jan Kara <jack@suse.cz> wrote:
> > fsnotify_add_mark_locked() can fail (e.g. because of ENOMEM since commit
> > 9dd813c15b2c "fsnotify: Move mark list head from object into dedicated
> > structure").
> 
> Since we have the Fixes: tag, I rather have the regression commit only in Fixes:
> tag (with the subject) and this description can start with:
> "fsnotify_add_mark_locked() can fail, but we do not check its return value."

Good suggestion, I'll update the changelog.

> > Handle this error properly in fcntl_dirnotify() as
> > otherwise we just hit BUG_ON(dn_mark->dn) in dnotify_free_mark().
> >
> > Reported-by: syzkaller
> > Fixes: 9dd813c15b2c101168808d4f5941a29985758973
> 
> I think for some backport maintainers the "cc: stable # v4.12" tags
> matters.

Yeah, but frankly I don't think you can trigger this unless you are using
fault injection since GFP_KERNEL slab allocations never fail currently (the
kernel will rather retry allocation indefinitely). That's why I didn't CC
stable as I don't think real users can ever see this and for stable
inclusion the bug needs to be a real treat to users...

> 
> > Signed-off-by: Jan Kara <jack@suse.cz>
> > ---
> >  fs/notify/dnotify/dnotify.c | 5 ++++-
> >  1 file changed, 4 insertions(+), 1 deletion(-)
> >
> > diff --git a/fs/notify/dnotify/dnotify.c b/fs/notify/dnotify/dnotify.c
> > index cba328315929..a50183bd0ab9 100644
> > --- a/fs/notify/dnotify/dnotify.c
> > +++ b/fs/notify/dnotify/dnotify.c
> > @@ -319,7 +319,9 @@ int fcntl_dirnotify(int fd, struct file *filp, unsigned long arg)
> >                 dn_mark = container_of(fsn_mark, struct dnotify_mark, fsn_mark);
> >                 spin_lock(&fsn_mark->lock);
> >         } else {
> > -               fsnotify_add_mark_locked(new_fsn_mark, inode, NULL, 0);
> > +               error = fsnotify_add_mark_locked(new_fsn_mark, inode, NULL, 0);
> > +               if (error)
> > +                       goto out_err;
> 
> out_err is not unlocking dnotify_group->mark_mutex, and probably need to
> put fsn_mark as well?

Argh, good point about mark_mutex (I wonder how come this didn't deadlock
when I've tested it). You don't need to put fsn_mark - that is guaranteed
to be NULL here.

								Honza
-- 
Jan Kara <jack@suse.com>
SUSE Labs, CR

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

* Re: [PATCH 2/2] fsnotify: Protect bail out path of fsnotify_add_mark_locked() properly
  2017-10-31 12:26   ` Amir Goldstein
  2017-10-31 12:50     ` Greg KH
@ 2017-10-31 16:10     ` Jan Kara
  1 sibling, 0 replies; 12+ messages in thread
From: Jan Kara @ 2017-10-31 16:10 UTC (permalink / raw)
  To: Amir Goldstein; +Cc: Jan Kara, linux-fsdevel, Greg KH

On Tue 31-10-17 14:26:35, Amir Goldstein wrote:
> On Tue, Oct 31, 2017 at 11:33 AM, Jan Kara <jack@suse.cz> wrote:
> > When fsnotify_add_mark_locked() fails it cleans up the mark it was
> > adding. Since the mark is already visible in group's list, we should
> > protect update of mark->flags with mark->lock. I'm not aware of any real
> > issues this could cause (since we also hold group->mark_mutex) but
> > better be safe and obey locking rules properly.
> >
> > Signed-off-by: Jan Kara <jack@suse.cz>
> 
> Reviewed-by: Amir Goldstein <amir73il@gmail.com>
> 
> IMO, even though this does not fix a concrete bug, if it's worth
> fixing in upstream, it's worth fixing in stable.
> A future stable fix may either make this into a concrete bug
> or just be harder to apply.
> 
> So I suggest to add the Fixes: and Cc: stable tags.
> 
> Greg,
> 
> Do you agree with this reasoning?

Similarly as with patch 1, I don't think real users can hit this (and even
if they could, I doubt it would have any negative impact). So bothering
stable with this is just a waste of resources... It falls under the
"theoretical race condition" cathegory which is explicitely forbidden from
stable.

								Honza
-- 
Jan Kara <jack@suse.com>
SUSE Labs, CR

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

* Re: [PATCH 1/2] dnotify: Handle errors from fsnotify_add_mark_locked() in fcntl_dirnotify()
  2017-10-31 15:45     ` Jan Kara
@ 2017-10-31 16:15       ` Jan Kara
  2017-10-31 16:28         ` Amir Goldstein
  0 siblings, 1 reply; 12+ messages in thread
From: Jan Kara @ 2017-10-31 16:15 UTC (permalink / raw)
  To: Amir Goldstein; +Cc: Jan Kara, linux-fsdevel

[-- Attachment #1: Type: text/plain, Size: 1398 bytes --]

On Tue 31-10-17 16:45:57, Jan Kara wrote:
> On Tue 31-10-17 14:11:49, Amir Goldstein wrote:
> > On Tue, Oct 31, 2017 at 11:33 AM, Jan Kara <jack@suse.cz> wrote:
> > > Signed-off-by: Jan Kara <jack@suse.cz>
> > > ---
> > >  fs/notify/dnotify/dnotify.c | 5 ++++-
> > >  1 file changed, 4 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/fs/notify/dnotify/dnotify.c b/fs/notify/dnotify/dnotify.c
> > > index cba328315929..a50183bd0ab9 100644
> > > --- a/fs/notify/dnotify/dnotify.c
> > > +++ b/fs/notify/dnotify/dnotify.c
> > > @@ -319,7 +319,9 @@ int fcntl_dirnotify(int fd, struct file *filp, unsigned long arg)
> > >                 dn_mark = container_of(fsn_mark, struct dnotify_mark, fsn_mark);
> > >                 spin_lock(&fsn_mark->lock);
> > >         } else {
> > > -               fsnotify_add_mark_locked(new_fsn_mark, inode, NULL, 0);
> > > +               error = fsnotify_add_mark_locked(new_fsn_mark, inode, NULL, 0);
> > > +               if (error)
> > > +                       goto out_err;
> > 
> > out_err is not unlocking dnotify_group->mark_mutex, and probably need to
> > put fsn_mark as well?
> 
> Argh, good point about mark_mutex (I wonder how come this didn't deadlock
> when I've tested it). You don't need to put fsn_mark - that is guaranteed
> to be NULL here.

Attached is a new version of the patch.

								Honza
-- 
Jan Kara <jack@suse.com>
SUSE Labs, CR

[-- Attachment #2: 0001-dnotify-Handle-errors-from-fsnotify_add_mark_locked-.patch --]
[-- Type: text/x-patch, Size: 1713 bytes --]

>From 54abcb76cd57877794e2007ac944d8437baf49c1 Mon Sep 17 00:00:00 2001
From: Jan Kara <jack@suse.cz>
Date: Tue, 31 Oct 2017 09:53:28 +0100
Subject: [PATCH 1/2] dnotify: Handle errors from fsnotify_add_mark_locked() in
 fcntl_dirnotify()

fsnotify_add_mark_locked() can fail but we do not check its return
value. This didn't matter before commit 9dd813c15b2c "fsnotify: Move
mark list head from object into dedicated structure" as none of possible
failures could happen for dnotify but after that commit -ENOMEM can be
returned. Handle this error properly in fcntl_dirnotify() as
otherwise we just hit BUG_ON(dn_mark->dn) in dnotify_free_mark().

Reported-by: syzkaller
Fixes: 9dd813c15b2c101168808d4f5941a29985758973
Signed-off-by: Jan Kara <jack@suse.cz>
---
 fs/notify/dnotify/dnotify.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/fs/notify/dnotify/dnotify.c b/fs/notify/dnotify/dnotify.c
index cba328315929..63a1ca4b9dee 100644
--- a/fs/notify/dnotify/dnotify.c
+++ b/fs/notify/dnotify/dnotify.c
@@ -319,7 +319,11 @@ int fcntl_dirnotify(int fd, struct file *filp, unsigned long arg)
 		dn_mark = container_of(fsn_mark, struct dnotify_mark, fsn_mark);
 		spin_lock(&fsn_mark->lock);
 	} else {
-		fsnotify_add_mark_locked(new_fsn_mark, inode, NULL, 0);
+		error = fsnotify_add_mark_locked(new_fsn_mark, inode, NULL, 0);
+		if (error) {
+			mutex_unlock(&dnotify_group->mark_mutex);
+			goto out_err;
+		}
 		spin_lock(&new_fsn_mark->lock);
 		fsn_mark = new_fsn_mark;
 		dn_mark = new_dn_mark;
@@ -345,6 +349,7 @@ int fcntl_dirnotify(int fd, struct file *filp, unsigned long arg)
 		 */
 		if (dn_mark == new_dn_mark)
 			destroy = 1;
+		error = 0;
 		goto out;
 	}
 
-- 
2.12.3


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

* Re: [PATCH 1/2] dnotify: Handle errors from fsnotify_add_mark_locked() in fcntl_dirnotify()
  2017-10-31 16:15       ` Jan Kara
@ 2017-10-31 16:28         ` Amir Goldstein
  0 siblings, 0 replies; 12+ messages in thread
From: Amir Goldstein @ 2017-10-31 16:28 UTC (permalink / raw)
  To: Jan Kara; +Cc: linux-fsdevel

On Tue, Oct 31, 2017 at 6:15 PM, Jan Kara <jack@suse.cz> wrote:
> On Tue 31-10-17 16:45:57, Jan Kara wrote:
>> On Tue 31-10-17 14:11:49, Amir Goldstein wrote:
>> > On Tue, Oct 31, 2017 at 11:33 AM, Jan Kara <jack@suse.cz> wrote:
>> > > Signed-off-by: Jan Kara <jack@suse.cz>
>> > > ---
>> > >  fs/notify/dnotify/dnotify.c | 5 ++++-
>> > >  1 file changed, 4 insertions(+), 1 deletion(-)
>> > >
>> > > diff --git a/fs/notify/dnotify/dnotify.c b/fs/notify/dnotify/dnotify.c
>> > > index cba328315929..a50183bd0ab9 100644
>> > > --- a/fs/notify/dnotify/dnotify.c
>> > > +++ b/fs/notify/dnotify/dnotify.c
>> > > @@ -319,7 +319,9 @@ int fcntl_dirnotify(int fd, struct file *filp, unsigned long arg)
>> > >                 dn_mark = container_of(fsn_mark, struct dnotify_mark, fsn_mark);
>> > >                 spin_lock(&fsn_mark->lock);
>> > >         } else {
>> > > -               fsnotify_add_mark_locked(new_fsn_mark, inode, NULL, 0);
>> > > +               error = fsnotify_add_mark_locked(new_fsn_mark, inode, NULL, 0);
>> > > +               if (error)
>> > > +                       goto out_err;
>> >
>> > out_err is not unlocking dnotify_group->mark_mutex, and probably need to
>> > put fsn_mark as well?
>>
>> Argh, good point about mark_mutex (I wonder how come this didn't deadlock
>> when I've tested it). You don't need to put fsn_mark - that is guaranteed
>> to be NULL here.
>
> Attached is a new version of the patch.


Reviewed-by: Amir Goldstein <amir73il@gmail.com>

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

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

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-10-31  9:33 [PATCH 0/2] dnotify: Fix ENOMEM handling Jan Kara
2017-10-31  9:33 ` [PATCH 1/2] dnotify: Handle errors from fsnotify_add_mark_locked() in fcntl_dirnotify() Jan Kara
2017-10-31 12:11   ` Amir Goldstein
2017-10-31 15:45     ` Jan Kara
2017-10-31 16:15       ` Jan Kara
2017-10-31 16:28         ` Amir Goldstein
2017-10-31  9:33 ` [PATCH 2/2] fsnotify: Protect bail out path of fsnotify_add_mark_locked() properly Jan Kara
2017-10-31 12:26   ` Amir Goldstein
2017-10-31 12:50     ` Greg KH
2017-10-31 12:57       ` Amir Goldstein
2017-10-31 13:40         ` Greg KH
2017-10-31 16:10     ` Jan Kara

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.