Skip to content

Commit

Permalink
Merge pull request #20997 from benpicco/backport/2024.10/gnrc_netif_n…
Browse files Browse the repository at this point in the history
…etdev_new_api-leak

gnrc_netif: fix packet leak with gnrc_netif_pktq & netdev_new_api [backport 2024.10]
  • Loading branch information
maribu authored Nov 17, 2024
2 parents 3bfbc55 + c193345 commit b9432b2
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 7 deletions.
8 changes: 5 additions & 3 deletions drivers/at86rf215/at86rf215_netdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -176,9 +176,11 @@ static int _send(netdev_t *netdev, const iolist_t *iolist)
at86rf215_tx_exec(dev);
}

/* return the number of bytes that were actually loaded into the frame
* buffer/send out */
return (int)len;
/* store successfully sent number of bytes */
dev->tx_frame_len = len;

/* netdev_new just returns 0 on success */
return 0;
}

static int _confirm_send(netdev_t *netdev, void *info)
Expand Down
6 changes: 4 additions & 2 deletions sys/net/gnrc/netif/gnrc_netif.c
Original file line number Diff line number Diff line change
Expand Up @@ -1810,7 +1810,7 @@ static void _tx_done(gnrc_netif_t *netif, gnrc_pktsnip_t *pkt,
}
return;
}
else {
else if (gnrc_netif_netdev_legacy_api(netif)) {
/* remove previously held packet */
gnrc_pktbuf_release(pkt);
return;
Expand Down Expand Up @@ -1882,7 +1882,9 @@ static void _send(gnrc_netif_t *netif, gnrc_pktsnip_t *pkt, bool push_back)
}
/* hold in case device was busy to not having to rewrite *all* the link
* layer implementations in case `gnrc_netif_pktq` is included */
gnrc_pktbuf_hold(pkt, 1);
if (gnrc_netif_netdev_legacy_api(netif)) {
gnrc_pktbuf_hold(pkt, 1);
}
#endif /* IS_USED(MODULE_GNRC_NETIF_PKTQ) */

/* Record send in neighbor statistics if destination is unicast */
Expand Down
15 changes: 13 additions & 2 deletions sys/net/gnrc/netif/gnrc_netif_raw.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,13 +104,24 @@ static gnrc_pktsnip_t *_recv(gnrc_netif_t *netif)
return pkt;
}

static gnrc_pktsnip_t *_skip_pkt_head(gnrc_netif_t *netif, gnrc_pktsnip_t *pkt)
{
if (gnrc_netif_netdev_legacy_api(netif)) {
/* we don't need the netif snip: remove it */
return gnrc_pktbuf_remove_snip(pkt, pkt);
}
else {
/* _tx_done() will free the entire list */
return pkt->next;
}
}

static int _send(gnrc_netif_t *netif, gnrc_pktsnip_t *pkt)
{
int res = -ENOBUFS;

if (pkt->type == GNRC_NETTYPE_NETIF) {
/* we don't need the netif snip: remove it */
pkt = gnrc_pktbuf_remove_snip(pkt, pkt);
pkt = _skip_pkt_head(netif, pkt);
}

netdev_t *dev = netif->dev;
Expand Down

0 comments on commit b9432b2

Please sign in to comment.