From patchwork Thu Jan 5 23:07:55 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Selva Nair X-Patchwork-Id: 2977 Return-Path: Delivered-To: patchwork@openvpn.net Received: by 2002:a05:7300:c95:b0:82:e4b3:40a0 with SMTP id p21csp610693dyk; Thu, 5 Jan 2023 15:09:04 -0800 (PST) X-Google-Smtp-Source: AMrXdXtUP43+tlYY0kDUr9npYqdAS0iRn8iQ5oH4Bl4A6OwrZxxlcvRPcAi9E67B6hYp87iGxd4m X-Received: by 2002:a05:6a20:4291:b0:b0:47e7:6cba with SMTP id o17-20020a056a20429100b000b047e76cbamr74225056pzj.46.1672960144667; Thu, 05 Jan 2023 15:09:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672960144; cv=none; d=google.com; s=arc-20160816; b=j1yJ/FLg+ZV1Nlj1+nITUYD400Ry8OIJu3oC4ITgWoHSX79N8/7dej4B2R9J3b5X8q l+jSKsEhVakJOgBDuwWDDfsdpDxJT9nPfvQreWT4V3oRCbAQCVw72f3cpsqjD/tfuB6s YWQBcyKXz8PX0DwCVGglkuAzpVlX1fr2biekRwwdPwap8NmHUyT9d0gjO5bAFEylxE7D lqq34MFDu5/EGu9fgMSWjAztRdSe3edMj/82h7s9hQWJCslBKlrEdcfPIiwJLgb3qaKj 8YMHPivFlgCxczIrBKRsqEr7T7QYLm0F1Rmc/PWvov2OzFvmlURTk/ZUOj8oI7ARCXhD N/TQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=errors-to:content-transfer-encoding:list-subscribe:list-help :list-post:list-archive:list-unsubscribe:list-id:precedence:subject :mime-version:references:in-reply-to:message-id:date:to:from :dkim-signature:dkim-signature:dkim-signature; bh=G/u82FJlgN9dSxsbSK8aHwFN7wmIi+1Yb6oRdFPN41I=; b=uRy+UkXNpdlVwTqL9h/0dJjmQTphK2bhBSMiPEihhE14qk9aUx0a+rHFT7yi371tcj bnPGLvhnIJMsBQRLEooPRNvmul6kE17mV/KZOadEstL6st4PJ+TFBfuYj/Skn2u/kvrY W7uNyu0hTt86jgmwL3KjiZjk6E5WBBVeNMBBHOKy408LuX3qcESxNgl5vVtz9FhpD5iL Y4yg3rTvvJ+vR81x1ORxKkjWb3ydYfC6Vek6WzTUdURbv6TvE8ZS80vjoYm7zhwj1q/B NgAe9jauKG7TowDg/NrH0qNXe4xHfu7nkbLuZLC3fNfnLssB2PRwJgVniK+CukGitUj/ Qpqg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@sourceforge.net header.s=x header.b=S+qErjWu; dkim=neutral (body hash did not verify) header.i=@sf.net header.s=x header.b=bH6ZHdsD; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=eODPqTBM; spf=pass (google.com: domain of openvpn-devel-bounces@lists.sourceforge.net designates 216.105.38.7 as permitted sender) smtp.mailfrom=openvpn-devel-bounces@lists.sourceforge.net; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from lists.sourceforge.net (lists.sourceforge.net. [216.105.38.7]) by mx.google.com with ESMTPS id h69-20020a638348000000b004a67448a514si5888051pge.278.2023.01.05.15.09.04 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jan 2023 15:09:04 -0800 (PST) Received-SPF: pass (google.com: domain of openvpn-devel-bounces@lists.sourceforge.net designates 216.105.38.7 as permitted sender) client-ip=216.105.38.7; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@sourceforge.net header.s=x header.b=S+qErjWu; dkim=neutral (body hash did not verify) header.i=@sf.net header.s=x header.b=bH6ZHdsD; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=eODPqTBM; spf=pass (google.com: domain of openvpn-devel-bounces@lists.sourceforge.net designates 216.105.38.7 as permitted sender) smtp.mailfrom=openvpn-devel-bounces@lists.sourceforge.net; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.0.1] (helo=sfs-ml-4.v29.lw.sourceforge.com) by sfs-ml-4.v29.lw.sourceforge.com with esmtp (Exim 4.95) (envelope-from ) id 1pDZLI-0007Z3-S6; Thu, 05 Jan 2023 23:08:12 +0000 Received: from [172.30.20.202] (helo=mx.sourceforge.net) by sfs-ml-4.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1pDZLG-0007Yx-MW for openvpn-devel@lists.sourceforge.net; Thu, 05 Jan 2023 23:08:10 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=Content-Transfer-Encoding:MIME-Version:References: In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=9wcLSMfqXNqfdmax4IuL9tXK4jRtZ/z/UEnChs9ZlA0=; b=S+qErjWuLdFFOfDn6AzwpizgRz FgFfqMWs0+u1bdL7WSmf7NqyM/dWrn4M3P2YRXBKrBj60l5eoeelfXxoyNTzn6FSqOm/Pan2aAPbk qIb9DM2ggOqKMNw5WNvC0jWszbGcRETED9esgC+gEIdjCMBir3uwSl+aAARz0MbtIBmE=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-Id: Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=9wcLSMfqXNqfdmax4IuL9tXK4jRtZ/z/UEnChs9ZlA0=; b=bH6ZHdsDGpez+FNFIDXFyG/IS4 IGJr+LZ69UH5iPZ94Vb2AX0PZ45dUMjpqbrBGmZVBJ77kBDdkYRYbTjl9ll9HtTlqa5GnHPd1dVPJ AsJsvJEFI9LojdLPpMM/qIVNw2Gx5pyHfoeSCgrDohd9LY/mmGm4qIgUimTGxGpnsMLs=; Received: from mail-il1-f176.google.com ([209.85.166.176]) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.95) id 1pDZLF-0000bK-UE for openvpn-devel@lists.sourceforge.net; Thu, 05 Jan 2023 23:08:10 +0000 Received: by mail-il1-f176.google.com with SMTP id bp26so190987ilb.3 for ; Thu, 05 Jan 2023 15:08:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=9wcLSMfqXNqfdmax4IuL9tXK4jRtZ/z/UEnChs9ZlA0=; b=eODPqTBM0b2LGzP8LLkHtPji2d/S8FGdO3GjIuIi5nCiKtjySFxaAF30mtlAfLMPIA 7kRQ/e26o1bF5nVMS9YqPT3e10GHOI40e0z4vHyVrUPCiYKgIDlsSvccaMGvcdLksT+s CFvXhkJn/enin8R4BCRYspQiWcnenbbK6NgYL+QDuBjDuA5u+YtkstCeL7MNEmSNmw4y Qm0HL0CVttq3xmKiRzG2tICJv53TWxV6lXlGFN6XtiKEIc8yZSkxKPIGnLOH59zkTP5Y BYRAFHe5IsrQbBUWcI3TvXIkyxspbxBo8wq5kM2OrnoDRwvXIwGmq0UuJyWXrNUzPMzm NycQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=9wcLSMfqXNqfdmax4IuL9tXK4jRtZ/z/UEnChs9ZlA0=; b=SF6m+SzZf7KXcBGo655EdK5x+2KsKe2jc3rpe19is7mMZGpYC1hFsM+jtweI+Vug54 L23bogF2wP1Wr3ByGVIs25A50UgPFRObRKv2HHKAoULLJ/QaiofBEd+S92j+JDhhbgeg UESsGwx9wIYBvMFbzjvUQ2WamMsTV3yQYkFC0R16a4jSkXq34oBb/F5nQHUpOTGI577H Zrk/WDneiHrDdeSHePMgxKgOlNo46B9+Qtrx6hToWAOid7tH3THfCC9alXQat0Gfv7Qp 3KL4EzuhnyrflqN5fZCb+SJJ/DG5f3Vx95VBQLgt3IZ3SuRUwAKZ7zN9sNnVWBG4P12f GyBw== X-Gm-Message-State: AFqh2kp1zFADebI3WtrpBrTu51HpaZOfKsavHZeGUvs8mzh8AAhT7ONq djV5R5FDdlTmRV00uY7TSBXqrY36iQ4= X-Received: by 2002:a92:d189:0:b0:309:2fa4:d45 with SMTP id z9-20020a92d189000000b003092fa40d45mr7282939ilz.0.1672960083283; Thu, 05 Jan 2023 15:08:03 -0800 (PST) Received: from uranus.sansel.ca (bras-vprn-tnhlon4053w-lp130-01-70-51-222-66.dsl.bell.ca. [70.51.222.66]) by smtp.gmail.com with ESMTPSA id n28-20020a02711c000000b0038a3b8aaf11sm11955469jac.37.2023.01.05.15.08.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 05 Jan 2023 15:08:02 -0800 (PST) From: selva.nair@gmail.com To: openvpn-devel@lists.sourceforge.net Date: Thu, 5 Jan 2023 18:07:55 -0500 Message-Id: <20230105230755.1662053-1-selva.nair@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230102194156.1560195-1-selva.nair@gmail.com> References: <20230102194156.1560195-1-selva.nair@gmail.com> MIME-Version: 1.0 X-Spam-Score: -0.2 (/) X-Spam-Report: Spam detection software, running on the system "util-spamd-2.v13.lw.sourceforge.com", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: From: Selva Nair - In win32_signal_get() re-order the check so that Windows signals are picked up even if signal_received is non-zero - When management is not active, management_sleep() becomes sleep() but it is not interruptible by signals on Windows. Fix this by periodically checking for signal. Content analysis details: (-0.2 points, 6.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [209.85.166.176 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider [selva.nair[at]gmail.com] -0.0 RCVD_IN_MSPIKE_H2 RBL: Average reputation (+2) [209.85.166.176 listed in wl.mailspike.net] -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid X-Headers-End: 1pDZLF-0000bK-UE Subject: [Openvpn-devel] [PATCH v3 4/5] Fix signal handling on Windows X-BeenThere: openvpn-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: openvpn-devel-bounces@lists.sourceforge.net X-getmail-retrieved-from-mailbox: Inbox X-GMAIL-THRID: =?utf-8?q?1753858675529086307?= X-GMAIL-MSGID: =?utf-8?q?1754225856421430201?= From: Selva Nair - In win32_signal_get() re-order the check so that Windows signals are picked up even if signal_received is non-zero - When management is not active, management_sleep() becomes sleep() but it is not interruptible by signals on Windows. Fix this by periodically checking for signal. Fixes Trac #311 #639 (windows specific part) Github: Fixes OpenVPN/openvpn#205 (windows specific part) Note: if stuck in address resolution, press ctrl-C and wait for getaddrinfo() to timeout. v2: WIN32 --> _WIN32 add a chunk in management_sleep that was missed by sloppy conflict-resolution v3: following review by Lev Stipakov win32_sleep() - Early fallback to Sleep() if no wait handles -- less indentation - Check signal only if wait-object triggered - Exit the while loop if not safe to continue Behaviour of win32_sleep(0) checking signal is retained though may be redundant Signed-off-by: Selva Nair --- More on why the while loop is required for the wait: The wait handle in.read can trigger at any key-board input. Even with ctrl-C, it first triggers for the ctrl keypress and only on a second round when keypress of "C" triggers it again we get it parsed as SIGINT/SIGTERM by win32_signal_get(). To make this safer, and not overload the process with repeated waits, we now filter out any status other than WAIT_OBJECT_0, not just WAIT_FAILED. That should be safe enough. src/openvpn/manage.c | 16 +++++++- src/openvpn/win32.c | 98 +++++++++++++++++++++++++++++--------------- src/openvpn/win32.h | 3 ++ 3 files changed, 81 insertions(+), 36 deletions(-) diff --git a/src/openvpn/manage.c b/src/openvpn/manage.c index 5465b7e9..9bd5ef4e 100644 --- a/src/openvpn/manage.c +++ b/src/openvpn/manage.c @@ -4045,9 +4045,16 @@ management_sleep(const int n) { management_event_loop_n_seconds(management, n); } - else if (n > 0) + else { - sleep(n); +#ifdef _WIN32 + win32_sleep(n); +#else + if (n > 0) + { + sleep(n); + } +#endif } } @@ -4088,13 +4095,18 @@ man_persist_client_stats(struct management *man, struct context *c) #else /* ifdef ENABLE_MANAGEMENT */ +#include "win32.h" void management_sleep(const int n) { +#ifdef _WIN32 + win32_sleep(n); +#else if (n > 0) { sleep(n); } +#endif /* ifdef _WIN32 */ } #endif /* ENABLE_MANAGEMENT */ diff --git a/src/openvpn/win32.c b/src/openvpn/win32.c index c3520bca..b82f28b9 100644 --- a/src/openvpn/win32.c +++ b/src/openvpn/win32.c @@ -642,50 +642,44 @@ int win32_signal_get(struct win32_signal *ws) { int ret = 0; - if (siginfo_static.signal_received) - { - ret = siginfo_static.signal_received; - } - else + + if (ws->mode == WSO_MODE_SERVICE) { - if (ws->mode == WSO_MODE_SERVICE) + if (win32_service_interrupt(ws)) { - if (win32_service_interrupt(ws)) - { - ret = SIGTERM; - } + ret = SIGTERM; } - else if (ws->mode == WSO_MODE_CONSOLE) + } + else if (ws->mode == WSO_MODE_CONSOLE) + { + switch (win32_keyboard_get(ws)) { - switch (win32_keyboard_get(ws)) - { - case 0x3B: /* F1 -> USR1 */ - ret = SIGUSR1; - break; + case 0x3B: /* F1 -> USR1 */ + ret = SIGUSR1; + break; - case 0x3C: /* F2 -> USR2 */ - ret = SIGUSR2; - break; + case 0x3C: /* F2 -> USR2 */ + ret = SIGUSR2; + break; - case 0x3D: /* F3 -> HUP */ - ret = SIGHUP; - break; + case 0x3D: /* F3 -> HUP */ + ret = SIGHUP; + break; - case 0x3E: /* F4 -> TERM */ - ret = SIGTERM; - break; + case 0x3E: /* F4 -> TERM */ + ret = SIGTERM; + break; - case 0x03: /* CTRL-C -> TERM */ - ret = SIGTERM; - break; - } - } - if (ret) - { - throw_signal(ret); /* this will update signinfo_static.signal received */ + case 0x03: /* CTRL-C -> TERM */ + ret = SIGTERM; + break; } } - return ret; + if (ret) + { + throw_signal(ret); /* this will update signinfo_static.signal received */ + } + return (siginfo_static.signal_received); } void @@ -1603,4 +1597,40 @@ set_openssl_env_vars() } } +void +win32_sleep(const int n) +{ + if (n < 0) + { + return; + } + + /* Sleep() is not interruptible. Use a WAIT_OBJECT to catch signal */ + if (!HANDLE_DEFINED(win32_signal.in.read)) + { + Sleep(n*1000); /* n=0 will just yield if there are threads */ + return; + } + + update_time(); + time_t expire = now + n; + + while (expire >= now) + { + DWORD status = WaitForSingleObject(win32_signal.in.read, (expire-now)*1000); + if ((status == WAIT_OBJECT_0 && win32_signal_get(&win32_signal)) + || status == WAIT_TIMEOUT) + { + return; + } + + update_time(); + + if (status != WAIT_OBJECT_0 && expire > now) /* wait failed ? */ + { + Sleep((expire-now)*1000); + return; + } + } +} #endif /* ifdef _WIN32 */ diff --git a/src/openvpn/win32.h b/src/openvpn/win32.h index b1371999..26d5ef8f 100644 --- a/src/openvpn/win32.h +++ b/src/openvpn/win32.h @@ -330,5 +330,8 @@ openvpn_execve(const struct argv *a, const struct env_set *es, const unsigned in bool openvpn_swprintf(wchar_t *const str, const size_t size, const wchar_t *const format, ...); +/* Sleep that can be interrupted by signals and exit event */ +void win32_sleep(const int n); + #endif /* ifndef OPENVPN_WIN32_H */ #endif /* ifdef _WIN32 */