2019-05-17 19:03:38

by Helen Koike

[permalink] [raw]
Subject: [PATCH] media: vimc: fix component match compare

If the system has other devices being registered in the component
framework, the compare function will be called with a device that
doesn't belong to vimc.
This device is not necessarily a platform_device, nor have a
platform_data (which causes a NULL pointer dereference error) and if it
does have a pdata, it is not necessarily type of struct vimc_platform_data.
So casting to any of these types is wrong.

Instead of expecting a given pdev with a given pdata, just expect for
the device it self. vimc-core is the one who creates them, we know in
advance exactly which object to expect in the match.

Fixes: 4a29b7090749 ("[media] vimc: Subdevices as modules")
Signed-off-by: Helen Koike <[email protected]>

---

drivers/media/platform/vimc/vimc-core.c | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/drivers/media/platform/vimc/vimc-core.c b/drivers/media/platform/vimc/vimc-core.c
index 3aa62d7e3d0e..23992affd01f 100644
--- a/drivers/media/platform/vimc/vimc-core.c
+++ b/drivers/media/platform/vimc/vimc-core.c
@@ -244,10 +244,7 @@ static void vimc_comp_unbind(struct device *master)

static int vimc_comp_compare(struct device *comp, void *data)
{
- const struct platform_device *pdev = to_platform_device(comp);
- const char *name = data;
-
- return !strcmp(pdev->dev.platform_data, name);
+ return comp == data;
}

static struct component_match *vimc_add_subdevs(struct vimc_device *vimc)
@@ -277,7 +274,7 @@ static struct component_match *vimc_add_subdevs(struct vimc_device *vimc)
}

component_match_add(&vimc->pdev.dev, &match, vimc_comp_compare,
- (void *)vimc->pipe_cfg->ents[i].name);
+ &vimc->subdevs[i]->dev);
}

return match;
--
2.20.1


2019-05-21 12:55:50

by Boris Brezillon

[permalink] [raw]
Subject: Re: [PATCH] media: vimc: fix component match compare

On Fri, 17 May 2019 14:20:11 -0300
Helen Koike <[email protected]> wrote:

> If the system has other devices being registered in the component
> framework, the compare function will be called with a device that
> doesn't belong to vimc.
> This device is not necessarily a platform_device, nor have a
> platform_data (which causes a NULL pointer dereference error) and if it
> does have a pdata, it is not necessarily type of struct vimc_platform_data.
> So casting to any of these types is wrong.
>
> Instead of expecting a given pdev with a given pdata, just expect for
> the device it self. vimc-core is the one who creates them, we know in
> advance exactly which object to expect in the match.
>
> Fixes: 4a29b7090749 ("[media] vimc: Subdevices as modules")
> Signed-off-by: Helen Koike <[email protected]>

Reviewed-by: Boris Brezillon <[email protected]>
Tested-by: Boris Brezillon <[email protected]>

>
> ---
>
> drivers/media/platform/vimc/vimc-core.c | 7 ++-----
> 1 file changed, 2 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/media/platform/vimc/vimc-core.c b/drivers/media/platform/vimc/vimc-core.c
> index 3aa62d7e3d0e..23992affd01f 100644
> --- a/drivers/media/platform/vimc/vimc-core.c
> +++ b/drivers/media/platform/vimc/vimc-core.c
> @@ -244,10 +244,7 @@ static void vimc_comp_unbind(struct device *master)
>
> static int vimc_comp_compare(struct device *comp, void *data)
> {
> - const struct platform_device *pdev = to_platform_device(comp);
> - const char *name = data;
> -
> - return !strcmp(pdev->dev.platform_data, name);
> + return comp == data;
> }
>
> static struct component_match *vimc_add_subdevs(struct vimc_device *vimc)
> @@ -277,7 +274,7 @@ static struct component_match *vimc_add_subdevs(struct vimc_device *vimc)
> }
>
> component_match_add(&vimc->pdev.dev, &match, vimc_comp_compare,
> - (void *)vimc->pipe_cfg->ents[i].name);
> + &vimc->subdevs[i]->dev);
> }
>
> return match;


2019-05-21 15:14:20

by Boris Brezillon

[permalink] [raw]
Subject: Re: [PATCH] media: vimc: fix component match compare

On Fri, 17 May 2019 14:20:11 -0300
Helen Koike <[email protected]> wrote:

