mirror of
https://github.com/OpenVPN/openvpn.git
synced 2026-05-28 04:03:29 -04:00
Fix gateway detection with OpenBSD routing domains
When OpenVPN is started using a non-default routing table on OpenBSD (e.g., with 'route -T10 exec openvpn ...'), it hangs forever trying to read its default gateway from a PF_ROUTE socket. This is because rtm_tableid is not being initialised after bzeroing the rt_msghdr we write to the socket, so we end up asking the kernel for the default route in routing table 0. By default, the OpenBSD kernel will not respond to requests for routing table 0 from a process running in a different routing table, and even if it did, it would give us the wrong default gateway. The solution here is to set rtm_tableid to the value returned by getrtable(2), which always succeeds and returns the calling process's current routing table. This patch makes the test suite (without a t_client.rc) pass when run in a non-default routing table, where it would fail previously. It has also been successfully tested in client mode against both git master and OpenVPN 2.4.1 from ports on an OpenBSD -current system. Acked-by: Gert Doering <gert@greenie.muc.de> Message-Id: <20170413173129.87367-1-steven@steven-mcdonald.id.au> URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg14461.html Signed-off-by: Gert Doering <gert@greenie.muc.de>
This commit is contained in:
parent
3fbc9d2b1b
commit
3dd30bfe5f
1 changed files with 6 additions and 0 deletions
|
|
@ -3597,6 +3597,9 @@ get_default_gateway(struct route_gateway_info *rgi)
|
|||
rtm.rtm_flags = RTF_UP | RTF_GATEWAY;
|
||||
rtm.rtm_version = RTM_VERSION;
|
||||
rtm.rtm_seq = ++seq;
|
||||
#ifdef TARGET_OPENBSD
|
||||
rtm.rtm_tableid = getrtable();
|
||||
#endif
|
||||
rtm.rtm_addrs = rtm_addrs;
|
||||
|
||||
so_dst.sa_family = AF_INET;
|
||||
|
|
@ -3812,6 +3815,9 @@ get_default_gateway_ipv6(struct route_ipv6_gateway_info *rgi6,
|
|||
rtm.rtm_flags = RTF_UP;
|
||||
rtm.rtm_version = RTM_VERSION;
|
||||
rtm.rtm_seq = ++seq;
|
||||
#ifdef TARGET_OPENBSD
|
||||
rtm.rtm_tableid = getrtable();
|
||||
#endif
|
||||
|
||||
so_dst.sin6_family = AF_INET6;
|
||||
so_mask.sin6_family = AF_INET6;
|
||||
|
|
|
|||
Loading…
Reference in a new issue