Message ID | 1565746427-5366-1-git-send-email-wenwen@cs.uga.edu |
---|---|
State | Rejected |
Delegated to: | David Miller |
Headers | show |
Series | net: pch_gbe: Fix memory leaks | expand |
From: Wenwen Wang <wenwen@cs.uga.edu> Date: Tue, 13 Aug 2019 20:33:45 -0500 > In pch_gbe_set_ringparam(), if netif_running() returns false, 'tx_old' and > 'rx_old' are not deallocated, leading to memory leaks. To fix this issue, > move the free statements after the if branch. > > Signed-off-by: Wenwen Wang <wenwen@cs.uga.edu> Why would they be "deallocated"? They are still assigned to adapter->tx_ring and adapter->rx_ring.
On Thu, Aug 15, 2019 at 3:34 PM David Miller <davem@davemloft.net> wrote: > > From: Wenwen Wang <wenwen@cs.uga.edu> > Date: Tue, 13 Aug 2019 20:33:45 -0500 > > > In pch_gbe_set_ringparam(), if netif_running() returns false, 'tx_old' and > > 'rx_old' are not deallocated, leading to memory leaks. To fix this issue, > > move the free statements after the if branch. > > > > Signed-off-by: Wenwen Wang <wenwen@cs.uga.edu> > > Why would they be "deallocated"? They are still assigned to > adapter->tx_ring and adapter->rx_ring. 'adapter->tx_ring' and 'adapter->rx_ring' has been covered by newly allocated 'txdr' and 'rxdr' respectively before this if statement. Wenwen
From: Wenwen Wang <wenwen@cs.uga.edu> Date: Thu, 15 Aug 2019 16:03:39 -0400 > On Thu, Aug 15, 2019 at 3:34 PM David Miller <davem@davemloft.net> wrote: >> >> From: Wenwen Wang <wenwen@cs.uga.edu> >> Date: Tue, 13 Aug 2019 20:33:45 -0500 >> >> > In pch_gbe_set_ringparam(), if netif_running() returns false, 'tx_old' and >> > 'rx_old' are not deallocated, leading to memory leaks. To fix this issue, >> > move the free statements after the if branch. >> > >> > Signed-off-by: Wenwen Wang <wenwen@cs.uga.edu> >> >> Why would they be "deallocated"? They are still assigned to >> adapter->tx_ring and adapter->rx_ring. > > 'adapter->tx_ring' and 'adapter->rx_ring' has been covered by newly > allocated 'txdr' and 'rxdr' respectively before this if statement. That only happens inside of the if() statement, that's why rx_old and tx_old are only freed in that code path.
On Thu, Aug 15, 2019 at 4:42 PM David Miller <davem@davemloft.net> wrote: > > From: Wenwen Wang <wenwen@cs.uga.edu> > Date: Thu, 15 Aug 2019 16:03:39 -0400 > > > On Thu, Aug 15, 2019 at 3:34 PM David Miller <davem@davemloft.net> wrote: > >> > >> From: Wenwen Wang <wenwen@cs.uga.edu> > >> Date: Tue, 13 Aug 2019 20:33:45 -0500 > >> > >> > In pch_gbe_set_ringparam(), if netif_running() returns false, 'tx_old' and > >> > 'rx_old' are not deallocated, leading to memory leaks. To fix this issue, > >> > move the free statements after the if branch. > >> > > >> > Signed-off-by: Wenwen Wang <wenwen@cs.uga.edu> > >> > >> Why would they be "deallocated"? They are still assigned to > >> adapter->tx_ring and adapter->rx_ring. > > > > 'adapter->tx_ring' and 'adapter->rx_ring' has been covered by newly > > allocated 'txdr' and 'rxdr' respectively before this if statement. > > That only happens inside of the if() statement, that's why rx_old and > tx_old are only freed in that code path. That happens not only inside of the if statement, but also before the if statement, just after 'txdr' and 'rxdr' are allocated. Wenwen
From: Wenwen Wang <wenwen@cs.uga.edu> Date: Thu, 15 Aug 2019 16:46:05 -0400 > On Thu, Aug 15, 2019 at 4:42 PM David Miller <davem@davemloft.net> wrote: >> >> From: Wenwen Wang <wenwen@cs.uga.edu> >> Date: Thu, 15 Aug 2019 16:03:39 -0400 >> >> > On Thu, Aug 15, 2019 at 3:34 PM David Miller <davem@davemloft.net> wrote: >> >> >> >> From: Wenwen Wang <wenwen@cs.uga.edu> >> >> Date: Tue, 13 Aug 2019 20:33:45 -0500 >> >> >> >> > In pch_gbe_set_ringparam(), if netif_running() returns false, 'tx_old' and >> >> > 'rx_old' are not deallocated, leading to memory leaks. To fix this issue, >> >> > move the free statements after the if branch. >> >> > >> >> > Signed-off-by: Wenwen Wang <wenwen@cs.uga.edu> >> >> >> >> Why would they be "deallocated"? They are still assigned to >> >> adapter->tx_ring and adapter->rx_ring. >> > >> > 'adapter->tx_ring' and 'adapter->rx_ring' has been covered by newly >> > allocated 'txdr' and 'rxdr' respectively before this if statement. >> >> That only happens inside of the if() statement, that's why rx_old and >> tx_old are only freed in that code path. > > That happens not only inside of the if statement, but also before the > if statement, just after 'txdr' and 'rxdr' are allocated. Then the assignments inside of the if() statement are redundant. Something doesn't add up here, please make the code consistent.
On Thu, Aug 15, 2019 at 4:51 PM David Miller <davem@davemloft.net> wrote: > > From: Wenwen Wang <wenwen@cs.uga.edu> > Date: Thu, 15 Aug 2019 16:46:05 -0400 > > > On Thu, Aug 15, 2019 at 4:42 PM David Miller <davem@davemloft.net> wrote: > >> > >> From: Wenwen Wang <wenwen@cs.uga.edu> > >> Date: Thu, 15 Aug 2019 16:03:39 -0400 > >> > >> > On Thu, Aug 15, 2019 at 3:34 PM David Miller <davem@davemloft.net> wrote: > >> >> > >> >> From: Wenwen Wang <wenwen@cs.uga.edu> > >> >> Date: Tue, 13 Aug 2019 20:33:45 -0500 > >> >> > >> >> > In pch_gbe_set_ringparam(), if netif_running() returns false, 'tx_old' and > >> >> > 'rx_old' are not deallocated, leading to memory leaks. To fix this issue, > >> >> > move the free statements after the if branch. > >> >> > > >> >> > Signed-off-by: Wenwen Wang <wenwen@cs.uga.edu> > >> >> > >> >> Why would they be "deallocated"? They are still assigned to > >> >> adapter->tx_ring and adapter->rx_ring. > >> > > >> > 'adapter->tx_ring' and 'adapter->rx_ring' has been covered by newly > >> > allocated 'txdr' and 'rxdr' respectively before this if statement. > >> > >> That only happens inside of the if() statement, that's why rx_old and > >> tx_old are only freed in that code path. > > > > That happens not only inside of the if statement, but also before the > > if statement, just after 'txdr' and 'rxdr' are allocated. > > Then the assignments inside of the if() statement are redundant. > > Something doesn't add up here, please make the code consistent. Thanks for your suggestion! I will remove the assignments inside of the if() statement. Wenwen
diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c index 1a3008e..ef6311cd 100644 --- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c +++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c @@ -340,12 +340,12 @@ static int pch_gbe_set_ringparam(struct net_device *netdev, goto err_setup_tx; pch_gbe_free_rx_resources(adapter, rx_old); pch_gbe_free_tx_resources(adapter, tx_old); - kfree(tx_old); - kfree(rx_old); adapter->rx_ring = rxdr; adapter->tx_ring = txdr; err = pch_gbe_up(adapter); } + kfree(tx_old); + kfree(rx_old); return err; err_setup_tx:
In pch_gbe_set_ringparam(), if netif_running() returns false, 'tx_old' and 'rx_old' are not deallocated, leading to memory leaks. To fix this issue, move the free statements after the if branch. Signed-off-by: Wenwen Wang <wenwen@cs.uga.edu> --- drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)