lkml.org 
[lkml]   [2021]   [Nov]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 228/323] nfc: pn533: Fix double free when pn533_fill_fragment_skbs() fails
    Date
    From: Chengfeng Ye <cyeaa@connect.ust.hk>

    [ Upstream commit 9fec40f850658e00a14a7dd9e06f7fbc7e59cc4a ]

    skb is already freed by dev_kfree_skb in pn533_fill_fragment_skbs,
    but follow error handler branch when pn533_fill_fragment_skbs()
    fails, skb is freed again, results in double free issue. Fix this
    by not free skb in error path of pn533_fill_fragment_skbs.

    Fixes: 963a82e07d4e ("NFC: pn533: Split large Tx frames in chunks")
    Fixes: 93ad42020c2d ("NFC: pn533: Target mode Tx fragmentation support")
    Signed-off-by: Chengfeng Ye <cyeaa@connect.ust.hk>
    Reviewed-by: Dan Carpenter <dan.carpenter@oracle.com>
    Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/nfc/pn533/pn533.c | 6 +++---
    1 file changed, 3 insertions(+), 3 deletions(-)

    diff --git a/drivers/nfc/pn533/pn533.c b/drivers/nfc/pn533/pn533.c
    index 01da9331f4cb6..79bf8e1bd39c2 100644
    --- a/drivers/nfc/pn533/pn533.c
    +++ b/drivers/nfc/pn533/pn533.c
    @@ -2084,7 +2084,7 @@ static int pn533_fill_fragment_skbs(struct pn533 *dev, struct sk_buff *skb)
    frag = pn533_alloc_skb(dev, frag_size);
    if (!frag) {
    skb_queue_purge(&dev->fragment_skb);
    - break;
    + return -ENOMEM;
    }

    if (!dev->tgt_mode) {
    @@ -2154,7 +2154,7 @@ static int pn533_transceive(struct nfc_dev *nfc_dev,
    /* jumbo frame ? */
    if (skb->len > PN533_CMD_DATAEXCH_DATA_MAXLEN) {
    rc = pn533_fill_fragment_skbs(dev, skb);
    - if (rc <= 0)
    + if (rc < 0)
    goto error;

    skb = skb_dequeue(&dev->fragment_skb);
    @@ -2226,7 +2226,7 @@ static int pn533_tm_send(struct nfc_dev *nfc_dev, struct sk_buff *skb)
    /* let's split in multiple chunks if size's too big */
    if (skb->len > PN533_CMD_DATAEXCH_DATA_MAXLEN) {
    rc = pn533_fill_fragment_skbs(dev, skb);
    - if (rc <= 0)
    + if (rc < 0)
    goto error;

    /* get the first skb */
    --
    2.33.0


    \
     
     \ /
      Last update: 2021-11-24 14:12    [W:4.550 / U:0.404 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site