linux-uconsole/drivers/pinctrl
Will Deacon f88ac13307 pinctrl: devicetree: Avoid taking direct reference to device name string
[ Upstream commit be4c60b563 ]

When populating the pinctrl mapping table entries for a device, the
'dev_name' field for each entry is initialised to point directly at the
string returned by 'dev_name()' for the device and subsequently used by
'create_pinctrl()' when looking up the mappings for the device being
probed.

This is unreliable in the presence of calls to 'dev_set_name()', which may
reallocate the device name string leaving the pinctrl mappings with a
dangling reference. This then leads to a use-after-free every time the
name is dereferenced by a device probe:

  | BUG: KASAN: invalid-access in strcmp+0x20/0x64
  | Read of size 1 at addr 13ffffc153494b00 by task modprobe/590
  | Pointer tag: [13], memory tag: [fe]
  |
  | Call trace:
  |  __kasan_report+0x16c/0x1dc
  |  kasan_report+0x10/0x18
  |  check_memory_region
  |  __hwasan_load1_noabort+0x4c/0x54
  |  strcmp+0x20/0x64
  |  create_pinctrl+0x18c/0x7f4
  |  pinctrl_get+0x90/0x114
  |  devm_pinctrl_get+0x44/0x98
  |  pinctrl_bind_pins+0x5c/0x450
  |  really_probe+0x1c8/0x9a4
  |  driver_probe_device+0x120/0x1d8

Follow the example of sysfs, and duplicate the device name string before
stashing it away in the pinctrl mapping entries.

Cc: Linus Walleij <linus.walleij@linaro.org>
Reported-by: Elena Petrova <lenaptr@google.com>
Tested-by: Elena Petrova <lenaptr@google.com>
Signed-off-by: Will Deacon <will@kernel.org>
Link: https://lore.kernel.org/r/20191002124206.22928-1-will@kernel.org
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2019-12-31 16:34:53 +01:00
..
actions
aspeed
bcm pinctrl: bcm2835: Use define directive for BCM2835_PINCONF_PARAM_PULL 2019-12-01 09:17:32 +01:00
berlin
cirrus pinctrl: madera: Fix uninitialized variable bug in madera_mux_set_mux 2019-12-01 09:16:15 +01:00
freescale
intel pinctrl: cherryview: Allocate IRQ chip dynamic 2019-12-05 09:19:37 +01:00
mediatek pinctrl: mediatek: Update cur_mask in mask/mask ops 2019-07-21 09:03:11 +02:00
meson pinctrl: meson-gxbb: Fix wrong pinning definition for uart_c 2019-10-07 18:57:00 +02:00
mvebu pinctrl: armada-37xx: Fix irq mask access in armada_37xx_irq_set_type() 2019-12-17 20:35:07 +01:00
nomadik
pxa
qcom pinctrl: qcom: ssbi-gpio: fix gpio-hog related boot issues 2019-12-13 08:51:26 +01:00
samsung pinctrl: samsung: Fix device node refcount leaks in S3C64xx wakeup controller init 2019-12-17 20:35:11 +01:00
sh-pfc pinctrl: sh-pfc: sh7734: Fix shifted values in IPSR10 2019-12-05 09:20:35 +01:00
sirf
spear
sprd pinctrl: sprd: Use define directive for sprd_pinconf_params values 2019-10-01 08:26:07 +02:00
stm32 pinctrl: stm32: fix memory leak issue 2019-12-05 09:21:35 +01:00
sunxi pinctrl: sunxi: Fix a memory leak in 'sunxi_pinctrl_build_state()' 2019-12-01 09:16:24 +01:00
tegra pinctrl: tegra: Fix write barrier placement in pmx_writel 2019-10-07 18:56:52 +02:00
ti
uniphier
vt8500
zte pinctrl: zte: fix leaked of_node references 2019-05-31 06:46:09 -07:00
core.c pinctrl: core: make sure strcmp() doesn't get a null parameter 2019-04-20 09:16:01 +02:00
core.h
devicetree.c pinctrl: devicetree: Avoid taking direct reference to device name string 2019-12-31 16:34:53 +01:00
devicetree.h
Kconfig
Makefile
pinconf-generic.c
pinconf.c
pinconf.h
pinctrl-amd.c pinctrl: amd: disable spurious-firing GPIO IRQs 2019-10-07 18:56:55 +02:00
pinctrl-amd.h
pinctrl-artpec6.c
pinctrl-as3722.c
pinctrl-at91-pio4.c pinctrl: at91-pio4: fix has_config check in atmel_pctl_dt_subnode_to_map() 2019-11-20 18:46:35 +01:00
pinctrl-at91.c pinctrl: at91: don't use the same irqchip with multiple gpiochips 2019-11-20 18:46:41 +01:00
pinctrl-at91.h
pinctrl-axp209.c
pinctrl-coh901.c
pinctrl-coh901.h
pinctrl-da850-pupd.c
pinctrl-digicolor.c
pinctrl-falcon.c
pinctrl-gemini.c pinctrl: gemini: Fix up TVC clock group 2019-11-24 08:20:58 +01:00
pinctrl-ingenic.c pinctrl: ingenic: Probe driver at subsys_initcall 2019-11-20 18:45:34 +01:00
pinctrl-lantiq.c
pinctrl-lantiq.h
pinctrl-lpc18xx.c pinctrl: lpc18xx: Use define directive for PIN_CONFIG_GPIO_PIN_INT 2019-12-01 09:17:33 +01:00
pinctrl-max77620.c pinctrl: max77620: Use define directive for max77620_pinconf_param values 2019-02-27 10:09:03 +01:00
pinctrl-mcp23s08.c pinctrl: mcp23s08: Fix add_data and irqchip_add_nested call order 2019-07-21 09:03:08 +02:00
pinctrl-ocelot.c
pinctrl-oxnas.c
pinctrl-palmas.c
pinctrl-pic32.c
pinctrl-pic32.h
pinctrl-pistachio.c pinctrl: pistachio: fix leaked of_node references 2019-05-31 06:46:16 -07:00
pinctrl-rk805.c
pinctrl-rockchip.c pinctrl: rockchip: fix leaked of_node references 2019-07-31 07:26:57 +02:00
pinctrl-rza1.c
pinctrl-single.c
pinctrl-st.c
pinctrl-sx150x.c pinctrl: sx150x: handle failure case of devm_kstrdup 2019-02-12 19:47:06 +01:00
pinctrl-tb10x.c
pinctrl-u300.c
pinctrl-utils.c
pinctrl-utils.h
pinctrl-xway.c pinctrl: xway: fix gpio-hog related boot issues 2019-12-05 09:20:30 +01:00
pinctrl-zynq.c pinctrl: zynq: Use define directive for PIN_CONFIG_IO_STANDARD 2019-12-01 09:17:33 +01:00
pinmux.c
pinmux.h