RDMA/amso1100: Fix unitialized pseudo_netdev accessed in c2_register_device

Rework some load-time error handling: c2_register_device() leaked when
it failed, and the function that called it didn't check the return code.

Signed-off-by: Tom Tucker <tom@opengridcomputing.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>

authored by Tom Tucker and committed by Roland Dreier 2ffcab6a f2c238a0

+22 -20
+2 -1
drivers/infiniband/hw/amso1100/c2.c
··· 1155 1155 goto bail10; 1156 1156 } 1157 1157 1158 - c2_register_device(c2dev); 1158 + if (c2_register_device(c2dev)) 1159 + goto bail10; 1159 1160 1160 1161 return 0; 1161 1162
+20 -19
drivers/infiniband/hw/amso1100/c2_provider.c
··· 757 757 758 758 int c2_register_device(struct c2_dev *dev) 759 759 { 760 - int ret; 760 + int ret = -ENOMEM; 761 761 int i; 762 762 763 763 /* Register pseudo network device */ 764 764 dev->pseudo_netdev = c2_pseudo_netdev_init(dev); 765 - if (dev->pseudo_netdev) { 766 - ret = register_netdev(dev->pseudo_netdev); 767 - if (ret) { 768 - printk(KERN_ERR PFX 769 - "Unable to register netdev, ret = %d\n", ret); 770 - free_netdev(dev->pseudo_netdev); 771 - return ret; 772 - } 773 - } 765 + if (!dev->pseudo_netdev) 766 + goto out3; 767 + 768 + ret = register_netdev(dev->pseudo_netdev); 769 + if (ret) 770 + goto out2; 774 771 775 772 pr_debug("%s:%u\n", __FUNCTION__, __LINE__); 776 773 strlcpy(dev->ibdev.name, "amso%d", IB_DEVICE_NAME_MAX); ··· 845 848 846 849 ret = ib_register_device(&dev->ibdev); 847 850 if (ret) 848 - return ret; 851 + goto out1; 849 852 850 853 for (i = 0; i < ARRAY_SIZE(c2_class_attributes); ++i) { 851 854 ret = class_device_create_file(&dev->ibdev.class_dev, 852 855 c2_class_attributes[i]); 853 - if (ret) { 854 - unregister_netdev(dev->pseudo_netdev); 855 - free_netdev(dev->pseudo_netdev); 856 - ib_unregister_device(&dev->ibdev); 857 - return ret; 858 - } 856 + if (ret) 857 + goto out0; 859 858 } 859 + goto out3; 860 860 861 - pr_debug("%s:%u\n", __FUNCTION__, __LINE__); 862 - return 0; 861 + out0: 862 + ib_unregister_device(&dev->ibdev); 863 + out1: 864 + unregister_netdev(dev->pseudo_netdev); 865 + out2: 866 + free_netdev(dev->pseudo_netdev); 867 + out3: 868 + pr_debug("%s:%u ret=%d\n", __FUNCTION__, __LINE__, ret); 869 + return ret; 863 870 } 864 871 865 872 void c2_unregister_device(struct c2_dev *dev)