Re: [PATCH net] net: qualcomm: rmnet: set skb->dev for deaggregated MAP commands

Xiang Mei <[email protected]>
Newsgroups org.kernel.vger.netdev,org.kernel.vger.linux-kernel
Message-ID <CAPpSM+STEzqzW2RfyM2A+n55E5OPiGoUHJ9DQzoAN6ymrLFoEQ@mail.gmail.com>
On Thu, Aug 20, 2026 at 2:49 AM Eric Dumazet <[email protected]> wrote:
>
> On Thu, Aug 20, 2026 at 10:11 AM Xiang Mei <[email protected]> wrote:
> >
> > rmnet_map_deaggregate() allocates each sub-frame with alloc_skb() and
> > leaves skb->dev NULL. __rmnet_map_ingress_handler() assigns
> > skb->dev = ep->egress_dev only on the data path, but a MAP command frame
> > is dispatched to rmnet_map_command() before that, so rmnet_map_send_ack()
> > runs netif_tx_lock(skb->dev) on a NULL device. An unprivileged user
> > reaches this by unsharing a user+net namespace, creating an rmnet link
> > over a tap device with INGRESS_DEAGGREGATION and INGRESS_MAP_COMMANDS,
> > and writing an aggregated frame carrying a flow-control command to the
> > tap fd.
> >
> > Assign port->dev before dispatch: the command was received on the real
> > device tracked by port->dev and the ACK must egress on that same device.
> > The non-deaggregated path already has skb->dev == real_dev.
> >
> >   BUG: KASAN: null-ptr-deref in _raw_spin_lock (kernel/locking/spinlock.c:158)
> >   Write of size 4 at addr 00000000000004b4 by task exploit/144
> >   Call Trace:
> >    _raw_spin_lock (kernel/locking/spinlock.c:158)
> >    netif_tx_lock (net/sched/sch_generic.c:497)
> >    rmnet_map_command (drivers/net/ethernet/qualcomm/rmnet/rmnet_map_command.c:67)
> >    rmnet_rx_handler (drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c:125)
> >    __netif_receive_skb_core.constprop.0 (net/core/dev.c:6103)
> >    ...
> >    __netif_receive_skb_one_core (net/core/dev.c:6214)
> >    netif_receive_skb (net/core/dev.c:6474)
> >    tun_get_user (drivers/net/tun.c:1966)
> >    tun_chr_write_iter (drivers/net/tun.c:2012)
> >    vfs_write (fs/read_write.c:687)
> >    ksys_write (fs/read_write.c:739)
> >    do_syscall_64 (arch/x86/entry/syscall_64.c:94)
> >    entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:121)
> >   Kernel panic - not syncing: Fatal exception in interrupt
> >
> > Fixes: 378e25357ac7 ("net: qualcomm: rmnet: Remove unnecessary device assignment")
> > Reported-by: [email protected]
> > Closes: https://lore.kernel.org/netdev/[email protected]/T/#u
> > Assisted-by: Claude:claude-opus-4-8
> > Signed-off-by: Xiang Mei <[email protected]>
> > ---
> >  drivers/net/ethernet/qualcomm/rmnet/rmnet_map_command.c | 2 ++
> >  1 file changed, 2 insertions(+)
> >
> > diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_command.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_command.c
> > index add0f5ade2e6..3944925566fc 100644
> > --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_command.c
> > +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_command.c
> > @@ -79,6 +79,8 @@ void rmnet_map_command(struct sk_buff *skb, struct rmnet_port *port)
> >         unsigned char command_name;
> >         unsigned char rc = 0;
> >
> > +       skb->dev = port->dev;
> > +
>
> This works, but the suggested patch is cleaner IMO
>
Thanks for your review!
> https://bugs.sh/b/4638111fe2a12980/patch.diff
Agreed, that is the better fix (fix the problem at producer end). v2
has been sent:
https://lore.kernel.org/netdev/[email protected]/T/#u

-Xiang
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.