linux/drivers/nvmem
Douglas Anderson 87ed1405ef nvmem: Don't let a NULL cell_id for nvmem_cell_get() crash us
In commit ca04d9d3e1 ("phy: qcom-qusb2: New driver for QUSB2 PHY on
Qcom chips") you can see a call like:

  devm_nvmem_cell_get(dev, NULL);

Note that the cell ID passed to the function is NULL.  This is because
the qcom-qusb2 driver is expected to work only on systems where the
PHY node is hooked up via device-tree and is nameless.

This works OK for the most part.  The first thing nvmem_cell_get()
does is to call of_nvmem_cell_get() and there it's documented that a
NULL name is fine.  The problem happens when the call to
of_nvmem_cell_get() returns -EINVAL.  In such a case we'll fall back
to nvmem_cell_get_from_list() and eventually might (if nvmem_cells
isn't an empty list) crash with something that looks like:

 strcmp
 nvmem_find_cell
 __nvmem_device_get
 nvmem_cell_get_from_list
 nvmem_cell_get
 devm_nvmem_cell_get
 qusb2_phy_probe

There are several different ways we could fix this problem:

One could argue that perhaps the qcom-qusb2 driver should be changed
to use of_nvmem_cell_get() which is allowed to have a NULL name.  In
that case, we'd need to add a patche to introduce
devm_of_nvmem_cell_get() since the qcom-qusb2 driver is using devm
managed resources.

One could also argue that perhaps we could just add a name to
qcom-qusb2.  That would be OK but I believe it effectively changes the
device tree bindings, so maybe it's a no-go.

In this patch I have chosen to fix the problem by simply not crashing
when a NULL cell_id is passed to nvmem_cell_get().

NOTE: that for the qcom-qusb2 driver the "nvmem-cells" property is
defined to be optional and thus it's expected to be a common case that
we would hit this crash and this is more than just a theoretical fix.

Fixes: ca04d9d3e1 ("phy: qcom-qusb2: New driver for QUSB2 PHY on Qcom chips")
Signed-off-by: Douglas Anderson <dianders@chromium.org>
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2018-07-07 17:30:25 +02:00
..
bcm-ocotp.c nvmem: bcm-ocotp: Do not use "&pdev->dev" explicitly 2018-03-14 19:28:14 +01:00
core.c nvmem: Don't let a NULL cell_id for nvmem_cell_get() crash us 2018-07-07 17:30:25 +02:00
imx-iim.c nvmem: imx-iim: Do not use "&pdev->dev" explicitly 2018-03-14 19:28:14 +01:00
imx-ocotp.c nvmem: imx-ocotp: remove unused dead code 2018-03-14 19:28:15 +01:00
Kconfig nvmem: Add RAVE SP EEPROM driver 2018-05-14 16:20:48 +02:00
lpc18xx_eeprom.c nvmem: set nvmem->owner to nvmem->dev->driver->owner if unset 2017-11-08 13:54:17 +01:00
lpc18xx_otp.c nvmem: lpc18xx_otp: Convert to use devm_nvmem_register() 2018-03-14 19:28:14 +01:00
Makefile nvmem: Add RAVE SP EEPROM driver 2018-05-14 16:20:48 +02:00
meson-efuse.c nvmem: meson-efuse: add write support 2018-05-14 16:20:48 +02:00
meson-mx-efuse.c nvmem: meson-mx-efuse: Convert to use devm_nvmem_register() 2018-03-14 19:28:14 +01:00
mtk-efuse.c nvmem: mtk-efuse: Convert to use devm_nvmem_register() 2018-03-14 19:28:13 +01:00
mxs-ocotp.c nvmem: set nvmem->owner to nvmem->dev->driver->owner if unset 2017-11-08 13:54:17 +01:00
qfprom.c nvmem: qfprom: Convert to use devm_nvmem_register() 2018-03-14 19:28:14 +01:00
rave-sp-eeprom.c nvmem: Add RAVE SP EEPROM driver 2018-05-14 16:20:48 +02:00
rockchip-efuse.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
snvs_lpgpr.c nvmem: add i.MX7 support to snvs-lpgpr 2018-03-14 19:28:14 +01:00
sunxi_sid.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
uniphier-efuse.c nvmem: uniphier-efuse: Convert to use devm_nvmem_register() 2018-03-14 19:28:13 +01:00
vf610-ocotp.c nvmem: vf610-ocotp: Do not use "&pdev->dev" explicitly 2018-03-14 19:28:14 +01:00