From 81572a7d8654d1904cdcf30c9ae3152799da33db Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Fri, 17 Jul 2026 12:08:44 -0400 Subject: [PATCH] MT#55283 pull down skb_copy past get_target Make the skb copy only once we know that it's for a known target. Implies a rework of some of the early-return gotos. No functional change. Change-Id: Ibf5d09c0df2a91cfb50f3181e80114539e4f50a6 --- kernel-module/nft_rtpengine.c | 41 +++++++++++++++++------------------ 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/kernel-module/nft_rtpengine.c b/kernel-module/nft_rtpengine.c index 23a65b92a..a80177619 100644 --- a/kernel-module/nft_rtpengine.c +++ b/kernel-module/nft_rtpengine.c @@ -7010,31 +7010,34 @@ static int rtpengine46(struct sk_buff *oskb, unsigned int output_group_idx = 0; struct rtpengine_output_group *output_group; - skb = skb_copy_expand(oskb, MAX_HEADER, MAX_SKB_TAIL_ROOM, GFP_ATOMIC); - if (!skb) - return NFT_CONTINUE; + uh = udp_hdr(oskb); - skb_gso_reset(skb); + src->port = ntohs(uh->source); + dst->port = ntohs(uh->dest); - // pull to transport (UDP) header - skb_pull(skb, skb->transport_header - skb->network_header); + g = get_target(t, dst); + if (!g) + return NFT_CONTINUE; - uh = udp_hdr(skb); - skb_pull(skb, sizeof(*uh)); + DBG("target found, local " MIPF "\n", MIPP(g->target.local)); + DBG("target decrypt RTP hmac and cipher are %s and %s", g->decrypt_rtp.hmac->name, + g->decrypt_rtp.cipher->name); datalen = ntohs(uh->len); if (datalen < sizeof(*uh)) - goto out_no_target; + goto out_target; datalen -= sizeof(*uh); DBG("udp payload = %u\n", datalen); - skb_trim(skb, datalen); - src->port = ntohs(uh->source); - dst->port = ntohs(uh->dest); + skb = skb_copy_expand(oskb, MAX_HEADER, MAX_SKB_TAIL_ROOM, GFP_ATOMIC); + if (!skb) + goto out_target; - g = get_target(t, dst); - if (!g) - goto out_no_target; + skb_gso_reset(skb); + + // pull and trim to data + skb_pull(skb, skb->transport_header - skb->network_header + sizeof(*uh)); + skb_trim(skb, datalen); // all our outputs filled? _r_lock(&g->outputs_lock, flags); @@ -7045,10 +7048,6 @@ static int rtpengine46(struct sk_buff *oskb, } _r_unlock(&g->outputs_lock, flags); - DBG("target found, local " MIPF "\n", MIPP(g->target.local)); - DBG("target decrypt RTP hmac and cipher are %s and %s", g->decrypt_rtp.hmac->name, - g->decrypt_rtp.cipher->name); - if (is_stun(g, datalen, skb->data)) goto out; @@ -7289,9 +7288,9 @@ out_error: out: error_nf_action = ring_buffer_insert(error_nf_action, t, g, &g->raw_ring_buf, g->target.raw_ring_buf.num, src, &g->target.local, skb, ktime_to_us(oskb->tstamp)); - target_put(g); -out_no_target: kfree_skb(skb); +out_target: + target_put(g); return error_nf_action; }