* [PATCH] usb: gadget: f_fs: Fix epfile null pointer access after ep enable.
@ 2025-09-12 4:05 guhuinan
2025-09-12 5:32 ` Greg Kroah-Hartman
0 siblings, 1 reply; 4+ messages in thread
From: guhuinan @ 2025-09-12 4:05 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-usb, Al Viro, Ingo Rohloff, Christian Brauner, Chen Ni,
Peter Zijlstra, Sabyrzhan Tasbolatov, Akash M, chenyu, yudongbin,
mahongwei, jiangdayu, guhuinan
A race condition occurs when ffs_func_eps_enable() runs concurrently
with ffs_data_reset(). The ffs_data_clear() called in ffs_data_reset()
sets ffs->epfiles to NULL before resetting ffs->eps_count to 0, leading
to a NULL pointer dereference when accessing epfile->ep in
ffs_func_eps_enable() after successful usb_ep_enable().
Signed-off-by: guhuinan <guhuinan@xiaomi.com>
---
drivers/usb/gadget/function/f_fs.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c
index 08a251df20c4..f4aae91e7864 100644
--- a/drivers/usb/gadget/function/f_fs.c
+++ b/drivers/usb/gadget/function/f_fs.c
@@ -2407,7 +2407,13 @@ static int ffs_func_eps_enable(struct ffs_function *func)
ep = func->eps;
epfile = ffs->epfiles;
count = ffs->eps_count;
- while(count--) {
+ if (!epfile) {
+ pr_err("%s: epfiles is NULL\n", __func__);
+ ret = -ENOMEM;
+ goto done;
+ }
+
+ while (count--) {
ep->ep->driver_data = ep;
ret = config_ep_by_speed(func->gadget, &func->function, ep->ep);
@@ -2431,6 +2437,7 @@ static int ffs_func_eps_enable(struct ffs_function *func)
}
wake_up_interruptible(&ffs->wait);
+done:
spin_unlock_irqrestore(&func->ffs->eps_lock, flags);
return ret;
--
2.43.0
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [PATCH] usb: gadget: f_fs: Fix epfile null pointer access after ep enable.
2025-09-12 4:05 [PATCH] usb: gadget: f_fs: Fix epfile null pointer access after ep enable guhuinan
@ 2025-09-12 5:32 ` Greg Kroah-Hartman
2025-09-12 13:47 ` Owen Gu
0 siblings, 1 reply; 4+ messages in thread
From: Greg Kroah-Hartman @ 2025-09-12 5:32 UTC (permalink / raw)
To: guhuinan
Cc: linux-usb, Al Viro, Ingo Rohloff, Christian Brauner, Chen Ni,
Peter Zijlstra, Sabyrzhan Tasbolatov, Akash M, chenyu, yudongbin,
mahongwei, jiangdayu
On Fri, Sep 12, 2025 at 12:05:06PM +0800, guhuinan wrote:
> A race condition occurs when ffs_func_eps_enable() runs concurrently
> with ffs_data_reset(). The ffs_data_clear() called in ffs_data_reset()
> sets ffs->epfiles to NULL before resetting ffs->eps_count to 0, leading
> to a NULL pointer dereference when accessing epfile->ep in
> ffs_func_eps_enable() after successful usb_ep_enable().
>
> Signed-off-by: guhuinan <guhuinan@xiaomi.com>
Please use your name, not your email alias for the From: and
signed-off-by lines.
> ---
> drivers/usb/gadget/function/f_fs.c | 9 ++++++++-
> 1 file changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c
> index 08a251df20c4..f4aae91e7864 100644
> --- a/drivers/usb/gadget/function/f_fs.c
> +++ b/drivers/usb/gadget/function/f_fs.c
> @@ -2407,7 +2407,13 @@ static int ffs_func_eps_enable(struct ffs_function *func)
> ep = func->eps;
> epfile = ffs->epfiles;
> count = ffs->eps_count;
> - while(count--) {
> + if (!epfile) {
> + pr_err("%s: epfiles is NULL\n", __func__);
No need for this debugging line, right?
> + ret = -ENOMEM;
> + goto done;
> + }
> +
> + while (count--) {
What prevents the pointer from changing right after you check it? This
will still race :(
You need a lock somewhere to fix this properly.
thanks,
greg k-h
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH] usb: gadget: f_fs: Fix epfile null pointer access after ep enable.
2025-09-12 5:32 ` Greg Kroah-Hartman
@ 2025-09-12 13:47 ` Owen Gu
2025-09-14 14:10 ` Greg Kroah-Hartman
0 siblings, 1 reply; 4+ messages in thread
From: Owen Gu @ 2025-09-12 13:47 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-usb, Al Viro, Ingo Rohloff, Christian Brauner, Chen Ni,
Peter Zijlstra, Sabyrzhan Tasbolatov, Akash M, chenyu, yudongbin,
mahongwei, jiangdayu
On Fri, Sep 12, 2025 at 07:32:04AM +0200, Greg Kroah-Hartman wrote:
> On Fri, Sep 12, 2025 at 12:05:06PM +0800, guhuinan wrote:
> > A race condition occurs when ffs_func_eps_enable() runs concurrently
> > with ffs_data_reset(). The ffs_data_clear() called in ffs_data_reset()
> > sets ffs->epfiles to NULL before resetting ffs->eps_count to 0, leading
> > to a NULL pointer dereference when accessing epfile->ep in
> > ffs_func_eps_enable() after successful usb_ep_enable().
> >
> > Signed-off-by: guhuinan <guhuinan@xiaomi.com>
>
> Please use your name, not your email alias for the From: and
> signed-off-by lines.
>
Okay
> > ---
> > drivers/usb/gadget/function/f_fs.c | 9 ++++++++-
> > 1 file changed, 8 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c
> > index 08a251df20c4..f4aae91e7864 100644
> > --- a/drivers/usb/gadget/function/f_fs.c
> > +++ b/drivers/usb/gadget/function/f_fs.c
> > @@ -2407,7 +2407,13 @@ static int ffs_func_eps_enable(struct ffs_function *func)
> > ep = func->eps;
> > epfile = ffs->epfiles;
> > count = ffs->eps_count;
> > - while(count--) {
> > + if (!epfile) {
> > + pr_err("%s: epfiles is NULL\n", __func__);
>
> No need for this debugging line, right?
>
Okay
> > + ret = -ENOMEM;
> > + goto done;
> > + }
> > +
> > + while (count--) {
>
> What prevents the pointer from changing right after you check it? This
> will still race :(
>
> You need a lock somewhere to fix this properly.
Dear,
The ffs->epfiles pointer is set to NULL in both ffs_data_clear() and
ffs_data_close() functions, and its modification is protected by the
spinlock ffs->eps_lock.
And the whole ffs_func_eps_enable() function is also protected by ffs->eps_lock.
Thanks
>
> thanks,
>
> greg k-h
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH] usb: gadget: f_fs: Fix epfile null pointer access after ep enable.
2025-09-12 13:47 ` Owen Gu
@ 2025-09-14 14:10 ` Greg Kroah-Hartman
0 siblings, 0 replies; 4+ messages in thread
From: Greg Kroah-Hartman @ 2025-09-14 14:10 UTC (permalink / raw)
To: Owen Gu
Cc: linux-usb, Al Viro, Ingo Rohloff, Christian Brauner, Chen Ni,
Peter Zijlstra, Sabyrzhan Tasbolatov, Akash M, chenyu, yudongbin,
mahongwei, jiangdayu
On Fri, Sep 12, 2025 at 09:47:26PM +0800, Owen Gu wrote:
> On Fri, Sep 12, 2025 at 07:32:04AM +0200, Greg Kroah-Hartman wrote:
> > On Fri, Sep 12, 2025 at 12:05:06PM +0800, guhuinan wrote:
> > > A race condition occurs when ffs_func_eps_enable() runs concurrently
> > > with ffs_data_reset(). The ffs_data_clear() called in ffs_data_reset()
> > > sets ffs->epfiles to NULL before resetting ffs->eps_count to 0, leading
> > > to a NULL pointer dereference when accessing epfile->ep in
> > > ffs_func_eps_enable() after successful usb_ep_enable().
> > >
> > > Signed-off-by: guhuinan <guhuinan@xiaomi.com>
> >
> > Please use your name, not your email alias for the From: and
> > signed-off-by lines.
> >
> Okay
> > > ---
> > > drivers/usb/gadget/function/f_fs.c | 9 ++++++++-
> > > 1 file changed, 8 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c
> > > index 08a251df20c4..f4aae91e7864 100644
> > > --- a/drivers/usb/gadget/function/f_fs.c
> > > +++ b/drivers/usb/gadget/function/f_fs.c
> > > @@ -2407,7 +2407,13 @@ static int ffs_func_eps_enable(struct ffs_function *func)
> > > ep = func->eps;
> > > epfile = ffs->epfiles;
> > > count = ffs->eps_count;
> > > - while(count--) {
> > > + if (!epfile) {
> > > + pr_err("%s: epfiles is NULL\n", __func__);
> >
> > No need for this debugging line, right?
> >
> Okay
> > > + ret = -ENOMEM;
> > > + goto done;
> > > + }
> > > +
> > > + while (count--) {
> >
> > What prevents the pointer from changing right after you check it? This
> > will still race :(
> >
> > You need a lock somewhere to fix this properly.
>
> Dear,
> The ffs->epfiles pointer is set to NULL in both ffs_data_clear() and
> ffs_data_close() functions, and its modification is protected by the
> spinlock ffs->eps_lock.
> And the whole ffs_func_eps_enable() function is also protected by ffs->eps_lock.
Ah, that's good. Please mention that in the changelog text when you
resubmit a new version of this patch.
thanks,
greg k-h
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2025-09-14 14:10 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-12 4:05 [PATCH] usb: gadget: f_fs: Fix epfile null pointer access after ep enable guhuinan
2025-09-12 5:32 ` Greg Kroah-Hartman
2025-09-12 13:47 ` Owen Gu
2025-09-14 14:10 ` Greg Kroah-Hartman
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox