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

xtensa: iss: fix handling error cases in iss_net_configure()

The 'pdev' and 'netdev' need to be released in error cases of
iss_net_configure().

Change the return type of iss_net_configure() to void, because it's
not used.

Fixes: 7282bee78798 ("[PATCH] xtensa: Architecture support for Tensilica Xtensa Part 8")
Reported-by: Hulk Robot <hulkci@huawei.com>
Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>

authored by

Yang Yingliang and committed by
Max Filippov
628ccfc8 8864fb83

+15 -17
+15 -17
arch/xtensa/platforms/iss/network.c
··· 475 475 free_netdev(lp->dev); 476 476 } 477 477 478 - static int iss_net_configure(int index, char *init) 478 + static void iss_net_configure(int index, char *init) 479 479 { 480 480 struct net_device *dev; 481 481 struct iss_net_private *lp; 482 - int err; 483 482 484 483 dev = alloc_etherdev(sizeof(*lp)); 485 484 if (dev == NULL) { 486 485 pr_err("eth_configure: failed to allocate device\n"); 487 - return 1; 486 + return; 488 487 } 489 488 490 489 /* Initialize private element. */ ··· 510 511 if (!tuntap_probe(lp, index, init)) { 511 512 pr_err("%s: invalid arguments. Skipping device!\n", 512 513 dev->name); 513 - goto errout; 514 + goto err_free_netdev; 514 515 } 515 516 516 517 pr_info("Netdevice %d (%pM)\n", index, dev->dev_addr); ··· 518 519 /* sysfs register */ 519 520 520 521 if (!driver_registered) { 521 - platform_driver_register(&iss_net_driver); 522 + if (platform_driver_register(&iss_net_driver)) 523 + goto err_free_netdev; 522 524 driver_registered = 1; 523 525 } 524 526 525 527 lp->pdev.id = index; 526 528 lp->pdev.name = DRIVER_NAME; 527 529 lp->pdev.dev.release = iss_net_pdev_release; 528 - platform_device_register(&lp->pdev); 530 + if (platform_device_register(&lp->pdev)) 531 + goto err_free_netdev; 529 532 SET_NETDEV_DEV(dev, &lp->pdev.dev); 530 533 531 534 dev->netdev_ops = &iss_netdev_ops; ··· 536 535 dev->irq = -1; 537 536 538 537 rtnl_lock(); 539 - err = register_netdevice(dev); 540 - rtnl_unlock(); 541 - 542 - if (err) { 538 + if (register_netdevice(dev)) { 539 + rtnl_unlock(); 543 540 pr_err("%s: error registering net device!\n", dev->name); 544 - /* XXX: should we call ->remove() here? */ 545 - free_netdev(dev); 546 - return 1; 541 + platform_device_unregister(&lp->pdev); 542 + return; 547 543 } 544 + rtnl_unlock(); 548 545 549 546 timer_setup(&lp->tl, iss_net_user_timer_expire, 0); 550 547 551 - return 0; 548 + return; 552 549 553 - errout: 554 - /* FIXME: unregister; free, etc.. */ 555 - return -EIO; 550 + err_free_netdev: 551 + free_netdev(dev); 556 552 } 557 553 558 554 /* ------------------------------------------------------------------------- */