From 1c00c05b487d4098fe1846bbb9baf8c2776edb1b Mon Sep 17 00:00:00 2001 From: Alexander Viro Date: Thu, 11 Dec 2003 08:35:18 -0800 Subject: [PATCH] [NET]: Fix missing netdev unregister/free in netrom and rose protocols. Also, fix a object size vs. pointer size thinko. --- net/netrom/af_netrom.c | 11 ++++++++--- net/netrom/nr_dev.c | 1 - net/rose/af_rose.c | 28 +++++++++++++--------------- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c index 38a6f9ab7980c..45333133d8911 100644 --- a/net/netrom/af_netrom.c +++ b/net/netrom/af_netrom.c @@ -1377,7 +1377,7 @@ static int __init nr_proto_init(void) { int i; - if (nr_ndevs > 0x7fffffff/sizeof(struct net_device)) { + if (nr_ndevs > 0x7fffffff/sizeof(struct net_device *)) { printk(KERN_ERR "NET/ROM: nr_proto_init - nr_ndevs parameter to large\n"); return -1; } @@ -1405,6 +1405,7 @@ static int __init nr_proto_init(void) dev->base_addr = i; if (register_netdev(dev)) { printk(KERN_ERR "NET/ROM: nr_proto_init - unable to register network device\n"); + free_netdev(dev); goto fail; } dev_nr[i] = dev; @@ -1433,8 +1434,10 @@ static int __init nr_proto_init(void) return 0; fail: - while (--i >= 0) + while (--i >= 0) { unregister_netdev(dev_nr[i]); + free_netdev(dev_nr[i]); + } kfree(dev_nr); return -1; } @@ -1474,8 +1477,10 @@ static void __exit nr_exit(void) for (i = 0; i < nr_ndevs; i++) { struct net_device *dev = dev_nr[i]; - if (dev) + if (dev) { unregister_netdev(dev); + free_netdev(dev); + } } kfree(dev_nr); diff --git a/net/netrom/nr_dev.c b/net/netrom/nr_dev.c index a86becaacc2ab..ffe06bf32ae64 100644 --- a/net/netrom/nr_dev.c +++ b/net/netrom/nr_dev.c @@ -204,7 +204,6 @@ void nr_setup(struct net_device *dev) dev->hard_start_xmit = nr_xmit; dev->open = nr_open; dev->stop = nr_close; - dev->destructor = free_netdev; dev->hard_header = nr_header; dev->hard_header_len = NR_NETWORK_LEN + NR_TRANSPORT_LEN; diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c index db2eb09e57896..db94b996cb025 100644 --- a/net/rose/af_rose.c +++ b/net/rose/af_rose.c @@ -1481,7 +1481,7 @@ static int __init rose_proto_init(void) rose_callsign = null_ax25_address; - if (rose_ndevs > 0x7FFFFFFF/sizeof(struct net_device)) { + if (rose_ndevs > 0x7FFFFFFF/sizeof(struct net_device *)) { printk(KERN_ERR "ROSE: rose_proto_init - rose_ndevs parameter to large\n"); return -1; } @@ -1502,23 +1502,14 @@ static int __init rose_proto_init(void) name, rose_setup); if (!dev) { printk(KERN_ERR "ROSE: rose_proto_init - unable to allocate memory\n"); - while (--i >= 0) - kfree(dev_rose[i]); - return -ENOMEM; + goto fail; } - dev_rose[i] = dev; - } - - for (i = 0; i < rose_ndevs; i++) { - if (register_netdev(dev_rose[i])) { + if (register_netdev(dev)) { printk(KERN_ERR "ROSE: netdevice regeistration failed\n"); - while (--i >= 0) { - unregister_netdev(dev_rose[i]); - kfree(dev_rose[i]); - return -EIO; - } + free_netdev(dev); + goto fail; } - + dev_rose[i] = dev; } sock_register(&rose_family_ops); @@ -1541,6 +1532,13 @@ static int __init rose_proto_init(void) proc_net_fops_create("rose_routes", S_IRUGO, &rose_routes_fops); return 0; +fail: + while (--i >= 0) { + unregister_netdev(dev_rose[i]); + free_netdev(dev_rose[i]); + } + kfree(dev_rose); + return -ENOMEM; } module_init(rose_proto_init); -- 2.53.0