2007-11-09 06:07:43

by Eric Miao

[permalink] [raw]
Subject: [PATCH] make ds1wm driver to check ds1wm_platform_data pointer against NULL

Do a sanity check for the "struct ds1wm_platform_data" pointer passed in
by the platform_device, and so to enforce each platform to provide a
valid structure.

Signed-off-by: eric miao <[email protected]>
---
drivers/w1/masters/ds1wm.c | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/drivers/w1/masters/ds1wm.c b/drivers/w1/masters/ds1wm.c
index 5747997..11ce9ec 100644
--- a/drivers/w1/masters/ds1wm.c
+++ b/drivers/w1/masters/ds1wm.c
@@ -351,6 +351,10 @@ static int ds1wm_probe(struct platform_device *pdev)
goto err0;
}
plat = pdev->dev.platform_data;
+ if (!plat) {
+ ret = -ENXIO;
+ goto err0;
+ }
ds1wm_data->bus_shift = plat->bus_shift;
ds1wm_data->pdev = pdev;
ds1wm_data->pdata = plat;
--
1.5.2.5.GIT


2007-11-10 01:04:08

by Andrew Morton

[permalink] [raw]
Subject: Re: [PATCH] make ds1wm driver to check ds1wm_platform_data pointer against NULL

On Fri, 9 Nov 2007 14:07:31 +0800
"eric miao" <[email protected]> wrote:

> Do a sanity check for the "struct ds1wm_platform_data" pointer passed in
> by the platform_device, and so to enforce each platform to provide a
> valid structure.
>
> Signed-off-by: eric miao <[email protected]>
> ---
> drivers/w1/masters/ds1wm.c | 4 ++++
> 1 files changed, 4 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/w1/masters/ds1wm.c b/drivers/w1/masters/ds1wm.c
> index 5747997..11ce9ec 100644
> --- a/drivers/w1/masters/ds1wm.c
> +++ b/drivers/w1/masters/ds1wm.c
> @@ -351,6 +351,10 @@ static int ds1wm_probe(struct platform_device *pdev)
> goto err0;
> }
> plat = pdev->dev.platform_data;
> + if (!plat) {
> + ret = -ENXIO;
> + goto err0;
> + }
> ds1wm_data->bus_shift = plat->bus_shift;
> ds1wm_data->pdev = pdev;
> ds1wm_data->pdata = plat;

I don't understand this change. Could you please provide some more details
regarding what problem it is solving? How can pdev->dev.platform_data==NULL
come about?

Thanks.

2007-11-10 17:08:34

by Evgeniy Polyakov

[permalink] [raw]
Subject: Re: [PATCH] make ds1wm driver to check ds1wm_platform_data pointer against NULL

On Fri, Nov 09, 2007 at 05:02:38PM -0800, Andrew Morton ([email protected]) wrote:
> > @@ -351,6 +351,10 @@ static int ds1wm_probe(struct platform_device *pdev)
> > goto err0;
> > }
> > plat = pdev->dev.platform_data;
> > + if (!plat) {
> > + ret = -ENXIO;
> > + goto err0;
> > + }
> > ds1wm_data->bus_shift = plat->bus_shift;
> > ds1wm_data->pdev = pdev;
> > ds1wm_data->pdata = plat;
>
> I don't understand this change. Could you please provide some more details
> regarding what problem it is solving? How can pdev->dev.platform_data==NULL
> come about?

If I understood correctly, it is posible to call platform's probe
callback without previously calling platform_device_add_data() to setup
platform_data.

But actually I failed to find any user of this platform driver in
vanilla kernel, so it is hard to say if driver is used properly or not
by external modules, and thus this change is very likely valid.

--
Evgeniy Polyakov

2007-11-11 02:26:23

by Eric Miao

[permalink] [raw]
Subject: Re: [PATCH] make ds1wm driver to check ds1wm_platform_data pointer against NULL

On Nov 11, 2007 1:08 AM, Evgeniy Polyakov <[email protected]> wrote:
> On Fri, Nov 09, 2007 at 05:02:38PM -0800, Andrew Morton ([email protected]) wrote:
> > > @@ -351,6 +351,10 @@ static int ds1wm_probe(struct platform_device *pdev)
> > > goto err0;
> > > }
> > > plat = pdev->dev.platform_data;
> > > + if (!plat) {
> > > + ret = -ENXIO;
> > > + goto err0;
> > > + }
> > > ds1wm_data->bus_shift = plat->bus_shift;
> > > ds1wm_data->pdev = pdev;
> > > ds1wm_data->pdata = plat;
> >
> > I don't understand this change. Could you please provide some more details
> > regarding what problem it is solving? How can pdev->dev.platform_data==NULL
> > come about?
>
> If I understood correctly, it is posible to call platform's probe
> callback without previously calling platform_device_add_data() to setup
> platform_data.
>
> But actually I failed to find any user of this platform driver in
> vanilla kernel, so it is hard to say if driver is used properly or not
> by external modules, and thus this change is very likely valid.
>
> --
> Evgeniy Polyakov
>

Yes, that's exactly what this patch meant to prevent. That no use of
this platform driver in vanilla kernel doesn't mean the check is
unnecessary. Actually, from the code of this driver, the platform_data
is mandatory for the driver to work properly. Well, if an oops is
on purpose when platform_data == NULL, this is, I agree, completely
unnecessary.

--
Cheers
- eric