[OpenWrt-Devel] Fwd: [packages] netifd: NULL device on network restart (#1476)

Alexandru Ardelean ardeleanalex at gmail.com
Fri Jun 26 02:55:29 EDT 2015


In case it was missed on the packages Github feed.

---------- Forwarded message ----------
From: philipc <notifications at github.com>
Date: Fri, Jun 26, 2015 at 8:29 AM
Subject: [packages] netifd: NULL device on network restart (#1476)
To: openwrt/packages <packages at noreply.github.com>


I'm getting a NULL device access in system_del_address() with the following
test configuration:

config interface net1
        option ifname eth0
        option proto static
        option ipaddr 10.1.1.1
        option netmask 255.255.255.255

config interface net2
        option ifname eth0
        option proto static
        option ipaddr 10.2.2.2
        option netmask 255.255.255.255

The NULL device access occurs when I call 'ubus call network restart'.
Here's the backtrace:

Program received signal SIGSEGV, Segmentation fault.
system_del_address (dev=dev at entry=0x0, addr=addr at entry=0x634d50) at
/home/philipc/pkg/netifd/system-linux.c:1509
1509        return system_addr(dev, addr, RTM_DELADDR);
(gdb) bt
#0  system_del_address (dev=dev at entry=0x0, addr=addr at entry=0x634d50)
at /home/philipc/pkg/netifd/system-linux.c:1509
#1  0x0000000000407d3e in interface_update_proto_addr (tree=<optimised
out>, node_new=0x0, node_old=0x634d50)
    at /home/philipc/pkg/netifd/interface-ip.c:539
#2  0x00007ffff7bd6415 in vlist_flush (tree=tree at entry=0x633340) at
/home/philipc/pkg/libubox/vlist.c:71
#3  0x00007ffff7bd642f in vlist_flush_all (tree=tree at entry=0x633340)
at /home/philipc/pkg/libubox/vlist.c:79
#4  0x000000000040949c in interface_ip_flush (ip=ip at entry=0x633330) at
/home/philipc/pkg/netifd/interface-ip.c:1301
#5  0x0000000000405456 in mark_interface_down (iface=iface at entry=0x6331b0)
    at /home/philipc/pkg/netifd/interface.c:243
#6  0x0000000000406645 in interface_proto_cb (state=<optimised out>,
ev=<optimised out>)
    at /home/philipc/pkg/netifd/interface.c:678
#7  0x000000000040aa86 in interface_proto_event (proto=0x632ae0,
cmd=cmd at entry=PROTO_CMD_TEARDOWN,
    force=force at entry=false) at /home/philipc/pkg/netifd/proto.c:629
#8  0x00000000004054f6 in interface_check_state (iface=0x6331b0) at
/home/philipc/pkg/netifd/interface.c:297
#9  0x000000000040c730 in device_broadcast_cb (ctx=0x0, list=0x0) at
/home/philipc/pkg/netifd/device.c:287
#10 0x00007ffff7bd660e in safe_list_for_each
(head=head at entry=0x633850, cb=cb at entry=0x40c715 <device_broadcast_cb>,
    ctx=ctx at entry=0x7fffffffe35c) at /home/philipc/pkg/libubox/safe_list.c:74
#11 0x000000000040c819 in device_broadcast_event (dev=0x633810,
ev=<optimised out>)
    at /home/philipc/pkg/netifd/device.c:296
#12 0x0000000000406d80 in interface_set_down (iface=0x633a30, iface at entry=0x0)
    at /home/philipc/pkg/netifd/interface.c:1020
#13 0x000000000040472e in netifd_restart () at
/home/philipc/pkg/netifd/main.c:225

The problem is that when net1 is brought up, it also brings up all other
interfaces using the same device, but device_claim(&iface->main_dev) is not
called for these other interfaces. Here's the part of the backtrace for how
that happens:

#4  0x000000000040549a in __interface_set_up (iface=0x6339c0) at
/home/philipc/pkg/netifd/interface.c:280
#5  0x000000000040c75c in device_broadcast_cb (ctx=0x55c9, list=0x0)
at /home/philipc/pkg/netifd/device.c:287
#6  0x00007ffff7bd660e in safe_list_for_each
(head=head at entry=0x633850, cb=cb at entry=0x40c741 <device_broadcast_cb>,
    ctx=ctx at entry=0x7fffffffe43c) at /home/philipc/pkg/libubox/safe_list.c:74
#7  0x000000000040c845 in device_broadcast_event
(dev=dev at entry=0x633810, ev=ev at entry=DEV_EVENT_UP)
    at /home/philipc/pkg/netifd/device.c:296
#8  0x000000000040c8f0 in device_claim (dep=dep at entry=0x633270) at
/home/philipc/pkg/netifd/device.c:315
#9  0x0000000000405ff2 in interface_set_up (iface=0x6331b0) at
/home/philipc/pkg/netifd/interface.c:1009
#10 0x0000000000406de9 in interface_start_pending () at
/home/philipc/pkg/netifd/interface.c:1040
#11 0x000000000040c6d8 in config_init_all () at
/home/philipc/pkg/netifd/config.c:432

I can workaround the problem with the following patch. This doesn't seem
like the correct way to fix this properly though: should we be calling
device_claim() somewhere instead?

diff --git a/interface.c b/interface.c
index 848990e..b5a399d 100644
--- a/interface.c
+++ b/interface.c
@@ -275,6 +275,9 @@ __interface_set_up(struct interface *iface)
 {
    int ret;

+   if (iface->main_dev.dev && !iface->main_dev.claimed)
+       return -1;
+
    netifd_log_message(L_NOTICE, "Interface '%s' is setting up now\n",
iface->name);

    iface->state = IFS_SETUP;

—
Reply to this email directly or view it on GitHub
<https://github.com/openwrt/packages/issues/1476>.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/openwrt-devel/attachments/20150626/d249fef4/attachment.htm>
-------------- next part --------------
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel


More information about the openwrt-devel mailing list