netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v1 net 0/2] atm: clip: Fix infinite recursion and potential null-ptr-deref.
@ 2025-07-02  2:04 Kuniyuki Iwashima
  2025-07-02  2:04 ` [PATCH v1 net 1/2] atm: clip: Fix infinite recursive call of clip_push() Kuniyuki Iwashima
  2025-07-02  2:04 ` [PATCH v1 net 2/2] atm: clip: Fix potential null-ptr-deref in to_atmarpd() Kuniyuki Iwashima
  0 siblings, 2 replies; 6+ messages in thread
From: Kuniyuki Iwashima @ 2025-07-02  2:04 UTC (permalink / raw)
  To: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni
  Cc: Simon Horman, Kuniyuki Iwashima, Kuniyuki Iwashima, netdev

Patch 1 fixes infinite recursive call of clip_vcc->old_push(), which
was reported by syzbot.

Patch 2 fixes racy access to atmarpd found while checking RTNL usage
in clip.c.


Kuniyuki Iwashima (2):
  atm: clip: Fix infinite recursive call of clip_push().
  atm: clip: Fix potential null-ptr-deref in to_atmarpd().

 net/atm/clip.c | 47 +++++++++++++++++++++++++++++++++--------------
 1 file changed, 33 insertions(+), 14 deletions(-)

-- 
2.50.0.727.gbf7dc18ff4-goog


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v1 net 1/2] atm: clip: Fix infinite recursive call of clip_push().
  2025-07-02  2:04 [PATCH v1 net 0/2] atm: clip: Fix infinite recursion and potential null-ptr-deref Kuniyuki Iwashima
