Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mISDN: Fix skb leak in error cases

If the channel receive function returns an error the skb must be freed.

Signed-off-by: Karsten Keil <keil@b1-systems.de>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Karsten Keil and committed by
David S. Miller
5df3b8bc d796509a

+12 -10
+12 -10
drivers/isdn/mISDN/socket.c
··· 209 209 210 210 if (memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len)) { 211 211 err = -EFAULT; 212 - goto drop; 212 + goto done; 213 213 } 214 214 215 215 memcpy(mISDN_HEAD_P(skb), skb->data, MISDN_HEADER_LEN); ··· 230 230 __func__, mISDN_HEAD_ID(skb)); 231 231 232 232 err = -ENODEV; 233 - if (!_pms(sk)->ch.peer || 234 - (err = _pms(sk)->ch.recv(_pms(sk)->ch.peer, skb))) 235 - goto drop; 236 - 237 - err = len; 233 + if (!_pms(sk)->ch.peer) 234 + goto done; 235 + err = _pms(sk)->ch.recv(_pms(sk)->ch.peer, skb); 236 + if (err) 237 + goto done; 238 + else { 239 + skb = NULL; 240 + err = len; 241 + } 238 242 239 243 done: 244 + if (skb) 245 + kfree_skb(skb); 240 246 release_sock(sk); 241 247 return err; 242 - 243 - drop: 244 - kfree_skb(skb); 245 - goto done; 246 248 } 247 249 248 250 static int