[Xorp-users] xorp_rib SEGV when removing interface while using OSPF.

Pavlin Radoslavov pavlin at icir.org
Mon Sep 24 10:13:01 PDT 2007


Ben Greear <greearb at candelatech.com> wrote:

> While testing removing interfaces & OSPF, I get a core from rib_xorp.  
> The backtrace shows that
> the net object has a _vif that is bad memory (ie, already deleted as far 
> as I can tell.)
> 
> I believe it might be because of this code in rib.cc.  It is cleaning 
> out all of the
> 'directly connected' routes, but maybe it is not cleaning up OSPF routes?
> 
> Since we are deleting the vif object, I think we should notify all 
> tables that the
> vif is being deleted and have it delete any route that references the 
> vif, regardless
> of what IP the route is.  Otherwise, stale memory will be referenced 
> next time
> something messes with the routes on the dead interface.

Without looking into all details, I think your intuition is right.
Could you open a Bugzilla entry for the issue and include
instuctions how to reproduce the issue. Without such instructions it
will be much more difficult to track and fix the issue.

Thanks,
Pavlin

> int
> RIB<A>::delete_vif(const string& vifname)
> {
>     debug_msg("RIB::delete_vif: %s\n", vifname.c_str());
>     map<string, Vif>::iterator vi = _vifs.find(vifname);
>     if (vi == _vifs.end()) {
>         return XORP_ERROR;
>     }
>     Vif& vif = vi->second;
> 
>     if (vif.is_underlying_vif_up()) {
>         //
>         // Delete the directly connected routes associated with this vif
>         //
>         list<VifAddr>::const_iterator ai;
>         for (ai = vif.addr_list().begin(); ai != vif.addr_list().end(); 
> ++ai) {
>             if (ai->addr().af() != A::af())
>                 continue;
> 
>             IPNet<A> subnet_addr;
>             A peer_addr;
>             ai->subnet_addr().get(subnet_addr);
>             ai->peer_addr().get(peer_addr);
>             delete_connected_route(vif, subnet_addr, peer_addr);
>         }
>     }
> 
>     _vifs.erase(vi);
>     return XORP_OK;
> }
> 
> Here's the backtrace.  _vif is corrupted by frame 11.
> 
> #0  0x473b680f in std::basic_string<char, std::char_traits<char>, 
> std::allocator<char> >::basic_string () from /usr/lib/libstdc++.so.6
> #1  0x080b81b4 in DeleteRoute (this=0x82b6020, parent=0x82aca28, 
> ipr=@0x82b6bf0) at redist_xrl.cc:236
> #2  0x080b82a0 in DeleteTransactionRoute (this=0x82b6020, 
> parent=0x82aca28, ipr=@0x82b6bf0) at redist_xrl.cc:618
> #3  0x080b9fbd in RedistTransactionXrlOutput<IPv4>::delete_route 
> (this=0x82aca28, ipr=@0x82b6bf0) at redist_xrl.cc:1062
> #4  0x08057e23 in Redistributor<IPv4>::RedistEventInterface::did_delete 
> (this=0x82ac3d8, ipr=@0x82b6bf0) at rt_tab_redist.cc:294
> #5  0x08059768 in RedistTable<IPv4>::delete_route (this=0x82a3c20, 
> r=0x82b6bf0, caller=0x82a3bb0) at rt_tab_redist.cc:441
> #6  0x080a6a77 in PolicyRedistTable<IPv4>::delete_route (this=0x82a3bb0, 
> route=0x82b6bf0, caller=0x82a3b70) at rt_tab_pol_redist.cc:101
> #7  0x080ad732 in RegisterTable<IPv4>::delete_route (this=0x82a3b70, 
> route=0x82b6bf0, caller=0x82b5ce0) at rt_tab_register.cc:271
> #8  0x0809bcf2 in MergedTable<IPv4>::delete_route (this=0x82b5ce0, 
> route=0x82b6bf0, caller=0x82b6bd8) at rt_tab_merged.cc:109
> #9  0x0809bcf2 in MergedTable<IPv4>::delete_route (this=0x82b6bd8, 
> route=0x82b6bf0, caller=0x82b5f20) at rt_tab_merged.cc:109
> #10 0x080597e1 in RedistTable<IPv4>::delete_route (this=0x82b5f20, 
> r=0x82b6bf0, caller=0x82b60d0) at rt_tab_redist.cc:445
> #11 0x0809f470 in OriginTable<IPv4>::delete_route (this=0x82b60d0, 
> net=@0x82b1200) at rt_tab_origin.cc:131
> #12 0x08086604 in RIB<IPv4>::delete_route (this=0xbfdac034, 
> tablename=@0x82b5ea0, net=@0x82b1200) at rib.cc:878
> #13 0x08066379 in XrlRibTarget::rib_0_1_delete_route4 (this=0xbfdac3d8, 
> protocol=@0x82b5ea0, unicast=@0x82b6a7c, multicast=@0x82b1224,
>     network=@0x82b1200) at xrl_target.cc:581
> #14 0x0811c335 in XrlRibTargetBase::handle_rib_0_1_delete_route4 
> (this=0xbfdac3d8, xa_inputs=@0xbfda3eac) at rib_base.cc:855
> #15 0x0811d203 in XorpMemberCallback2B0<XrlCmdError const, 
> XrlRibTargetBase, XrlArgs const&, XrlArgs*>::dispatch (this=0x829f1b0,
>     a1=@0xbfda3eac, a2=0xbfda3e90) at ../../libxorp/callback_nodebug.hh:4615
> #16 0x08190339 in XrlCmdEntry::dispatch (this=0x829f204, 
> inputs=@0xbfda3eac, outputs=0xbfda3e90) at xrl_cmd_map.hh:37
> #17 0x08196f5a in XrlDispatcher::dispatch_xrl (this=0xbfdac638, 
> method_name=@0xbfda3e20, inputs=@0xbfda3eac, outputs=@0xbfda3e90)
>     at xrl_dispatcher.cc:60
> ...
> (gdb) print *found->_vif
> $9 = {_vptr.Vif = 0x4d0a322e, _name = {static npos = 4294967295,
>     _M_dataplus = {<std::allocator<char>> = 
> {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
>       _M_p = 0x79546773 <Address 0x79546773 out of bounds>}}, _ifname = 
> {static npos = 4294967295,
>     _M_dataplus = {<std::allocator<char>> = 
> {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
>       _M_p = 0x78206570 <Address 0x78206570 out of bounds>}}, _pif_index 
> = 1902465802, _vif_index = 840986446, _is_pim_register = 55,
>   _is_p2p = 49, _is_loopback = 55, _is_discard = 10, _is_unreachable = 
> 77, _is_multicast_capable = 115, _is_broadcast_capable = 103,
>   _is_underlying_vif_up = 68, _mtu = 543257697, _addr_list = 
> {<std::_List_base<VifAddr,std::allocator<VifAddr> >> = {
>       _M_impl = {<std::allocator<std::_List_node<VifAddr> >> = 
> {<__gnu_cxx::new_allocator<std::_List_node<VifAddr> >> = {<No data 
> fields>}, <No data fields>}, _M_node = {_M_next = 0x646e6966, _M_prev = 
> 0x2f3a7265}}}, <No data fields>}}
> (gdb)
> 
> Thanks,
> Ben
> 
> -- 
> Ben Greear <greearb at candelatech.com> 
> Candela Technologies Inc  http://www.candelatech.com
> 
> 
> _______________________________________________
> Xorp-users mailing list
> Xorp-users at xorp.org
> http://mailman.ICSI.Berkeley.EDU/mailman/listinfo/xorp-users



More information about the Xorp-users mailing list