Skip to content

Commit 7dac298

Browse files
f6bvpgregkh
authored andcommitted
rose: fix dev_put() leak in rose_loopback_timer()
commit ff91adc54db2b62c7cdf063ff761eceb5adf2215 upstream. rose_rx_call_request() always consumes or returns the skb but never releases the device reference obtained from rose_dev_get(). When rose_rx_call_request() succeeds (returns non-zero) dev_put() was never called, leaking one reference per loopback CALL_REQUEST. Move dev_put() outside the conditional so it is called unconditionally after rose_rx_call_request() in all cases. Also remove the dead check (!rose_loopback_neigh->dev && !rose_loopback_neigh->loopback) that immediately precedes it: the loopback neighbour always has loopback=1 so this condition can never be true. Fixes: 0453c68 ("net/rose: fix unbound loop in rose_loopback_timer()") Signed-off-by: Bernard Pidoux <bernard.f6bvp@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 19b3691 commit 7dac298

1 file changed

Lines changed: 2 additions & 9 deletions

File tree

net/rose/rose_loopback.c

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -96,22 +96,15 @@ static void rose_loopback_timer(struct timer_list *unused)
9696
}
9797

9898
if (frametype == ROSE_CALL_REQUEST) {
99-
if (!rose_loopback_neigh->dev &&
100-
!rose_loopback_neigh->loopback) {
101-
kfree_skb(skb);
102-
continue;
103-
}
104-
10599
dev = rose_dev_get(dest);
106100
if (!dev) {
107101
kfree_skb(skb);
108102
continue;
109103
}
110104

111-
if (rose_rx_call_request(skb, dev, rose_loopback_neigh, lci_o) == 0) {
112-
dev_put(dev);
105+
if (rose_rx_call_request(skb, dev, rose_loopback_neigh, lci_o) == 0)
113106
kfree_skb(skb);
114-
}
107+
dev_put(dev);
115108
} else {
116109
kfree_skb(skb);
117110
}

0 commit comments

Comments
 (0)