From: Davide Caratti dcaratti@redhat.com
[ Upstream commit 13de4ed9e3a9ccbe54d05f7d5c773f69ecaf6c64 ]
skb_mpls_dec_ttl() reads the LSE without ensuring that it is contained in the skb "linear" area. Fix this calling pskb_may_pull() before reading the current ttl.
Found by code inspection.
Fixes: 2a2ea50870ba ("net: sched: add mpls manipulation actions to TC") Reported-by: Marcelo Ricardo Leitner marcelo.leitner@gmail.com Signed-off-by: Davide Caratti dcaratti@redhat.com Link: https://lore.kernel.org/r/53659f28be8bc336c113b5254dc637cc76bbae91.160698707... Signed-off-by: Jakub Kicinski kuba@kernel.org Signed-off-by: Greg Kroah-Hartman gregkh@linuxfoundation.org --- net/core/skbuff.c | 3 +++ 1 file changed, 3 insertions(+)
--- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -5618,6 +5618,9 @@ int skb_mpls_dec_ttl(struct sk_buff *skb if (unlikely(!eth_p_mpls(skb->protocol))) return -EINVAL;
+ if (!pskb_may_pull(skb, skb_network_offset(skb) + MPLS_HLEN)) + return -ENOMEM; + lse = be32_to_cpu(mpls_hdr(skb)->label_stack_entry); ttl = (lse & MPLS_LS_TTL_MASK) >> MPLS_LS_TTL_SHIFT; if (!--ttl)