Message ID | 20190517172011.13257-1-helen.koike@collabora.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | media: vimc: fix component match compare | expand |
On Fri, 17 May 2019 14:20:11 -0300 Helen Koike <helen.koike@collabora.com> 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 <helen.koike@collabora.com> Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com> Tested-by: Boris Brezillon <boris.brezillon@collabora.com> > > --- > > 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;
On Fri, 17 May 2019 14:20:11 -0300 Helen Koike <helen.koike@collabora.com> 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: <stable@vger.kernel.org> > Signed-off-by: Helen Koike <helen.koike@collabora.com> > > --- > > 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;
On Tue, 2019-05-21 at 14:55 +0200, Boris Brezillon wrote: > On Fri, 17 May 2019 14:20:11 -0300 > Helen Koike <helen.koike@collabora.com> 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: <stable@vger.kernel.org> > 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.
On Tue, 21 May 2019 15:39:00 -0300 Ezequiel Garcia <ezequiel@collabora.com> wrote: > On Tue, 2019-05-21 at 14:55 +0200, Boris Brezillon wrote: > > On Fri, 17 May 2019 14:20:11 -0300 > > Helen Koike <helen.koike@collabora.com> 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: <stable@vger.kernel.org> > > > > 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).
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;
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 <helen.koike@collabora.com> --- drivers/media/platform/vimc/vimc-core.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)