@ 2025-07-02  2:04 ` Kuniyuki Iwashima
  2025-07-02  8:02   ` Eric Dumazet
  2025-07-02  2:04 ` [PATCH v1 net 2/2] atm: clip: Fix potential null-ptr-deref in to_atmarpd() Kuniyuki Iwashima
  1 sibling, 1 reply; 6+ messages in thread
From: Kuniyuki Iwashima @ 2025-07-02  2:04 UTC (permalink / raw)
  To: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni
  Cc: Simon Horman, Kuniyuki Iwashima, Kuniyuki Iwashima, netdev,
	syzbot+0c77cccd6b7cd917b35a

syzbot reported the splat below. [0]

This happens if we call ioctl(ATMARP_MKIP) more than once.

During the first call, clip_mkip() sets clip_push() to vcc->push(),
and the second call copies it to clip_vcc->old_push().

Later, when a NULL skb is passed to clip_push(), it calls
clip_vcc->old_push(), triggering the infinite recursion.

Let's prevent the second ioctl(ATMARP_MKIP) by checking
vcc->user_back, which is allocated by the first call as clip_vcc.

Note also that we use lock_sock() to prevent racy calls.

[0]:
BUG: TASK stack guard page was hit at ffffc9000d66fff8 (stack is ffffc9000d670000..ffffc9000d678000)
Oops: stack guard page: 0000 [#1] SMP KASAN NOPTI
CPU: 0 UID: 0 PID: 5322 Comm: syz.0.0 Not tainted 6.16.0-rc4-syzkaller #0 PREEMPT(full)
Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2~bpo12+1 04/01/2014
RIP: 0010:clip_push+0x5/0x720 net/atm/clip.c:191
Code: e0 8f aa 8c e8 1c ad 5b fa eb ae 66 2e 0f 1f 84 00 00 00 00 00 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 f3 0f 1e fa 55 <41> 57 41 56 41 55 41 54 53 48 83 ec 20 48 89 f3 49 89 fd 48 bd 00
RSP: 0018:ffffc9000d670000 EFLAGS: 00010246
RAX: 1ffff1100235a4a5 RBX: ffff888011ad2508 RCX: ffff8880003c0000
RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffff888037f01000
RBP: dffffc0000000000 R08: ffffffff8fa104f7 R09: 1ffffffff1f4209e
R10: dffffc0000000000 R11: ffffffff8a99b300 R12: ffffffff8a99b300
R13: ffff888037f01000 R14: ffff888011ad2500 R15: ffff888037f01578
FS:  000055557ab6d500(0000) GS:ffff88808d250000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: ffffc9000d66fff8 CR3: 0000000043172000 CR4: 0000000000352ef0
Call Trace:
 <TASK>
 clip_push+0x6dc/0x720 net/atm/clip.c:200
 clip_push+0x6dc/0x720 net/atm/clip.c:200
 clip_push+0x6dc/0x720 net/atm/clip.c:200
...
 clip_push+0x6dc/0x720 net/atm/clip.c:200
 clip_push+0x6dc/0x720 net/atm/clip.c:200
 clip_push+0x6dc/0x720 net/atm/clip.c:200
 vcc_destroy_socket net/atm/common.c:183 [inline]
 vcc_release+0x157/0x460 net/atm/common.c:205
 __sock_release net/socket.c:647 [inline]
 sock_close+0xc0/0x240 net/socket.c:1391
 __fput+0x449/0xa70 fs/file_table.c:465
 task_work_run+0x1d1/0x260 kernel/task_work.c:227
 resume_user_mode_work include/linux/resume_user_mode.h:50 [inline]
 exit_to_user_mode_loop+0xec/0x110 kernel/entry/common.c:114
 exit_to_user_mode_prepare include/linux/entry-common.h:330 [inline]
 syscall_exit_to_user_mode_work include/linux/entry-common.h:414 [inline]
 syscall_exit_to_user_mode include/linux/entry-common.h:449 [inline]
 do_syscall_64+0x2bd/0x3b0 arch/x86/entry/syscall_64.c:100
 entry_SYSCALL_64_after_hwframe+0x77/0x7f
RIP: 0033:0x7ff31c98e929
Code: ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 a8 ff ff ff f7 d8 64 89 01 48
RSP: 002b:00007fffb5aa1f78 EFLAGS: 00000246 ORIG_RAX: 00000000000001b4
RAX: 0000000000000000 RBX: 0000000000012747 RCX: 00007ff31c98e929
RDX: 0000000000000000 RSI: 000000000000001e RDI: 0000000000000003
RBP: 00007ff31cbb7ba0 R08: 0000000000000001 R09: 0000000db5aa226f
R10: 00007ff31c7ff030 R11: 0000000000000246 R12: 00007ff31cbb608c
R13: 00007ff31cbb6080 R14: ffffffffffffffff R15: 00007fffb5aa2090
 </TASK>
Modules linked in:

Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Reported-by: syzbot+0c77cccd6b7cd917b35a@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=2371d94d248d126c1eb1
Signed-off-by: Kuniyuki Iwashima <kuniyu@google.com>
---
 net/atm/clip.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/net/atm/clip.c b/net/atm/clip.c
index b234dc3bcb0d..250b3c7f4305 100644
--- a/net/atm/clip.c
+++ b/net/atm/clip.c
@@ -417,6 +417,8 @@ static int clip_mkip(struct atm_vcc *vcc, int timeout)
 
 	if (!vcc->push)
 		return -EBADFD;
+	if (vcc->user_back)
+		return -EINVAL;
 	clip_vcc = kmalloc(sizeof(struct clip_vcc), GFP_KERNEL);
 	if (!clip_vcc)
 		return -ENOMEM;
@@ -655,6 +657,7 @@ static int atm_init_atmarp(struct atm_vcc *vcc)
 static int clip_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 {
 	struct atm_vcc *vcc = ATM_SD(sock);
+	struct sock *sk = sock->sk;
 	int err = 0;
 
 	switch (cmd) {
@@ -682,7 +685,9 @@ static int clip_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 		}
 		break;
 	case ATMARP_MKIP:
+		lock_sock(sk);
 		err = clip_mkip(vcc, arg);
+		release_sock(sk);
 		break;
 	case ATMARP_SETENTRY:
 		err = clip_setentry(vcc, (__force __be32)arg);
-- 
2.50.0.727.gbf7dc18ff4-goog


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v1 net 2/2] atm: clip: Fix potential null-ptr-deref in to_atmarpd().
  2025-07-02  2:04 [PATCH v1 net 0/2] atm: clip: Fix infinite recursion and potential null-ptr-deref Kuniyuki Iwashima
  2025-07-02  2:04 ` [PATCH v1 net 1/2] atm: clip: Fix infinite recursive call of clip_push() Kuniyuki Iwashima