> If the system has other devices being registered in the component
> framework, the compare function will be called with a device that
> doesn't belong to vimc.
> This device is not necessarily a platform_device, nor have a
> platform_data (which causes a NULL pointer dereference error) and if it
> does have a pdata, it is not necessarily type of struct vimc_platform_data.
> So casting to any of these types is wrong.
>
> Instead of expecting a given pdev with a given pdata, just expect for
> the device it self. vimc-core is the one who creates them, we know in
> advance exactly which object to expect in the match.
>
> Fixes: 4a29b7090749 ("[media] vimc: Subdevices as modules")

Oh, and you forgot to add

Cc: <[email protected]>

> Signed-off-by: Helen Koike <[email protected]>
>
> ---
>
> drivers/media/platform/vimc/vimc-core.c | 7 ++-----
> 1 file changed, 2 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/media/platform/vimc/vimc-core.c b/drivers/media/platform/vimc/vimc-core.c
> index 3aa62d7e3d0e..23992affd01f 100644
> --- a/drivers/media/platform/vimc/vimc-core.c
> +++ b/drivers/media/platform/vimc/vimc-core.c
> @@ -244,10 +244,7 @@ static void vimc_comp_unbind(struct device *master)
>
> static int vimc_comp_compare(struct device *comp, void *data)
> {
> - const struct platform_device *pdev = to_platform_device(comp);
> - const char *name = data;
> -
> - return !strcmp(pdev->dev.platform_data, name);
> + return comp == data;
> }
>
> static struct component_match *vimc_add_subdevs(struct vimc_device *vimc)
> @@ -277,7 +274,7 @@ static struct component_match *vimc_add_subdevs(struct vimc_device *vimc)
> }
>
> component_match_add(&vimc->pdev.dev, &match, vimc_comp_compare,
> - (void *)vimc->pipe_cfg->ents[i].name);
> + &vimc->subdevs[i]->dev);
> }
>
> return match;


2019-05-21 18:41:08

by Ezequiel Garcia

[permalink] [raw]
Subject: Re: [PATCH] media: vimc: fix component match compare

On Tue, 2019-05-21 at 14:55 +0200, Boris Brezillon wrote:
> On Fri, 17 May 2019 14:20:11 -0300
> Helen Koike <[email protected]> wrote:
>
> > If the system has other devices being registered in the component
> > framework, the compare function will be called with a device that
> > doesn't belong to vimc.
> > This device is not necessarily a platform_device, nor have a
> > platform_data (which causes a NULL pointer dereference error) and if it
> > does have a pdata, it is not necessarily type of struct vimc_platform_data.
> > So casting to any of these types is wrong.
> >
> > Instead of expecting a given pdev with a given pdata, just expect for
> > the device it self. vimc-core is the one who creates them, we know in
> > advance exactly which object to expect in the match.
> >
> > Fixes: 4a29b7090749 ("[media] vimc: Subdevices as modules")
>
> Oh, and you forgot to add
>
> Cc: <[email protected]>
>

Although it's not really documented (not in process/stable-rules
at least) that a "Fixes" tag alone would be automatically picked by
the stable team, it has been the case for me since always,
as I've never Cced stable explicitly.


2019-05-21 18:56:40

by Boris Brezillon

[permalink] [raw]
Subject: Re: [PATCH] media: vimc: fix component match compare

On Tue, 21 May 2019 15:39:00 -0300
Ezequiel Garcia <[email protected]> wrote:

> On Tue, 2019-05-21 at 14:55 +0200, Boris Brezillon wrote:
> > On Fri, 17 May 2019 14:20:11 -0300
> > Helen Koike <[email protected]> wrote:
> >
> > > If the system has other devices being registered in the component
> > > framework, the compare function will be called with a device that
> > > doesn't belong to vimc.
> > > This device is not necessarily a platform_device, nor have a
> > > platform_data (which causes a NULL pointer dereference error) and if it
> > > does have a pdata, it is not necessarily type of struct vimc_platform_data.
> > > So casting to any of these types is wrong.
> > >
> > > Instead of expecting a given pdev with a given pdata, just expect for
> > > the device it self. vimc-core is the one who creates them, we know in
> > > advance exactly which object to expect in the match.
> > >
> > > Fixes: 4a29b7090749 ("[media] vimc: Subdevices as modules")
> >
> > Oh, and you forgot to add
> >
> > Cc: <[email protected]>
> >
>
> Although it's not really documented (not in process/stable-rules
> at least) that a "Fixes" tag alone would be automatically picked by
> the stable team, it has been the case for me since always,
> as I've never Cced stable explicitly.
>

It's probably the case thanks to Sascha's auto-select tool, but I do
think it's better to be explicit about what you want: there are some
cases where a patch fixes a bug, but the user doesn't want this patch
to be backported because it's not been tested or older kernels, is too
complex to be backported as is or is not important enough (typos).