linux-uconsole/drivers
Peter Huewe 39a088528e tpm: Propagate error from tpm_transmit to fix a timeout hang
commit abce9ac292 upstream.

tpm_write calls tpm_transmit without checking the return value and
assigns the return value unconditionally to chip->pending_data, even if
it's an error value.
This causes three bugs.

So if we write to /dev/tpm0 with a tpm_param_size bigger than
TPM_BUFSIZE=0x1000 (e.g. 0x100a)
and a bufsize also bigger than TPM_BUFSIZE (e.g. 0x100a)
tpm_transmit returns -E2BIG which is assigned to chip->pending_data as
-7, but tpm_write returns that TPM_BUFSIZE bytes have been successfully
been written to the TPM, altough this is not true (bug #1).

As we did write more than than TPM_BUFSIZE bytes but tpm_write reports
that only TPM_BUFSIZE bytes have been written the vfs tries to write
the remaining bytes (in this case 10 bytes) to the tpm device driver via
tpm_write which then blocks at

 /* cannot perform a write until the read has cleared
 either via tpm_read or a user_read_timer timeout */
 while (atomic_read(&chip->data_pending) != 0)
	 msleep(TPM_TIMEOUT);

for 60 seconds, since data_pending is -7 and nobody is able to
read it (since tpm_read luckily checks if data_pending is greater than
0) (#bug 2).

After that the remaining bytes are written to the TPM which are
interpreted by the tpm as a normal command. (bug #3)
So if the last bytes of the command stream happen to be a e.g.
tpm_force_clear this gets accidentally sent to the TPM.

This patch fixes all three bugs, by propagating the error code of
tpm_write and returning -E2BIG if the input buffer is too big,
since the response from the tpm for a truncated value is bogus anyway.
Moreover it returns -EBUSY to userspace if there is a response ready to be
read.

Signed-off-by: Peter Huewe <peter.huewe@infineon.com>
Signed-off-by: Kent Yoder <key@linux.vnet.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2012-10-21 09:17:12 -07:00
..
accessibility
acpi ACPI: EC: Add a quirk for CLEVO M720T/M730T laptop 2012-10-21 09:17:09 -07:00
amba
ata libata: Prevent interface errors with Seagate FreeAgent GoFlex 2012-10-02 09:47:41 -07:00
atm solos-pci: Fix DMA support 2012-06-10 00:32:58 +09:00
auxdisplay
base PM / Runtime: Clear power.deferred_resume on success in rpm_suspend() 2012-10-02 09:47:40 -07:00
bcma
block aoe: assert AoE packets marked as requiring no checksum 2012-10-13 05:28:08 +09:00
bluetooth Bluetooth: Add support for Apple vendor-specific devices 2012-10-02 09:47:41 -07:00
cdrom cdrom: use copy_to_user() without the underscores 2012-02-29 16:34:35 -08:00
char tpm: Propagate error from tpm_transmit to fix a timeout hang 2012-10-21 09:17:12 -07:00
clk
clocksource
connector
cpufreq cpufreq/powernow-k8: workqueue user shouldn't migrate the kworker to another CPU 2012-10-02 09:47:22 -07:00
cpuidle
crypto crypto: mv_cesa requires on CRYPTO_HASH to build 2012-05-21 09:40:03 -07:00
dca
dio
dma dmaengine: at_hdmac: check that each sg data length is non-null 2012-10-02 09:47:37 -07:00
edac x86: Simplify code by removing a !SMP #ifdefs from 'struct cpuinfo_x86' 2012-08-15 12:04:09 -07:00
eisa
firewire firewire: cdev: fix user memory corruption (i386 userland on amd64 kernel) 2012-10-21 09:17:10 -07:00
firmware firmware: Add missing attributes to EFI variable attribute print out from sysfs 2012-10-07 08:27:25 -07:00
gpio pch_gpio: Support new device LAPIS Semiconductor ML7831 IOH 2012-05-21 09:40:05 -07:00
gpu drm/radeon: Don't destroy I2C Bus Rec in radeon_ext_tmds_enc_destroy(). 2012-10-21 09:17:12 -07:00
hid HID: add more hotkeys in Asus AIO keyboards 2012-04-02 09:27:12 -07:00
hwmon hwmon: (ads7871) Add 'name' sysfs attribute 2012-10-02 09:47:26 -07:00
hwspinlock hwspinlock/core: use a mutex to protect the radix tree 2011-11-11 09:36:31 -08:00
i2c i2c: davinci: Free requested IRQ in remove 2012-06-01 15:13:01 +08:00
ide block: add and use scsi_blk_cmd_ioctl 2012-01-25 17:24:54 -08:00
idle intel_idle: fix API misuse 2012-01-25 17:24:56 -08:00
ieee802154
infiniband IB/srp: Avoid having aborted requests hang 2012-10-07 08:27:27 -07:00
input Input: i8042 - disable mux on Toshiba C850D 2012-10-02 09:47:27 -07:00
isdn isdnloop: fix and simplify isdnloop_init() 2012-10-02 09:47:05 -07:00
leds Revert "leds: save the delay values after a successful call to blink_set()" 2011-11-21 14:31:19 -08:00
lguest
macintosh
mca
md dm: handle requests beyond end of device instead of using BUG_ON 2012-10-07 08:27:23 -07:00
media media: rc: ite-cir: Initialise ite_dev::rdev earlier 2012-10-13 05:28:02 +09:00
memstick
message
mfd ARM: pxa: remove irq_to_gpio from ezx-pcap driver 2012-08-15 12:04:30 -07:00
misc drivers/misc/sgi-xp/xpc_uv.c: SGI XPC fails to load when cpu 0 is out of IRQ resources 2012-10-02 09:47:40 -07:00
mmc mmc: Prevent 1.8V switch for SD hosts that don't support UHS modes. 2012-10-02 09:47:54 -07:00
mtd mtd: omap2: fix module loading 2012-10-13 05:28:15 +09:00
net tg3: Apply short DMA frag workaround to 5906 2012-10-21 09:17:11 -07:00
nfc
nubus
of
oprofile oprofile: perf: use NR_CPUS instead or nr_cpumask_bits for static array 2012-07-16 08:47:48 -07:00
parisc
parport
pci PCI: Check P2P bridge for invalid secondary/subordinate range 2012-10-13 05:28:09 +09:00
pcmcia pcmcia: fix socket refcount decrementing on each resume 2012-02-13 11:06:10 -08:00
platform asus-nb-wmi: add some video toggle keys 2012-10-02 09:47:40 -07:00
pnp PNPACPI: Fix device ref leaking in acpi_pnp_match 2012-04-13 08:14:05 -07:00
power drivers/power/ds2780_battery.c: fix deadlock upon insertion and removal 2011-11-11 09:36:32 -08:00
pps
ps3
ptp ptp: Fix clock_getres() implementation 2011-12-21 12:57:36 -08:00
rapidio rapidio: fix use of non-compatible registers 2011-10-03 11:39:46 -07:00
regulator regulator: Fix the logic to ensure new voltage setting in valid range 2012-05-21 09:39:58 -07:00
rtc drivers/rtc/rtc-rs5c348.c: fix hour decoding in 12-hour mode 2012-10-02 09:47:39 -07:00
s390 SCSI: zfcp: only access zfcp_scsi_dev for valid scsi_device 2012-10-13 05:28:09 +09:00
sbus
scsi drivers/scsi/atp870u.c: fix bad use of udelay 2012-10-13 05:28:03 +09:00
sfi
sh
sn
spi spi/spi-fsl-spi: reference correct pdata in fsl_spi_cs_control 2012-10-02 09:47:54 -07:00
ssb ssb: fix init regression with SoCs 2012-01-06 14:13:48 -08:00
staging staging: comedi: fix memory leak for saved channel list 2012-10-07 08:27:24 -07:00
target target: Fix ->data_length re-assignment bug with SCSI overflow 2012-10-02 09:47:23 -07:00
tc
telephony
thermal
tty n_gsm: memory leak in uplink error path 2012-10-07 08:27:26 -07:00
uio
usb Add CDC-ACM support for the CX93010-2x UCMxx USB Modem 2012-10-21 09:17:11 -07:00
uwb uwb: fix error handling 2012-04-27 09:51:06 -07:00
vhost vhost: don't forget to schedule() 2012-07-16 08:47:51 -07:00
video viafb: don't touch clock state on OLPC XO-1.5 2012-10-21 09:17:10 -07:00
virtio virtio-pci: fix use after free 2011-11-21 14:31:14 -08:00
vlynq
w1 drivers/power/ds2780_battery.c: add a nolock function to w1 interface 2011-11-11 09:36:32 -08:00
watchdog hpwdt: Fix kdump issue in hpwdt 2012-10-02 09:47:27 -07:00
xen xen/xenbus: Add quirk to deal with misconfigured backends. 2012-04-27 09:51:05 -07:00
zorro zorro: Defer device_register() until all devices have been identified 2011-10-03 11:40:57 -07:00
Kconfig
Makefile