1. 08 3月, 2022 1 次提交
    • L
      tpm: fix reference counting for struct tpm_chip · 7e0438f8
      Lino Sanfilippo 提交于
      The following sequence of operations results in a refcount warning:
      
      1. Open device /dev/tpmrm.
      2. Remove module tpm_tis_spi.
      3. Write a TPM command to the file descriptor opened at step 1.
      
      ------------[ cut here ]------------
      WARNING: CPU: 3 PID: 1161 at lib/refcount.c:25 kobject_get+0xa0/0xa4
      refcount_t: addition on 0; use-after-free.
      Modules linked in: tpm_tis_spi tpm_tis_core tpm mdio_bcm_unimac brcmfmac
      sha256_generic libsha256 sha256_arm hci_uart btbcm bluetooth cfg80211 vc4
      brcmutil ecdh_generic ecc snd_soc_core crc32_arm_ce libaes
      raspberrypi_hwmon ac97_bus snd_pcm_dmaengine bcm2711_thermal snd_pcm
      snd_timer genet snd phy_generic soundcore [last unloaded: spi_bcm2835]
      CPU: 3 PID: 1161 Comm: hold_open Not tainted 5.10.0ls-main-dirty #2
      Hardware name: BCM2711
      [<c0410c3c>] (unwind_backtrace) from [<c040b580>] (show_stack+0x10/0x14)
      [<c040b580>] (show_stack) from [<c1092174>] (dump_stack+0xc4/0xd8)
      [<c1092174>] (dump_stack) from [<c0445a30>] (__warn+0x104/0x108)
      [<c0445a30>] (__warn) from [<c0445aa8>] (warn_slowpath_fmt+0x74/0xb8)
      [<c0445aa8>] (warn_slowpath_fmt) from [<c08435d0>] (kobject_get+0xa0/0xa4)
      [<c08435d0>] (kobject_get) from [<bf0a715c>] (tpm_try_get_ops+0x14/0x54 [tpm])
      [<bf0a715c>] (tpm_try_get_ops [tpm]) from [<bf0a7d6c>] (tpm_common_write+0x38/0x60 [tpm])
      [<bf0a7d6c>] (tpm_common_write [tpm]) from [<c05a7ac0>] (vfs_write+0xc4/0x3c0)
      [<c05a7ac0>] (vfs_write) from [<c05a7ee4>] (ksys_write+0x58/0xcc)
      [<c05a7ee4>] (ksys_write) from [<c04001a0>] (ret_fast_syscall+0x0/0x4c)
      Exception stack(0xc226bfa8 to 0xc226bff0)
      bfa0:                   00000000 000105b4 00000003 beafe664 00000014 00000000
      bfc0: 00000000 000105b4 000103f8 00000004 00000000 00000000 b6f9c000 beafe684
      bfe0: 0000006c beafe648 0001056c b6eb6944
      ---[ end trace d4b8409def9b8b1f ]---
      
      The reason for this warning is the attempt to get the chip->dev reference
      in tpm_common_write() although the reference counter is already zero.
      
      Since commit 8979b02a ("tpm: Fix reference count to main device") the
      extra reference used to prevent a premature zero counter is never taken,
      because the required TPM_CHIP_FLAG_TPM2 flag is never set.
      
      Fix this by moving the TPM 2 character device handling from
      tpm_chip_alloc() to tpm_add_char_device() which is called at a later point
      in time when the flag has been set in case of TPM2.
      
      Commit fdc915f7 ("tpm: expose spaces via a device link /dev/tpmrm<n>")
      already introduced function tpm_devs_release() to release the extra
      reference but did not implement the required put on chip->devs that results
      in the call of this function.
      
      Fix this by putting chip->devs in tpm_chip_unregister().
      
      Finally move the new implementation for the TPM 2 handling into a new
      function to avoid multiple checks for the TPM_CHIP_FLAG_TPM2 flag in the
      good case and error cases.
      
      Cc: stable@vger.kernel.org
      Fixes: fdc915f7 ("tpm: expose spaces via a device link /dev/tpmrm<n>")
      Fixes: 8979b02a ("tpm: Fix reference count to main device")
      Co-developed-by: NJason Gunthorpe <jgg@ziepe.ca>
      Signed-off-by: NJason Gunthorpe <jgg@ziepe.ca>
      Signed-off-by: NLino Sanfilippo <LinoSanfilippo@gmx.de>
      Tested-by: NStefan Berger <stefanb@linux.ibm.com>
      Reviewed-by: NJason Gunthorpe <jgg@nvidia.com>
      Reviewed-by: NJarkko Sakkinen <jarkko@kernel.org>
      Signed-off-by: NJarkko Sakkinen <jarkko@kernel.org>
      7e0438f8
  2. 16 2月, 2021 1 次提交
    • J
      KEYS: trusted: Reserve TPM for seal and unseal operations · 8c657a05
      Jarkko Sakkinen 提交于
      When TPM 2.0 trusted keys code was moved to the trusted keys subsystem,
      the operations were unwrapped from tpm_try_get_ops() and tpm_put_ops(),
      which are used to take temporarily the ownership of the TPM chip. The
      ownership is only taken inside tpm_send(), but this is not sufficient,
      as in the key load TPM2_CC_LOAD, TPM2_CC_UNSEAL and TPM2_FLUSH_CONTEXT
      need to be done as a one single atom.
      
      Take the TPM chip ownership before sending anything with
      tpm_try_get_ops() and tpm_put_ops(), and use tpm_transmit_cmd() to send
      TPM commands instead of tpm_send(), reverting back to the old behaviour.
      
      Fixes: 2e19e101 ("KEYS: trusted: Move TPM2 trusted keys code")
      Reported-by: N"James E.J. Bottomley" <James.Bottomley@HansenPartnership.com>
      Cc: stable@vger.kernel.org
      Cc: David Howells <dhowells@redhat.com>
      Cc: Mimi Zohar <zohar@linux.ibm.com>
      Cc: Sumit Garg <sumit.garg@linaro.org>
      Acked-by Sumit Garg <sumit.garg@linaro.org>
      Tested-by: NMimi Zohar <zohar@linux.ibm.com>
      Signed-off-by: NJarkko Sakkinen <jarkko@kernel.org>
      8c657a05
  3. 24 7月, 2020 1 次提交
  4. 16 3月, 2020 1 次提交
  5. 13 3月, 2020 1 次提交
  6. 17 12月, 2019 1 次提交
  7. 13 11月, 2019 5 次提交
  8. 05 8月, 2019 1 次提交
  9. 05 6月, 2019 1 次提交
  10. 13 2月, 2019 14 次提交
  11. 13 11月, 2018 13 次提交