@ 2025-07-02  2:04 ` Kuniyuki Iwashima
  2025-07-04  3:23   ` kernel test robot
  1 sibling, 1 reply; 6+ messages in thread
From: Kuniyuki Iwashima @ 2025-07-02  2:04 UTC (permalink / raw)
  To: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni
  Cc: Simon Horman, Kuniyuki Iwashima, Kuniyuki Iwashima, netdev

atmarpd is protected by RTNL since commit f3a0592b37b8 ("[ATM]: clip
causes unregister hang").

However, it is not enough because to_atmarpd() is called without RTNL,
especially clip_neigh_solicit() / neigh_ops->solicit() is unsleepable.

Also, there is no RTNL dependency around atmarpd.

Let's use a private mutex and RCU to protect access to atmarpd in
to_atmarpd().

Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Signed-off-by: Kuniyuki Iwashima <kuniyu@google.com>
---
 net/atm/clip.c | 42 ++++++++++++++++++++++++++++--------------
 1 file changed, 28 insertions(+), 14 deletions(-)

diff --git a/net/atm/clip.c b/net/atm/clip.c
index 250b3c7f4305..84d527a9398b 100644
--- a/net/atm/clip.c
+++ b/net/atm/clip.c
@@ -46,6 +46,7 @@
 
 static struct net_device *clip_devs;
 static struct atm_vcc *atmarpd;
+static DEFINE_MUTEX(atmarpd_lock);
 static struct timer_list idle_timer;
 static const struct neigh_ops clip_neigh_ops;
 
@@ -53,24 +54,35 @@ static int to_atmarpd(enum atmarp_ctrl_type type, int itf, __be32 ip)
 {
 	struct sock *sk;
 	struct atmarp_ctrl *ctrl;
+	struct atm_vcc *vcc;
 	struct sk_buff *skb;
+	int err = 0;
 
 	pr_debug("(%d)\n", type);
-	if (!atmarpd)
-		return -EUNATCH;
+
+	rcu_read_lock();
+	vcc = rcu_dereference(atmarpd);
+	if (!vcc) {
+		err = -EUNATCH;
+		goto unlock;
+	}
 	skb = alloc_skb(sizeof(struct atmarp_ctrl), GFP_ATOMIC);
-	if (!skb)
-		return -ENOMEM;
+	if (!skb) {
+		err = -ENOMEM;
+		goto unlock;
+	}
 	ctrl = skb_put(skb, sizeof(struct atmarp_ctrl));
 	ctrl->type = type;
 	ctrl->itf_num = itf;
 	ctrl->ip = ip;
-	atm_force_charge(atmarpd, skb->truesize);
+	atm_force_charge(vcc, skb->truesize);
 
-	sk = sk_atm(atmarpd);
+	sk = sk_atm(vcc);
 	skb_queue_tail(&sk->sk_receive_queue, skb);
 	sk->sk_data_ready(sk);
-	return 0;
+unlock:
+	rcu_read_unlock();
+	return err;
 }
 
 static void link_vcc(struct clip_vcc *clip_vcc, struct atmarp_entry *entry)
@@ -609,10 +621,12 @@ static void atmarpd_close(struct atm_vcc *vcc)
 {
 	pr_debug("\n");
 
-	rtnl_lock();
-	atmarpd = NULL;
+	mutex_lock(&atmarpd_lock);
+	RCU_INIT_POINTER(atmarpd, NULL);
+	mutex_unlock(&atmarpd_lock);
+
+	synchronize_rcu();
 	skb_queue_purge(&sk_atm(vcc)->sk_receive_queue);
-	rtnl_unlock();
 
 	pr_debug("(done)\n");
 	module_put(THIS_MODULE);
@@ -633,15 +647,15 @@ static struct atm_dev atmarpd_dev = {
 
 static int atm_init_atmarp(struct atm_vcc *vcc)
 {
-	rtnl_lock();
+	mutex_lock(&atmarpd_lock);
 	if (atmarpd) {
-		rtnl_unlock();
+		mutex_unlock(&atmarpd_lock);
 		return -EADDRINUSE;
 	}
 
 	mod_timer(&idle_timer, jiffies + CLIP_CHECK_INTERVAL * HZ);
 
-	atmarpd = vcc;
+	rcu_assign_pointer(atmarpd, vcc);
 	set_bit(ATM_VF_META, &vcc->flags);
 	set_bit(ATM_VF_READY, &vcc->flags);
 	    /* allow replies and avoid getting closed if signaling dies */
@@ -650,7 +664,7 @@ static int atm_init_atmarp(struct atm_vcc *vcc)
 	vcc->push = NULL;
 	vcc->pop = NULL; /* crash */
 	vcc->push_oam = NULL; /* crash */
-	rtnl_unlock();
+	mutex_unlock(&atmarpd_lock);
 	return 0;
 }
 
-- 
2.50.0.727.gbf7dc18ff4-goog


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v1 net 1/2] atm: clip: Fix infinite recursive call of clip_push().
  2025-07-02  2:04 ` [PATCH v1 net 1/2] atm: clip: Fix infinite recursive call of clip_push() Kuniyuki Iwashima
@ 2025-07-02  8:02   ` Eric Dumazet
  2025-07-02 17:17     ` Kuniyuki Iwashima
  0 siblings, 1 reply; 6+ messages in thread
From: Eric Dumazet @ 2025-07-02  8:02 UTC (permalink / raw)
  To: Kuniyuki Iwashima
  Cc: David S. Miller, Jakub Kicinski, Paolo Abeni, Simon Horman,
	Kuniyuki Iwashima, netdev, syzbot+0c77cccd6b7cd917b35a

On Tue, Jul 1, 2025 at 7:04 PM Kuniyuki Iwashima <kuniyu@google.com> wrote:
>
> syzbot reported the splat below. [0]
>
> This happens if we call ioctl(ATMARP_MKIP) more than once.
>
> During the first call, clip_mkip() sets clip_push() to vcc->push(),
> and the second call copies it to clip_vcc->old_push().
>
> Later, when a NULL skb is passed to clip_push(), it calls
> clip_vcc->old_push(), triggering the infinite recursion.
>
> Let's prevent the second ioctl(ATMARP_MKIP) by checking
> vcc->user_back, which is allocated by the first call as clip_vcc.
>
> Note also that we use lock_sock() to prevent racy calls.
>
> Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
> Reported-by: syzbot+0c77cccd6b7cd917b35a@syzkaller.appspotmail.com
> Closes: https://syzkaller.appspot.com/bug?extid=2371d94d248d126c1eb1
> Signed-off-by: Kuniyuki Iwashima <kuniyu@google.com>
> ---
>  net/atm/clip.c | 5 +++++
>  1 file changed, 5 insertions(+)
>
> diff --git a/net/atm/clip.c b/net/atm/clip.c
> index b234dc3bcb0d..250b3c7f4305 100644
> --- a/net/atm/clip.c
> +++ b/net/atm/clip.c
> @@ -417,6 +417,8 @@ static int clip_mkip(struct atm_vcc *vcc, int timeout)
>
>         if (!vcc->push)
>                 return -EBADFD;
> +       if (vcc->user_back)
> +               return -EINVAL;
>         clip_vcc = kmalloc(sizeof(struct clip_vcc), GFP_KERNEL);
>         if (!clip_vcc)
>                 return -ENOMEM;
> @@ -655,6 +657,7 @@ static int atm_init_atmarp(struct atm_vcc *vcc)
>  static int clip_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
>  {
>         struct atm_vcc *vcc = ATM_SD(sock);
> +       struct sock *sk = sock->sk;
>         int err = 0;
>
>         switch (cmd) {
> @@ -682,7 +685,9 @@ static int clip_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
>                 }
>                 break;
>         case ATMARP_MKIP:
> +               lock_sock(sk);
>                 err = clip_mkip(vcc, arg);
> +               release_sock(sk);

This will still race with atm_init_atmarp(), which (ab)uses RTNL ?

>                 break;
>         case ATMARP_SETENTRY:
>                 err = clip_setentry(vcc, (__force __be32)arg);
> --
> 2.50.0.727.gbf7dc18ff4-goog
>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v1 net 1/2] atm: clip: Fix infinite recursive call of clip_push().
  2025-07-02  8:02   ` Eric Dumazet
@ 2025-07-02 17:17     ` Kuniyuki Iwashima
  0 siblings, 0 replies; 6+ messages in thread
From: Kuniyuki Iwashima @ 2025-07-02 17:17 UTC (permalink / raw)
  To: Eric Dumazet
  Cc: David S. Miller, Jakub Kicinski, Paolo Abeni, Simon Horman,
	Kuniyuki Iwashima, netdev, syzbot+0c77cccd6b7cd917b35a

On Wed, Jul 2, 2025 at 1:03 AM Eric Dumazet <edumazet@google.com> wrote:
>
> On Tue, Jul 1, 2025 at 7:04 PM Kuniyuki Iwashima <kuniyu@google.com> wrote:
> >
> > syzbot reported the splat below. [0]
> >
> > This happens if we call ioctl(ATMARP_MKIP) more than once.
> >
> > During the first call, clip_mkip() sets clip_push() to vcc->push(),
> > and the second call copies it to clip_vcc->old_push().
> >
> > Later, when a NULL skb is passed to clip_push(), it calls
> > clip_vcc->old_push(), triggering the infinite recursion.
> >
> > Let's prevent the second ioctl(ATMARP_MKIP) by checking
> > vcc->user_back, which is allocated by the first call as clip_vcc.
> >
> > Note also that we use lock_sock() to prevent racy calls.
> >
> > Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
> > Reported-by: syzbot+0c77cccd6b7cd917b35a@syzkaller.appspotmail.com
> > Closes: https://syzkaller.appspot.com/bug?extid=2371d94d248d126c1eb1
> > Signed-off-by: Kuniyuki Iwashima <kuniyu@google.com>
> > ---
> >  net/atm/clip.c | 5 +++++
> >  1 file changed, 5 insertions(+)
> >
> > diff --git a/net/atm/clip.c b/net/atm/clip.c
> > index b234dc3bcb0d..250b3c7f4305 100644
> > --- a/net/atm/clip.c
> > +++ b/net/atm/clip.c
> > @@ -417,6 +417,8 @@ static int clip_mkip(struct atm_vcc *vcc, int timeout)
> >
> >         if (!vcc->push)
> >                 return -EBADFD;
> > +       if (vcc->user_back)
> > +               return -EINVAL;
> >         clip_vcc = kmalloc(sizeof(struct clip_vcc), GFP_KERNEL);
> >         if (!clip_vcc)
> >                 return -ENOMEM;
> > @@ -655,6 +657,7 @@ static int atm_init_atmarp(struct atm_vcc *vcc)
> >  static int clip_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
> >  {
> >         struct atm_vcc *vcc = ATM_SD(sock);
> > +       struct sock *sk = sock->sk;
> >         int err = 0;
> >
> >         switch (cmd) {
> > @@ -682,7 +685,9 @@ static int clip_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
> >                 }
> >                 break;
> >         case ATMARP_MKIP:
> > +               lock_sock(sk);
> >                 err = clip_mkip(vcc, arg);
> > +               release_sock(sk);
>
> This will still race with atm_init_atmarp(), which (ab)uses RTNL ?

Ah right.

clip's vcc->user_back is expected to be freed by calling
clip_push() with NULL from vcc_destroy_socket(), but
atm_init_atmarp() sets NULL to ->push, and memory will
be leaked.

I'll add another patch to prevent setting ATMARPD_CTRL
after ATMARP_MKIP.

Thanks!

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v1 net 2/2] atm: clip: Fix potential null-ptr-deref in to_atmarpd().
  2025-07-02  2:04 ` [PATCH v1 net 2/2] atm: clip: Fix potential null-ptr-deref in to_atmarpd() Kuniyuki Iwashima
@ 2025-07-04  3:23   ` kernel test robot
  0 siblings, 0 replies; 6+ messages in thread
From: kernel test robot @ 2025-07-04  3:23 UTC (permalink / raw)
  To: Kuniyuki Iwashima, David S. Miller, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni
  Cc: oe-kbuild-all, netdev, Simon Horman, Kuniyuki Iwashima

Hi Kuniyuki,

kernel test robot noticed the following build warnings:

[auto build test WARNING on net/main]

url:    https://github.com/intel-lab-lkp/linux/commits/Kuniyuki-Iwashima/atm-clip-Fix-infinite-recursive-call-of-clip_push/20250702-100652
base:   net/main
patch link:    https://lore.kernel.org/r/20250702020437.703698-3-kuniyu%40google.com
patch subject: [PATCH v1 net 2/2] atm: clip: Fix potential null-ptr-deref in to_atmarpd().
config: i386-randconfig-063-20250704 (https://download.01.org/0day-ci/archive/20250704/202507041113.tpHgxTvk-lkp@intel.com/config)
compiler: clang version 20.1.7 (https://github.com/llvm/llvm-project 6146a88f60492b520a36f8f8f3231e15f3cc6082)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250704/202507041113.tpHgxTvk-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202507041113.tpHgxTvk-lkp@intel.com/

sparse warnings: (new ones prefixed by >>)
>> net/atm/clip.c:64:15: sparse: sparse: incompatible types in comparison expression (different address spaces):
   net/atm/clip.c:64:15: sparse:    struct atm_vcc [noderef] __rcu *
   net/atm/clip.c:64:15: sparse:    struct atm_vcc *
   net/atm/clip.c:625:9: sparse: sparse: incompatible types in comparison expression (different address spaces):
   net/atm/clip.c:625:9: sparse:    struct atm_vcc [noderef] __rcu *
   net/atm/clip.c:625:9: sparse:    struct atm_vcc *
   net/atm/clip.c:658:9: sparse: sparse: incompatible types in comparison expression (different address spaces):
   net/atm/clip.c:658:9: sparse:    struct atm_vcc [noderef] __rcu *
   net/atm/clip.c:658:9: sparse:    struct atm_vcc *

vim +64 net/atm/clip.c

    52	
    53	static int to_atmarpd(enum atmarp_ctrl_type type, int itf, __be32 ip)
    54	{
    55		struct sock *sk;
    56		struct atmarp_ctrl *ctrl;
    57		struct atm_vcc *vcc;
    58		struct sk_buff *skb;
    59		int err = 0;
    60	
    61		pr_debug("(%d)\n", type);
    62	
    63		rcu_read_lock();
  > 64		vcc = rcu_dereference(atmarpd);
    65		if (!vcc) {
    66			err = -EUNATCH;
    67			goto unlock;
    68		}
    69		skb = alloc_skb(sizeof(struct atmarp_ctrl), GFP_ATOMIC);
    70		if (!skb) {
    71			err = -ENOMEM;
    72			goto unlock;
    73		}
    74		ctrl = skb_put(skb, sizeof(struct atmarp_ctrl));
    75		ctrl->type = type;
    76		ctrl->itf_num = itf;
    77		ctrl->ip = ip;
    78		atm_force_charge(vcc, skb->truesize);
    79	
    80		sk = sk_atm(vcc);
    81		skb_queue_tail(&sk->sk_receive_queue, skb);
    82		sk->sk_data_ready(sk);
    83	unlock:
    84		rcu_read_unlock();
    85		return err;
    86	}
    87	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2025-07-04  3:23 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-02  2:04 [PATCH v1 net 0/2] atm: clip: Fix infinite recursion and potential null-ptr-deref Kuniyuki Iwashima
2025-07-02  2:04 ` [PATCH v1 net 1/2] atm: clip: Fix infinite recursive call of clip_push() Kuniyuki Iwashima
2025-07-02  8:02   ` Eric Dumazet
2025-07-02 17:17     ` Kuniyuki Iwashima
2025-07-02  2:04 ` [PATCH v1 net 2/2] atm: clip: Fix potential null-ptr-deref in to_atmarpd() Kuniyuki Iwashima
2025-07-04  3:23   ` kernel test robot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).