Skip to content

Commit

Permalink
ospfd: Prevent use after free on shutdown
Browse files Browse the repository at this point in the history
Address Sanitizer is reporting this issue:

==26177==ERROR: AddressSanitizer: heap-use-after-free on address 0x6120000238d8 at pc 0x7f88f7c4fa93 bp 0x7fff9a641830 sp 0x7fff9a641820
READ of size 8 at 0x6120000238d8 thread T0
    #0 0x7f88f7c4fa92 in if_delete lib/if.c:290
    #1 0x42192e in ospf_vl_if_delete ospfd/ospf_interface.c:912
    #2 0x42192e in ospf_vl_delete ospfd/ospf_interface.c:990
    FRRouting#3 0x4a6208 in no_ospf_area_vlink ospfd/ospf_vty.c:1227
    FRRouting#4 0x7f88f7c1553d in cmd_execute_command_real lib/command.c:1073
    FRRouting#5 0x7f88f7c19b1e in cmd_execute_command lib/command.c:1132
    FRRouting#6 0x7f88f7c19e8e in cmd_execute lib/command.c:1288
    FRRouting#7 0x7f88f7cd7523 in vty_command lib/vty.c:516
    FRRouting#8 0x7f88f7cd79ff in vty_execute lib/vty.c:1285
    FRRouting#9 0x7f88f7cde4f9 in vtysh_read lib/vty.c:2119
    FRRouting#10 0x7f88f7ccb845 in thread_call lib/thread.c:1549
    FRRouting#11 0x7f88f7c5d6a7 in frr_run lib/libfrr.c:1093
    FRRouting#12 0x412976 in main ospfd/ospf_main.c:221
    FRRouting#13 0x7f88f73b082f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
    FRRouting#14 0x413c78 in _start (/usr/local/master/sbin/ospfd+0x413c78)

Effectively we are in a shutdown phase and as part of shutdown we delete the
ospf interface pointer ( ifp->info ).  The interface deletion code
was modified in the past year to pass in the address of operator
to allow us to NULL out the holding pointer.  The catch here
is that we free the oi and then delete the interface passing
in the address of the oi->ifp pointer, causing a use after free.

Fixes: FRRouting#5555
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
  • Loading branch information
donaldsharp committed Dec 18, 2019
1 parent b198088 commit 7a004cc
Showing 1 changed file with 3 additions and 1 deletion.
4 changes: 3 additions & 1 deletion ospfd/ospf_interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -906,10 +906,12 @@ struct ospf_interface *ospf_vl_new(struct ospf *ospf,

static void ospf_vl_if_delete(struct ospf_vl_data *vl_data)
{
struct interface *ifp = vl_data->vl_oi->ifp;

vl_data->vl_oi->address->u.prefix4.s_addr = 0;
vl_data->vl_oi->address->prefixlen = 0;
ospf_if_free(vl_data->vl_oi);
if_delete(&vl_data->vl_oi->ifp);
if_delete(&ifp);
vlink_count--;
}

Expand Down

0 comments on commit 7a004cc

Please sign in to comment.