On Thu, Nov 12, 2015 at 09:57:07AM +0100, Frans Klaver wrote: > On Thu, Nov 12, 2015 at 9:53 AM, Uwe Kleine-König > <u.kleine-koenig@xxxxxxxxxxxxxx> wrote: > > CC += devicetree@xxxxxxxxxxxxxxx, gregkh > > You added linux@pengutronix instead of devicetree. Well I substituted Sascha by kernel@xxxxxxxxxxxxxx on purpose, but considered that too unimportant for the outer world :-) But I really forgot devicetree@xxxxxxxxxxxxxxx. Added now. > > On Thu, Nov 12, 2015 at 09:36:55AM +0100, Frans Klaver wrote: > >> On Thu, Nov 12, 2015 at 9:26 AM, Uwe Kleine-König > >> <u.kleine-koenig@xxxxxxxxxxxxxx> wrote: > >> > On Thu, Nov 12, 2015 at 09:03:11AM +0100, Frans Klaver wrote: > >> >> Hi, > >> >> > >> >> On Thu, Nov 12, 2015 at 8:46 AM, LABBE Corentin > >> >> <clabbe.montjoie@xxxxxxxxx> wrote: > >> >> > of_match_device could return NULL, and so cause a NULL pointer > >> >> > dereference later. > >> >> > >> >> Did you actually run into this? It seems to me that this driver is > >> >> only probed if and only if we have a match and that therefore > >> >> of_match_device will always return a valid pointer (it is using the > >> >> same match table). Am I missing something? > >> > > >> > Yes, you're missing something. The driver would probe for a dt snippet > >> > like: > >> > > >> > mxc_nand { > >> > compatible = "foobar"; > >> > } > >> > > >> > In this case dev->of_node is non-NULL but of_match_device(mxcnd_dt_ids, > >> > dev) is. > >> > > >> > (I didn't actually test this, so there is a chance I'm wrong here. And > >> > if not I wonder if it is sensible at all to match the device name on > >> > driver name for of-created platform devices.) > >> > >> Yea, looks like you're right. platform devices check a number of > >> things to determine a match, among which is driver name if all else > >> fails (platform.c, platform_match()). > > > > Maybe something like this would help to reduce surprises: > > > > diff --git a/drivers/base/platform.c b/drivers/base/platform.c > > index f80aaaf9f610..a9fc22c86552 100644 > > --- a/drivers/base/platform.c > > +++ b/drivers/base/platform.c > > @@ -840,8 +840,8 @@ static int platform_match(struct device *dev, struct device_driver *drv) > > return !strcmp(pdev->driver_override, drv->name); > > > > /* Attempt an OF style match first */ > > - if (of_driver_match_device(dev, drv)) > > - return 1; > > + if (pdev->dev.of_node) > > + return of_driver_match_device(dev, drv); > > > > /* Then try ACPI style match */ > > if (acpi_driver_match_device(dev, drv)) > > That looks sensible, yea. There is a chance that misbehaving DT nodes > will fail after this change, of course. Which is ok if this behaviour is considered a misbehave :-) Best regards Uwe -- Pengutronix e.K. | Uwe Kleine-König | Industrial Linux Solutions | http://www.pengutronix.de/ | -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html