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.

[PATCH] Infineon TPM: IO-port leakage fix, WTX-bugfix

Fix IO-port leakage from request_region in case of error during TPM
initialization, adds more pnp-verification and fixes a WTX-bug.

Signed-off-by: Marcel Selhorst <selhorst@crypto.rub.de>
Acked-by: Kylene Jo Hall <kjhall@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

Marcel Selhorst and committed by
Linus Torvalds
8c9e8779 b2f49033

+34 -14
+34 -14
drivers/char/tpm/tpm_infineon.c
··· 33 33 static int TPM_INF_DATA; 34 34 static int TPM_INF_ADDR; 35 35 static int TPM_INF_BASE; 36 + static int TPM_INF_ADDR_LEN; 36 37 static int TPM_INF_PORT_LEN; 37 38 38 39 /* TPM header definitions */ ··· 196 195 int i; 197 196 int ret; 198 197 u32 size = 0; 198 + number_of_wtx = 0; 199 199 200 200 recv_begin: 201 201 /* start receiving header */ ··· 380 378 if (pnp_port_valid(dev, 0) && pnp_port_valid(dev, 1) && 381 379 !(pnp_port_flags(dev, 0) & IORESOURCE_DISABLED)) { 382 380 TPM_INF_ADDR = pnp_port_start(dev, 0); 381 + TPM_INF_ADDR_LEN = pnp_port_len(dev, 0); 383 382 TPM_INF_DATA = (TPM_INF_ADDR + 1); 384 383 TPM_INF_BASE = pnp_port_start(dev, 1); 385 384 TPM_INF_PORT_LEN = pnp_port_len(dev, 1); 386 - if (!TPM_INF_PORT_LEN) 387 - return -EINVAL; 385 + if ((TPM_INF_PORT_LEN < 4) || (TPM_INF_ADDR_LEN < 2)) { 386 + rc = -EINVAL; 387 + goto err_last; 388 + } 388 389 dev_info(&dev->dev, "Found %s with ID %s\n", 389 390 dev->name, dev_id->id); 390 - if (!((TPM_INF_BASE >> 8) & 0xff)) 391 - return -EINVAL; 391 + if (!((TPM_INF_BASE >> 8) & 0xff)) { 392 + rc = -EINVAL; 393 + goto err_last; 394 + } 392 395 /* publish my base address and request region */ 393 396 tpm_inf.base = TPM_INF_BASE; 394 397 if (request_region 395 398 (tpm_inf.base, TPM_INF_PORT_LEN, "tpm_infineon0") == NULL) { 396 - release_region(tpm_inf.base, TPM_INF_PORT_LEN); 397 - return -EINVAL; 399 + rc = -EINVAL; 400 + goto err_last; 401 + } 402 + if (request_region(TPM_INF_ADDR, TPM_INF_ADDR_LEN, 403 + "tpm_infineon0") == NULL) { 404 + rc = -EINVAL; 405 + goto err_last; 398 406 } 399 407 } else { 400 - return -EINVAL; 408 + rc = -EINVAL; 409 + goto err_last; 401 410 } 402 411 403 412 /* query chip for its vendor, its version number a.s.o. */ ··· 456 443 dev_err(&dev->dev, 457 444 "Could not set IO-ports to 0x%lx\n", 458 445 tpm_inf.base); 459 - release_region(tpm_inf.base, TPM_INF_PORT_LEN); 460 - return -EIO; 446 + rc = -EIO; 447 + goto err_release_region; 461 448 } 462 449 463 450 /* activate register */ ··· 484 471 485 472 rc = tpm_register_hardware(&dev->dev, &tpm_inf); 486 473 if (rc < 0) { 487 - release_region(tpm_inf.base, TPM_INF_PORT_LEN); 488 - return -ENODEV; 474 + rc = -ENODEV; 475 + goto err_release_region; 489 476 } 490 477 return 0; 491 478 } else { 492 - dev_info(&dev->dev, "No Infineon TPM found!\n"); 493 - return -ENODEV; 479 + rc = -ENODEV; 480 + goto err_release_region; 494 481 } 482 + 483 + err_release_region: 484 + release_region(tpm_inf.base, TPM_INF_PORT_LEN); 485 + release_region(TPM_INF_ADDR, TPM_INF_ADDR_LEN); 486 + 487 + err_last: 488 + return rc; 495 489 } 496 490 497 491 static __devexit void tpm_inf_pnp_remove(struct pnp_dev *dev) ··· 538 518 539 519 MODULE_AUTHOR("Marcel Selhorst <selhorst@crypto.rub.de>"); 540 520 MODULE_DESCRIPTION("Driver for Infineon TPM SLD 9630 TT 1.1 / SLB 9635 TT 1.2"); 541 - MODULE_VERSION("1.6"); 521 + MODULE_VERSION("1.7"); 542 522 MODULE_LICENSE("GPL");