Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 22 Oct 2003 13:41:57 -0400
From:      Gerrit Nagelhout <gnagelhout@sandvine.com>
To:        freebsd-net@freebsd.org
Subject:   Non-contiguous ifIndex problems with ifMib sysctl
Message-ID:  <FE045D4D9F7AED4CBFF1B3B813C85337021AAECB@mail.sandvine.com>

next in thread | raw e-mail | index | archive | help
Hi,

I am trying to debug a crash (null pointer access) in sysctl_ifdata (in
if_mib.c).  What I have noticed is that if interfaces (in this case vlans)
are created and destroyed dynamically, it is possible to create "holes" in
the ifnet_addrs structure.  For example, if I start with the following
interfaces:
1 em0
2 em1
3 lo0

and then do:
ifconfig vlan1 create
ifconfig vlan2 create
ifconfig vlan1 destroy

I end up with:
1 em0
2 em1
3 lo0
4 0
5 vlan2

In this case, the net.link.generic.system.ifcount is set to 4.  If an
application (like slurm) then calls sysctl on
net.link.generic.ifdata.<ifindex>, and loops from 1 to 5 for ifIndex, it
will crash when it gets to 4 because there are no checks for these holes,
and 4 is less than if_index.
I have also noticed that an snmpwalk to a system like this will have the
proper interface count, but will only show the interfaces before the hole.
It's easy enough to add the null check in sysctl_ifdata, and just return
ENOENT, but that won't fix the snmpwalk problem.  How should applications
generally deal with this?

Thanks,

Gerrit




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?FE045D4D9F7AED4CBFF1B3B813C85337021AAECB>