@@ -1392,18 +1392,22 @@ static int __init nr_proto_init(void)
13921392 int i ;
13931393 int rc = proto_register (& nr_proto , 0 );
13941394
1395- if (rc != 0 )
1396- goto out ;
1395+ if (rc )
1396+ return rc ;
13971397
13981398 if (nr_ndevs > 0x7fffffff /sizeof (struct net_device * )) {
1399- printk (KERN_ERR "NET/ROM: nr_proto_init - nr_ndevs parameter to large\n" );
1400- return -1 ;
1399+ pr_err ("NET/ROM: %s - nr_ndevs parameter too large\n" ,
1400+ __func__ );
1401+ rc = - EINVAL ;
1402+ goto unregister_proto ;
14011403 }
14021404
14031405 dev_nr = kcalloc (nr_ndevs , sizeof (struct net_device * ), GFP_KERNEL );
1404- if (dev_nr == NULL ) {
1405- printk (KERN_ERR "NET/ROM: nr_proto_init - unable to allocate device array\n" );
1406- return -1 ;
1406+ if (!dev_nr ) {
1407+ pr_err ("NET/ROM: %s - unable to allocate device array\n" ,
1408+ __func__ );
1409+ rc = - ENOMEM ;
1410+ goto unregister_proto ;
14071411 }
14081412
14091413 for (i = 0 ; i < nr_ndevs ; i ++ ) {
@@ -1413,50 +1417,78 @@ static int __init nr_proto_init(void)
14131417 sprintf (name , "nr%d" , i );
14141418 dev = alloc_netdev (0 , name , NET_NAME_UNKNOWN , nr_setup );
14151419 if (!dev ) {
1416- printk ( KERN_ERR "NET/ROM: nr_proto_init - unable to allocate device structure\n" ) ;
1420+ rc = - ENOMEM ;
14171421 goto fail ;
14181422 }
14191423
14201424 dev -> base_addr = i ;
1421- if ( register_netdev (dev )) {
1422- printk ( KERN_ERR "NET/ROM: nr_proto_init - unable to register network device\n" );
1425+ rc = register_netdev (dev );
1426+ if ( rc ) {
14231427 free_netdev (dev );
14241428 goto fail ;
14251429 }
14261430 nr_set_lockdep_key (dev );
14271431 dev_nr [i ] = dev ;
14281432 }
14291433
1430- if ( sock_register (& nr_family_ops )) {
1431- printk ( KERN_ERR "NET/ROM: nr_proto_init - unable to register socket family\n" );
1434+ rc = sock_register (& nr_family_ops );
1435+ if ( rc )
14321436 goto fail ;
1433- }
14341437
1435- register_netdevice_notifier (& nr_dev_notifier );
1438+ rc = register_netdevice_notifier (& nr_dev_notifier );
1439+ if (rc )
1440+ goto out_sock ;
14361441
14371442 ax25_register_pid (& nr_pid );
14381443 ax25_linkfail_register (& nr_linkfail_notifier );
14391444
14401445#ifdef CONFIG_SYSCTL
1441- nr_register_sysctl ();
1446+ rc = nr_register_sysctl ();
1447+ if (rc )
1448+ goto out_sysctl ;
14421449#endif
14431450
14441451 nr_loopback_init ();
14451452
1446- proc_create_seq ("nr" , 0444 , init_net .proc_net , & nr_info_seqops );
1447- proc_create_seq ("nr_neigh" , 0444 , init_net .proc_net , & nr_neigh_seqops );
1448- proc_create_seq ("nr_nodes" , 0444 , init_net .proc_net , & nr_node_seqops );
1449- out :
1450- return rc ;
1453+ rc = - ENOMEM ;
1454+ if (!proc_create_seq ("nr" , 0444 , init_net .proc_net , & nr_info_seqops ))
1455+ goto proc_remove1 ;
1456+ if (!proc_create_seq ("nr_neigh" , 0444 , init_net .proc_net ,
1457+ & nr_neigh_seqops ))
1458+ goto proc_remove2 ;
1459+ if (!proc_create_seq ("nr_nodes" , 0444 , init_net .proc_net ,
1460+ & nr_node_seqops ))
1461+ goto proc_remove3 ;
1462+
1463+ return 0 ;
1464+
1465+ proc_remove3 :
1466+ remove_proc_entry ("nr_neigh" , init_net .proc_net );
1467+ proc_remove2 :
1468+ remove_proc_entry ("nr" , init_net .proc_net );
1469+ proc_remove1 :
1470+
1471+ nr_loopback_clear ();
1472+ nr_rt_free ();
1473+
1474+ #ifdef CONFIG_SYSCTL
1475+ nr_unregister_sysctl ();
1476+ out_sysctl :
1477+ #endif
1478+ ax25_linkfail_release (& nr_linkfail_notifier );
1479+ ax25_protocol_release (AX25_P_NETROM );
1480+ unregister_netdevice_notifier (& nr_dev_notifier );
1481+ out_sock :
1482+ sock_unregister (PF_NETROM );
14511483fail :
14521484 while (-- i >= 0 ) {
14531485 unregister_netdev (dev_nr [i ]);
14541486 free_netdev (dev_nr [i ]);
14551487 }
14561488 kfree (dev_nr );
1489+ unregister_proto :
14571490 proto_unregister (& nr_proto );
1458- rc = -1 ;
1459- goto out ;
1491+ return rc ;
14601492}
14611493
14621494module_init (nr_proto_init );
0 commit comments