lkml.org 
[lkml]   [2009]   [May]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[mISDN PATCH v2 12/19] Fix skb leak in error cases
    From
    Date
    If the channel receive function returns an error the skb must be freed.

    Signed-off-by: Karsten Keil <keil@b1-systems.de>
    ---
    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 530f689..2a2c30a 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,

    if (memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len)) {
    err = -EFAULT;
    - goto drop;
    + goto done;
    }

    memcpy(mISDN_HEAD_P(skb), skb->data, MISDN_HEADER_LEN);
    @@ -230,19 +230,21 @@ mISDN_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
    __func__, mISDN_HEAD_ID(skb));

    err = -ENODEV;
    - if (!_pms(sk)->ch.peer ||
    - (err = _pms(sk)->ch.recv(_pms(sk)->ch.peer, skb)))
    - goto drop;
    -
    - err = len;
    + if (!_pms(sk)->ch.peer)
    + goto done;
    + err = _pms(sk)->ch.recv(_pms(sk)->ch.peer, skb);
    + if (err)
    + goto done;
    + else {
    + skb = NULL;
    + err = len;
    + }

    done:
    + if (skb)
    + kfree_skb(skb);
    release_sock(sk);
    return err;
    -
    -drop:
    - kfree_skb(skb);
    - goto done;
    }

    static int
    --
    1.6.0.2


    \
     
     \ /
      Last update: 2009-05-22 23:13    [W:0.019 / U:149.120 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site