On 09.01.2014 05:18, John-Mark Gurney wrote:
Well, I was trying to manually add a route for a host on the local
network (I can explain why, but it doesn't matter) and I got this:
Hello!
There are several different kernel & userland bugs :)

# netstat -rnfinet
Routing tables

Internet:
Destination        Gateway            Flags    Netif Expire
default            192.168.0.14       UGS       re0
127.0.0.1          link#3             UH        lo0
192.168.0.0/24     link#1             U         re0
192.168.0.21       link#1             UHS       lo0
# route add -host 192.168.0.254 -interface re0 -link 04:4a:31:d3:95:dc
add net 192.168.0.254: gateway re0
"-link" specifier assumes no parameter, so the next argument is treated as netmask (since dst/gw are already supplied).
It is successfully parsed by getaddr() as AF_LINK sockaddr.

I've added additional check which requires dst/mask address families to be equal (r260472).

Historically, our kernel is a bit relaxed on checking validness for network masks:
it does not check family& does not perform usual (addr&mask == addr) check.
masked copy is performed instead. This is a bit tricky to fix since most in-kernel consumers are supplying non-masked address.
I'm going to fix this soon.


# netstat -rnfinet
Routing tables

Internet:
Destination        Gateway            Flags    Netif Expire
0.0.0.0&0x20500    90:2b:34:ab:bb:85  US        re0
Basically kernel treats sockaddr_dl as non-contiguos mask.
default            192.168.0.14       UGS       re0
10.0.0.0/8         link#2             U        msk0
10.42.42.21        link#2             UHS       lo0
127.0.0.1          link#3             UH        lo0
192.168.0.0/24     link#1             U         re0
192.168.0.21       link#1             UHS       lo0
# route delete 0.0.0.0
delete net 0.0.0.0
# route flush
Our rtsock protocol does not provide rtable flush, so internally route(8) does route dump for given table and issues RTF_DELETE messages for every route.
It seems that non-contiguous masks are handled incorrectly here..
::                   localhost            -fib 0   done
::ffff:0.0.0.0       localhost            -fib 0   done
fe80::               localhost            -fib 0   done
ff02::               localhost            -fib 0   done
# netstat -rnfinet
Routing tables

Internet:
Destination        Gateway            Flags    Netif Expire
0.0.0.0&0x20500    90:2b:34:ab:bb:85  US        re0
127.0.0.1          link#3             UH        lo0
192.168.0.0/24     link#1             U         re0
192.168.0.21       link#1             UHS       lo0

So, as you can see, I have managed to add a bogus route w/o a way
to remove it short of rebooting the box...  And because of this route,
You should be able to delete this using exactly the same command (s/add/del/).
some hosts like svn0.us-west.freebsd.org will match causing the machine
to try to find the ip on the local network.

This route I assume should be rejected by the kernel and not added,
or there is a mismatch between the route program and how the kernel
understands it.

I can provide more information upon request.

Thanks.


_______________________________________________
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"

Reply via email to