CVE-2026-90049: net: skbuff: don't skb_tx_error() the source skb in skb_zerocopy()
In the Linux kernel, the following vulnerability has been resolved:
net: skbuff: don't skbtxerror() the source skb in skbzerocopy()
skbzerocopy() copies frags from @from into @to. On an skborphanfrags() failure it calls skbtxerror(@from), a destructive operation on the source skb the copy helper does not own. That completes @from's zerocopy uarg and clears SKBFLALLZEROCOPY, including the SKBFLSHAREDFRAG page-ownership marker.
Both callers already report the failure on their own drop path. nfnetlinkqueue does it at nlaputfailure, and Open vSwitch does it in the flow-miss drop arm of ovsdpprocesspacket(), so nothing is lost by dropping it here.
On Open vSwitch's OVSACTIONATTRUSERSPACE path the skb is not freed on this error: doexecuteactions() ignores outputuserspace()'s return value and, unless the upcall was the last action, keeps forwarding the same skb through the flow's remaining actions. The uarg is completed while that skb is still in flight, telling the producer its buffers are free, and SKBFLSHAREDFRAG is cleared on an skb the rest of the stack still handles. That flag is what makes espinput() call skbcowdata() instead of decrypting in place, so a later local ESP delivery can decrypt over frags the skb does not own privately.
Leave error reporting to the callers.
Event History
Frequently Asked Questions
Which deployments have the clearest exposure path?
The described in-flight handling issue occurs on Open vSwitch's OVS_ACTION_ATTR_USERSPACE path when skb_zerocopy() encounters an skb_orphan_frags() failure. Exposure is particularly relevant when the upcall is not the last action, because Open vSwitch can continue processing the same skb through remaining actions.
What conditions are needed for the unsafe state to occur?
skb_zerocopy() must fail while orphaning fragments, causing it to invoke skb_tx_error() on the source skb. In the Open vSwitch userspace-action path, output_userspace() must return an error that do_execute_actions() ignores while the skb remains in flight for subsequent actions.
Why is continued packet processing after the error significant?
The erroneous completion tells the zerocopy buffer producer that its buffers are free while the skb is still being handled. It also clears SKBFL_SHARED_FRAG, removing the marker that makes esp_input() copy data before decrypting rather than decrypting in place.