lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-Id: <9f7df9a0e81f9200505daf4499117314244f0356.1493699451.git.gfree.wind@foxmail.com> Date: Tue, 2 May 2017 13:58:43 +0800 From: gfree.wind@...mail.com To: davem@...emloft.net, jiri@...nulli.us, mareklindner@...mailbox.ch, sw@...onwunderlich.de, a@...table.cc, kuznet@....inr.ac.ru, jmorris@...ei.org, yoshfuji@...ux-ipv6.org, kaber@...sh.net, steffen.klassert@...unet.com, herbert@...dor.apana.org.au, netdev@...r.kernel.org Cc: Gao Feng <gfree.wind@...mail.com> Subject: [PATCH net v4 01/12] driver: dummy: Fix one possbile memleak when fail to register_netdevice From: Gao Feng <gfree.wind@...mail.com> The dummy driver allocates dev->dstats and priv->vfinfo in its ndo_init func dummy_dev_init, free the dev->dstats in the ndo_uninit and free the priv->vfinfo in its destructor func. Then there is one memleak that some errors happen after register_netdevice invokes the ndo_init callback. Because only the ndo_uninit callback is invoked in the error handler of register_netdevice, but destructor not. Now create one new func dummy_destructor_free to free the mem in the destructor, and the ndo_uninit func also invokes it when fail to register the dummy device. It's not only free all resources, but also follow the original desgin that the priv->vfinfo is freed in the destructor normally after register the device successfully. Signed-off-by: Gao Feng <gfree.wind@...mail.com> --- drivers/net/dummy.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/drivers/net/dummy.c b/drivers/net/dummy.c index 2c80611..0b3c1cc 100644 --- a/drivers/net/dummy.c +++ b/drivers/net/dummy.c @@ -153,9 +153,19 @@ static int dummy_dev_init(struct net_device *dev) return 0; } +static void dummy_destructor_free(struct net_device *dev) +{ + struct dummy_priv *priv = netdev_priv(dev); + + kfree(priv->vfinfo); +} + static void dummy_dev_uninit(struct net_device *dev) { free_percpu(dev->dstats); + /* dev is not registered, perform the free instead of destructor */ + if (dev->reg_state == NETREG_UNINITIALIZED) + dummy_destructor_free(dev); } static int dummy_change_carrier(struct net_device *dev, bool new_carrier) @@ -310,9 +320,7 @@ static void dummy_get_drvinfo(struct net_device *dev, static void dummy_free_netdev(struct net_device *dev) { - struct dummy_priv *priv = netdev_priv(dev); - - kfree(priv->vfinfo); + dummy_destructor_free(dev); free_netdev(dev); } -- 1.9.1
Powered by blists - more mailing lists