Message ID | 20191219223917.1614-5-simon@rozman.si |
---|---|
State | Changes Requested |
Headers | show |
Series | [Openvpn-devel,1/7] tun.c: make Windows device lookup functions more general | expand |
Built, tested - works as expected. Probably the first time I ran two VPN tunnels with OpenVPN-GUI. The code has an assumption, however, that "windows-driver" power over "dev-node" - if --dev-node is "OpenVPNWinTun" (for example) and "windows-driver" is not specified, we bail out. I would add something like "if you want to use this device, add --windows-driver wintun" (and similar for tap) to the error message - I think it is good to tell user how to proceed in case of error(s). Acked-by: Lev Stipakov <lstipakov@gmail.com> pe 20. jouluk. 2019 klo 0.40 Simon Rozman (simon@rozman.si) kirjoitti: > Signed-off-by: Simon Rozman <simon@rozman.si> > --- > src/openvpn/tun.c | 38 ++++++++++++++++++++------------------ > 1 file changed, 20 insertions(+), 18 deletions(-) > > diff --git a/src/openvpn/tun.c b/src/openvpn/tun.c > index 9dc9b3a2..8508b9c0 100644 > --- a/src/openvpn/tun.c > +++ b/src/openvpn/tun.c > @@ -6194,7 +6194,6 @@ static void > tun_open_device(struct tuntap *tt, const char *dev_node, const char > **device_guid) > { > struct gc_arena gc = gc_new(); > - char tuntap_device_path[256]; > const struct tap_reg* tap_reg = get_tap_reg(&gc); > const struct panel_reg* panel_reg = get_panel_reg(&gc); > const struct device_instance_id_interface* > device_instance_id_interface = get_device_instance_id_interface(&gc); > @@ -6207,31 +6206,34 @@ tun_open_device(struct tuntap *tt, const char > *dev_node, const char **device_gui > */ > if (dev_node) > { > + bool is_picked_device_wintun = false; > + > /* Get the device GUID for the device specified with --dev-node. > */ > - *device_guid = get_device_guid(dev_node, actual_buffer, > sizeof(actual_buffer), NULL, tap_reg, panel_reg, &gc); > + *device_guid = get_device_guid(dev_node, actual_buffer, > sizeof(actual_buffer), &is_picked_device_wintun, tap_reg, panel_reg, &gc); > > if (!*device_guid) > { > - msg(M_FATAL, "TAP-Windows adapter '%s' not found", dev_node); > + msg(M_FATAL, "Adapter '%s' not found", dev_node); > } > > - /* Open Windows TAP-Windows adapter */ > - openvpn_snprintf(tuntap_device_path, sizeof(tuntap_device_path), > "%s%s%s", > - USERMODEDEVICEDIR, > - *device_guid, > - TAP_WIN_SUFFIX); > - > - tt->hand = CreateFile(tuntap_device_path, > - GENERIC_READ | GENERIC_WRITE, > - 0, /* was: FILE_SHARE_READ */ > - 0, > - OPEN_EXISTING, > - FILE_ATTRIBUTE_SYSTEM | > FILE_FLAG_OVERLAPPED, > - 0); > + if (tt->wintun) > + { > + if (!is_picked_device_wintun) > + { > + msg(M_FATAL, "Adapter '%s' is TAP-Windows, Wintun > expected", dev_node); > + } > + } > + else > + { > + if (is_picked_device_wintun) > + { > + msg(M_FATAL, "Adapter '%s' is Wintun, TAP-Windows > expected", dev_node); > + } > + } > > - if (tt->hand == INVALID_HANDLE_VALUE) > + if (!tun_try_open_device(tt, *device_guid, > device_instance_id_interface)) > { > - msg(M_ERR, "CreateFile failed on TAP device: %s", > tuntap_device_path); > + msg(M_FATAL, "Failed to open %s adapter: %s", tt->wintun ? > "Wintun" : "TAP-Windows", dev_node); > } > } > else > -- > 2.24.1.windows.2 > > > > _______________________________________________ > Openvpn-devel mailing list > Openvpn-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/openvpn-devel >
diff --git a/src/openvpn/tun.c b/src/openvpn/tun.c index 9dc9b3a2..8508b9c0 100644 --- a/src/openvpn/tun.c +++ b/src/openvpn/tun.c @@ -6194,7 +6194,6 @@ static void tun_open_device(struct tuntap *tt, const char *dev_node, const char **device_guid) { struct gc_arena gc = gc_new(); - char tuntap_device_path[256]; const struct tap_reg* tap_reg = get_tap_reg(&gc); const struct panel_reg* panel_reg = get_panel_reg(&gc); const struct device_instance_id_interface* device_instance_id_interface = get_device_instance_id_interface(&gc); @@ -6207,31 +6206,34 @@ tun_open_device(struct tuntap *tt, const char *dev_node, const char **device_gui */ if (dev_node) { + bool is_picked_device_wintun = false; + /* Get the device GUID for the device specified with --dev-node. */ - *device_guid = get_device_guid(dev_node, actual_buffer, sizeof(actual_buffer), NULL, tap_reg, panel_reg, &gc); + *device_guid = get_device_guid(dev_node, actual_buffer, sizeof(actual_buffer), &is_picked_device_wintun, tap_reg, panel_reg, &gc); if (!*device_guid) { - msg(M_FATAL, "TAP-Windows adapter '%s' not found", dev_node); + msg(M_FATAL, "Adapter '%s' not found", dev_node); } - /* Open Windows TAP-Windows adapter */ - openvpn_snprintf(tuntap_device_path, sizeof(tuntap_device_path), "%s%s%s", - USERMODEDEVICEDIR, - *device_guid, - TAP_WIN_SUFFIX); - - tt->hand = CreateFile(tuntap_device_path, - GENERIC_READ | GENERIC_WRITE, - 0, /* was: FILE_SHARE_READ */ - 0, - OPEN_EXISTING, - FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_OVERLAPPED, - 0); + if (tt->wintun) + { + if (!is_picked_device_wintun) + { + msg(M_FATAL, "Adapter '%s' is TAP-Windows, Wintun expected", dev_node); + } + } + else + { + if (is_picked_device_wintun) + { + msg(M_FATAL, "Adapter '%s' is Wintun, TAP-Windows expected", dev_node); + } + } - if (tt->hand == INVALID_HANDLE_VALUE) + if (!tun_try_open_device(tt, *device_guid, device_instance_id_interface)) { - msg(M_ERR, "CreateFile failed on TAP device: %s", tuntap_device_path); + msg(M_FATAL, "Failed to open %s adapter: %s", tt->wintun ? "Wintun" : "TAP-Windows", dev_node); } } else
Signed-off-by: Simon Rozman <simon@rozman.si> --- src/openvpn/tun.c | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-)