• Will Deacon's avatar
    pinctrl: devicetree: Avoid taking direct reference to device name string · be4c60b5
    Will Deacon authored
    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: default avatarElena Petrova <lenaptr@google.com>
    Tested-by: default avatarElena Petrova <lenaptr@google.com>
    Signed-off-by: default avatarWill Deacon <will@kernel.org>
    Link: https://lore.kernel.org/r/20191002124206.22928-1-will@kernel.orgSigned-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    be4c60b5
devicetree.c 10.8 KB