diff options
author | Karsten Keil <keil@b1-systems.de> | 2009-05-22 07:04:52 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-05-25 03:55:30 -0400 |
commit | 5df3b8bcc7826b85a2d233dd20da3ed247e1dc1d (patch) | |
tree | a1a3a9a9e9b304088c6d0e6b07ea03136c40536d /drivers/isdn/mISDN | |
parent | d796509a57777bc0f8f336e360695fad665c59f5 (diff) |
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>
Diffstat (limited to 'drivers/isdn/mISDN')
-rw-r--r-- | drivers/isdn/mISDN/socket.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/drivers/isdn/mISDN/socket.c b/drivers/isdn/mISDN/socket.c index 530f68977361..2a2c30a9438f 100644 --- a/drivers/isdn/mISDN/socket.c +++ b/drivers/isdn/mISDN/socket.c | |||
@@ -209,7 +209,7 @@ mISDN_sock_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
209 | 209 | ||
210 | if (memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len)) { | 210 | if (memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len)) { |
211 | err = -EFAULT; | 211 | err = -EFAULT; |
212 | goto drop; | 212 | goto done; |
213 | } | 213 | } |
214 | 214 | ||
215 | memcpy(mISDN_HEAD_P(skb), skb->data, MISDN_HEADER_LEN); | 215 | memcpy(mISDN_HEAD_P(skb), skb->data, MISDN_HEADER_LEN); |
@@ -230,19 +230,21 @@ mISDN_sock_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
230 | __func__, mISDN_HEAD_ID(skb)); | 230 | __func__, mISDN_HEAD_ID(skb)); |
231 | 231 | ||
232 | err = -ENODEV; | 232 | err = -ENODEV; |
233 | if (!_pms(sk)->ch.peer || | 233 | if (!_pms(sk)->ch.peer) |
234 | (err = _pms(sk)->ch.recv(_pms(sk)->ch.peer, skb))) | 234 | goto done; |
235 | goto drop; | 235 | err = _pms(sk)->ch.recv(_pms(sk)->ch.peer, skb); |
236 | 236 | if (err) | |
237 | err = len; | 237 | goto done; |
238 | else { | ||
239 | skb = NULL; | ||
240 | err = len; | ||
241 | } | ||
238 | 242 | ||
239 | done: | 243 | done: |
244 | if (skb) | ||
245 | kfree_skb(skb); | ||
240 | release_sock(sk); | 246 | release_sock(sk); |
241 | return err; | 247 | return err; |
242 | |||
243 | drop: | ||
244 | kfree_skb(skb); | ||
245 | goto done; | ||
246 | } | 248 | } |
247 | 249 | ||
248 | static int | 250 | static int |