summaryrefslogtreecommitdiff
path: root/lib/if.c
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2016-05-11 19:11:06 -0400
committerDonald Sharp <sharpd@cumulusnetworks.com>2016-05-12 13:19:58 -0400
commit38485402bc3dcc212f2c31abcffc4652c3a19a94 (patch)
treeef92ef75782b1551cea2b587501f226ec6c074f9 /lib/if.c
parentbd40c341ee28aa73ffc1eee576a209366cf16271 (diff)
lib: Fix connected lookup
When looking up the connected route, the delete was causing crashes in OSPF due to the oi having copies of the freshly deleted connected interface. Fix code to first lookup the connected route and use that instead of just deleting it. Valgrind Findings: ==24112== Invalid read of size 1 ==24112== at 0x4E8283F: ospf_intra_add_stub (ospf_route.c:614) ==24112== by 0x4E80B15: ospf_spf_process_stubs (ospf_spf.c:1064) ==24112== by 0x4E80F74: ospf_spf_calculate (ospf_spf.c:1269) ==24112== by 0x4E811C9: ospf_spf_calculate_timer (ospf_spf.c:1339) ==24112== by 0x5126230: thread_call (thread.c:1577) ==24112== by 0x401E00: main (ospf_main.c:377) ==24112== Address 0x7f56a09 is 9 bytes inside a block of size 40 free'd ==24112== at 0x4C29E90: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==24112== by 0x51290B3: zfree (memory.c:132) ==24112== by 0x51287F0: connected_free (if.c:987) ==24112== by 0x514406A: zebra_interface_address_read (zclient.c:1146) ==24112== by 0x4E5A81C: ospf_interface_address_add (ospf_zebra.c:262) ==24112== by 0x5144838: zclient_read (zclient.c:1397) ==24112== by 0x5126230: thread_call (thread.c:1577) ==24112== by 0x401E00: main (ospf_main.c:377) Ticket: CM-10890 Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com> Reviewed-by: Vivek Venkatraman <vivek@cumulusnetworks.com> Reviewed-by: Daniel Walton <dwalton@cumulusnetworks.com>
Diffstat (limited to 'lib/if.c')
-rw-r--r--lib/if.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/lib/if.c b/lib/if.c
index ebd8f5e02d..d49b5acad7 100644
--- a/lib/if.c
+++ b/lib/if.c
@@ -1082,6 +1082,24 @@ connected_same_prefix (struct prefix *p1, struct prefix *p2)
}
struct connected *
+connected_lookup_prefix_exact (struct interface *ifp, struct prefix *p)
+{
+ struct listnode *node;
+ struct listnode *next;
+ struct connected *ifc;
+
+ for (node = listhead (ifp->connected); node; node = next)
+ {
+ ifc = listgetdata (node);
+ next = node->next;
+
+ if (connected_same_prefix (ifc->address, p))
+ return ifc;
+ }
+ return NULL;
+}
+
+struct connected *
connected_delete_by_prefix (struct interface *ifp, struct prefix *p)
{
struct listnode *node;