batman-adv: don't warn when enslaving hard interface failed

Message ID 99650324-734d-54ed-cd9a-e7b55b8f3630@i-love.sakura.ne.jp (mailing list archive)
State Not Applicable, archived
Delegated to: Simon Wunderlich
Headers
Series batman-adv: don't warn when enslaving hard interface failed |

Commit Message

Tetsuo Handa June 6, 2021, 2:28 p.m. UTC
  syzbot is hitting

  WARN_ON(forw_packet->if_outgoing->soft_iface != soft_iface)

at batadv_iv_ogm_emit() [1], for forw_packet->if_outgoing->soft_iface
can remain NULL if batadv_hardif_enable_interface() failed due to e.g.
memory allocation fault injection.

Link: https://syzkaller.appspot.com/bug?id=9dc0c4cd70ad72df352243e887fd7e18901e7cee [1]
Reported-by: syzbot <syzbot+c0b807de416427ff3dd1@syzkaller.appspotmail.com>
Tested-by: syzbot <syzbot+c0b807de416427ff3dd1@syzkaller.appspotmail.com>
Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Fixes: ef0a937f7a1450d3 ("batman-adv: consider outgoing interface in OGM sending")
---
 net/batman-adv/bat_iv_ogm.c | 3 +++
 1 file changed, 3 insertions(+)
  

Comments

Sven Eckelmann June 6, 2021, 2:35 p.m. UTC | #1
On Sunday, 6 June 2021 16:28:17 CEST Tetsuo Handa wrote:
> syzbot is hitting
> 
>   WARN_ON(forw_packet->if_outgoing->soft_iface != soft_iface)
> 
> at batadv_iv_ogm_emit() [1], for forw_packet->if_outgoing->soft_iface
> can remain NULL if batadv_hardif_enable_interface() failed due to e.g.
> memory allocation fault injection.

Cannot apply this because following (conflicting) is already queued up in 
batadv/net:  
https://git.open-mesh.org/linux-merge.git/blobdiff/b741596468b010af2846b75f5e75a842ce344a6e..9f460ae31c4435fd022c443a6029352217a16ac1:/net/batman-adv/bat_iv_ogm.c

    Applying patch #18340 using 'git am -s'
    Description: batman-adv: don't warn when enslaving hard interface failed
    Applying: batman-adv: don't warn when enslaving hard interface failed
    error: patch failed: net/batman-adv/bat_iv_ogm.c:409
    error: net/batman-adv/bat_iv_ogm.c: patch does not apply
    Patch failed at 0001 batman-adv: don't warn when enslaving hard interface failed
    hint: Use 'git am --show-current-patch=diff' to see the failed patch
    When you have resolved this problem, run "git am --continue".
    If you prefer to skip this patch, run "git am --skip" instead.
    To restore the original branch and stop patching, run "git am --abort".
    'git am' failed with exit status 128

Please rebase your patch in case it is really needed.

And the explanation you give seems to be bogus. Or am I missing some error 
handling in batadv_hardif_enable_interface [1]?

Kind regards,
	Sven

[1] https://git.open-mesh.org/linux-merge.git/blob/refs/heads/batadv/net-next:/net/batman-adv/hard-interface.c
  
Tetsuo Handa June 6, 2021, 3:48 p.m. UTC | #2
On 2021/06/06 23:35, Sven Eckelmann wrote:
> Please rebase your patch in case it is really needed.

Oh, I didn't know you already applied that change, for that commit is
not yet visible from linux-next.git as of next-20210604.

> 
> And the explanation you give seems to be bogus. Or am I missing some error 
> handling in batadv_hardif_enable_interface [1]?

I told syzbot to try https://syzkaller.appspot.com/text?tag=Patch&x=100b083fd00000
and the response ( https://syzkaller.appspot.com/text?tag=CrashLog&x=1456f0ffd00000 ) was

   batman_adv: forw_packet->if_outgoing->soft_iface=0000000000000000 forw_packet->if_incoming->soft_iface=0000000039fa85b7

indicating that if_outgoing->soft_iface was NULL, and there was a memory allocation
fault injection immediately before this result.

Since if_outgoing->soft_iface becomes non-NULL if batadv_hardif_enable_interface()
succeeds, this situation indicates that batadv_hardif_enable_interface() failure
caused forw_packet->if_outgoing->soft_iface to remain NULL.

> 
> Kind regards,
> 	Sven
> 
> [1] https://git.open-mesh.org/linux-merge.git/blob/refs/heads/batadv/net-next:/net/batman-adv/hard-interface.c
>
  
Sven Eckelmann June 6, 2021, 4:23 p.m. UTC | #3
On Sunday, 6 June 2021 17:48:25 CEST Tetsuo Handa wrote:
> > And the explanation you give seems to be bogus. Or am I missing some error 
> > handling in batadv_hardif_enable_interface [1]?
> 
> I told syzbot to try https://syzkaller.appspot.com/text?tag=Patch&x=100b083fd00000
> and the response ( https://syzkaller.appspot.com/text?tag=CrashLog&x=1456f0ffd00000 ) was
> 
>    batman_adv: forw_packet->if_outgoing->soft_iface=0000000000000000 forw_packet->if_incoming->soft_iface=0000000039fa85b7
> 
> indicating that if_outgoing->soft_iface was NULL, and there was a memory allocation
> fault injection immediately before this result.
> 
> Since if_outgoing->soft_iface becomes non-NULL if batadv_hardif_enable_interface()
> succeeds, this situation indicates that batadv_hardif_enable_interface() failure
> caused forw_packet->if_outgoing->soft_iface to remain NULL.

Ok, then I misread the commit message. I've understood is as "soft_iface" 
allocation failed (which doesn't happen here anymore) in 
batadv_hardif_enable_interface. But you meant that was that hard_iface->soft_iface is 
set to the correct value, the OGM transmission is started up by batadv_iv_ogm_schedule_buff
but soft_iface is changed back immediately in batadv_hardif_enable_interface because
netdev_master_upper_dev_link failed.

Kind regards,
	Sven
  

Patch

diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c
index 789f257be24f..d24853c16ea5 100644
--- a/net/batman-adv/bat_iv_ogm.c
+++ b/net/batman-adv/bat_iv_ogm.c
@@ -409,6 +409,9 @@  static void batadv_iv_ogm_emit(struct batadv_forw_packet *forw_packet)
 	if (WARN_ON(!forw_packet->if_outgoing))
 		return;
 
+	if (!forw_packet->if_outgoing->soft_iface)
+		return;
+
 	if (WARN_ON(forw_packet->if_outgoing->soft_iface != soft_iface))
 		return;