From a4d7bf9c5d0f6afa12de295ad12342c3413781da Mon Sep 17 00:00:00 2001 From: Daniel Lenski Date: Tue, 30 Mar 2021 18:35:45 -0700 Subject: [PATCH] Distinguish ERROR_ACCESS return value from create_wintun() The error 'Is the driver installed?' is misleading in this case; the actual problem is likely that the user isn't running as SYSTEM/Administrator. Signed-off-by: Daniel Lenski --- tun-win32.c | 7 ++++++- wintun.c | 10 ++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/tun-win32.c b/tun-win32.c index b265df8d..0258bad9 100644 --- a/tun-win32.c +++ b/tun-win32.c @@ -379,13 +379,18 @@ intptr_t os_setup_tun(struct openconnect_info *vpninfo) } /* Try creating a Wintun instead of TAP */ - if (!create_wintun(vpninfo)) { + int retw = create_wintun(vpninfo); + if (!retw) { ret = search_taps(vpninfo, open_tun); if (ret == OPEN_TUN_SOFTFAIL) ret = OPEN_TUN_HARDFAIL; if (ret == OPEN_TUN_HARDFAIL) os_shutdown_wintun(vpninfo); + } else if (retw == -EPERM) { + ret = OPEN_TUN_HARDFAIL; + vpn_progress(vpninfo, PRG_ERR, + _("Access denied creating Wintun adapter. Are you running with Administrator privileges?\n")); } } diff --git a/wintun.c b/wintun.c index 42648102..f575e594 100644 --- a/wintun.c +++ b/wintun.c @@ -102,19 +102,21 @@ static int init_wintun(struct openconnect_info *vpninfo) int create_wintun(struct openconnect_info *vpninfo) { - if (init_wintun(vpninfo)) - return -1; + int ret = init_wintun(vpninfo); + if (ret < 0) + return ret; vpninfo->wintun_adapter = WintunCreateAdapter(WINTUN_POOL_NAME, vpninfo->ifname_w, NULL, NULL); if (vpninfo->wintun_adapter) return 0; - char *errstr = openconnect__win32_strerror(GetLastError()); + ret = GetLastError(); + char *errstr = openconnect__win32_strerror(ret); vpn_progress(vpninfo, PRG_ERR, "Could not create Wintun adapter '%S': %s\n", vpninfo->ifname_w, errstr); free(errstr); - return -EIO; + return (ret == ERROR_ACCESS_DENIED ? -EPERM : -EIO); } intptr_t open_wintun(struct openconnect_info *vpninfo, char *guid, wchar_t *wname) -- 2.50.1