Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security

Pull TPM bugfixes from James Morris.

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security:
tpm: Propagate error from tpm_transmit to fix a timeout hang
driver/char/tpm: fix regression causesd by ppi

+33 -18
+16 -8
drivers/char/tpm/tpm.c
··· 1182 1182 size_t size, loff_t *off) 1183 1183 { 1184 1184 struct tpm_chip *chip = file->private_data; 1185 - size_t in_size = size, out_size; 1185 + size_t in_size = size; 1186 + ssize_t out_size; 1186 1187 1187 1188 /* cannot perform a write until the read has cleared 1188 - either via tpm_read or a user_read_timer timeout */ 1189 - while (atomic_read(&chip->data_pending) != 0) 1190 - msleep(TPM_TIMEOUT); 1191 - 1192 - mutex_lock(&chip->buffer_mutex); 1189 + either via tpm_read or a user_read_timer timeout. 1190 + This also prevents splitted buffered writes from blocking here. 1191 + */ 1192 + if (atomic_read(&chip->data_pending) != 0) 1193 + return -EBUSY; 1193 1194 1194 1195 if (in_size > TPM_BUFSIZE) 1195 - in_size = TPM_BUFSIZE; 1196 + return -E2BIG; 1197 + 1198 + mutex_lock(&chip->buffer_mutex); 1196 1199 1197 1200 if (copy_from_user 1198 1201 (chip->data_buffer, (void __user *) buf, in_size)) { ··· 1205 1202 1206 1203 /* atomic tpm command send and result receive */ 1207 1204 out_size = tpm_transmit(chip, chip->data_buffer, TPM_BUFSIZE); 1205 + if (out_size < 0) { 1206 + mutex_unlock(&chip->buffer_mutex); 1207 + return out_size; 1208 + } 1208 1209 1209 1210 atomic_set(&chip->data_pending, out_size); 1210 1211 mutex_unlock(&chip->buffer_mutex); ··· 1266 1259 1267 1260 misc_deregister(&chip->vendor.miscdev); 1268 1261 sysfs_remove_group(&dev->kobj, chip->vendor.attr_group); 1262 + tpm_remove_ppi(&dev->kobj); 1269 1263 tpm_bios_log_teardown(chip->bios_dir); 1270 1264 1271 1265 /* write it this way to be explicit (chip->dev == dev) */ ··· 1484 1476 goto put_device; 1485 1477 } 1486 1478 1487 - if (sys_add_ppi(&dev->kobj)) { 1479 + if (tpm_add_ppi(&dev->kobj)) { 1488 1480 misc_deregister(&chip->vendor.miscdev); 1489 1481 goto put_device; 1490 1482 }
+7 -2
drivers/char/tpm/tpm.h
··· 329 329 wait_queue_head_t *); 330 330 331 331 #ifdef CONFIG_ACPI 332 - extern ssize_t sys_add_ppi(struct kobject *parent); 332 + extern int tpm_add_ppi(struct kobject *); 333 + extern void tpm_remove_ppi(struct kobject *); 333 334 #else 334 - static inline ssize_t sys_add_ppi(struct kobject *parent) 335 + static inline int tpm_add_ppi(struct kobject *parent) 335 336 { 336 337 return 0; 338 + } 339 + 340 + static inline void tpm_remove_ppi(struct kobject *parent) 341 + { 337 342 } 338 343 #endif
+10 -8
drivers/char/tpm/tpm_ppi.c
··· 444 444 &dev_attr_vs_operations.attr, NULL, 445 445 }; 446 446 static struct attribute_group ppi_attr_grp = { 447 + .name = "ppi", 447 448 .attrs = ppi_attrs 448 449 }; 449 450 450 - ssize_t sys_add_ppi(struct kobject *parent) 451 + int tpm_add_ppi(struct kobject *parent) 451 452 { 452 - struct kobject *ppi; 453 - ppi = kobject_create_and_add("ppi", parent); 454 - if (sysfs_create_group(ppi, &ppi_attr_grp)) 455 - return -EFAULT; 456 - else 457 - return 0; 453 + return sysfs_create_group(parent, &ppi_attr_grp); 458 454 } 459 - EXPORT_SYMBOL_GPL(sys_add_ppi); 455 + EXPORT_SYMBOL_GPL(tpm_add_ppi); 456 + 457 + void tpm_remove_ppi(struct kobject *parent) 458 + { 459 + sysfs_remove_group(parent, &ppi_attr_grp); 460 + } 461 + EXPORT_SYMBOL_GPL(tpm_remove_ppi); 460 462 461 463 MODULE_LICENSE("GPL");