From patchwork Fri Jan 6 00:54:38 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Selva Nair X-Patchwork-Id: 2978 Return-Path: Delivered-To: patchwork@openvpn.net Received: by 2002:a05:7300:c95:b0:82:e4b3:40a0 with SMTP id p21csp653440dyk; Thu, 5 Jan 2023 16:55:29 -0800 (PST) X-Google-Smtp-Source: AMrXdXu62XrTtqfvXZz5DDs79mufQ6d64oMT5RGsoL2NBLM8ke2pk8TIgLAe6vSqCCiXXBofUd9y X-Received: by 2002:a17:90a:db8a:b0:226:632c:abbd with SMTP id h10-20020a17090adb8a00b00226632cabbdmr18078935pjv.47.1672966529399; Thu, 05 Jan 2023 16:55:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672966529; cv=none; d=google.com; s=arc-20160816; b=thxdaKGAujfRwxs8L4yi6Pt3yWWa49vazvntO0iO9GazBQO6rRhidBY7yBkEitiS0M VDKxHJ5zKbGRHDlEPK8zpqLk2CQhelQnzuBWQSOelfSGL/GQ2EAvrt3tyz1QYtgKqZFR Aj+1hHGnhP0YOqi8j3XH3oq88TaiaVMsSOF+0C0JlQccKjYTJ0LLnpBapq2434a9FJ2L MA6oiardYeP5VACXzEzOVCqVG+pMnz55nompJW1ephpYz93XkSM/Ke0ayh5Jlhl53Pxd yfxUIYHLYctCnHRpk7BgN4Ao0LWwlHX51zBqBRs4yb4kqqpRHzmGNZHcD/y7hnawPhca fvTQ== 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=GS8LuLuEDD+Ny5a5XoJ7qPpk05Pk02D7Pcfz9GoB26A=; b=gGqTxcmRkrJDpApCVxc7mX79yodqZXro6u3YFsea5/ue+3CBQkt5vwufGwg/I7hRXJ iqfzbaCrLVXD8QqzMbl7lfeqnBwUONAFaQRg2CqOcDUXFVICOHzE25CLxhH7rtmWO3oL kUVJ45rb4A6IPJ3fQAEn2KAC2UAZ1H2OyzXioDVXknMEM21ie/LNf4XLSu3U81XkCi+n 9Yl1kPDvDb56Wo9ld4+hoIkHHdbQ3LL/B5DTOnNvrgYon5zEkUdE0yMf3Zz0q1IuP+qg X1eGLPndNMV88emAPlr/xZNzMe1xHYyv8NUrxhivP3mKT2nxCgXMtii6U7okTkavfPiU dL8A== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@sourceforge.net header.s=x header.b=Hk6k6FaA; dkim=neutral (body hash did not verify) header.i=@sf.net header.s=x header.b=Ma5ujQHJ; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=TdJlhtPU; 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 a10-20020a17090abe0a00b002239e6e30d4si3092922pjs.169.2023.01.05.16.55.29 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jan 2023 16:55:29 -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=Hk6k6FaA; dkim=neutral (body hash did not verify) header.i=@sf.net header.s=x header.b=Ma5ujQHJ; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=TdJlhtPU; 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 1pDb0f-0000vl-Kx; Fri, 06 Jan 2023 00:55:01 +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 1pDb0e-0000vX-Oa for openvpn-devel@lists.sourceforge.net; Fri, 06 Jan 2023 00:55:00 +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=yc7IOkDlW52Zrpx+kICe18ztoQJ+bAh4Dq1QG3Wu9P0=; b=Hk6k6FaAttrO8OHSY626CmbU7b ipztVsXoysUk4Rdv3/ET/sR6/1m3EgBgFePHxDteU3DCTBN10CTvpH8RBeAbjzXxvtn4atI3hRP9L FXbFUyyLC2ozLopTNFx2CZF0Bd0a0tvCanUW4yhcg7gzk89y9LS/rKJUHtBd0FV5/lT4=; 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=yc7IOkDlW52Zrpx+kICe18ztoQJ+bAh4Dq1QG3Wu9P0=; b=Ma5ujQHJy4olR1mnPOBxuLVZxg FibkTn1fKNFZOTHWO4knjGxhpV+Scddh8WBoHWIrTrtKsVY947jXG9pUQ9+O+Bqn2DEVxLVvOtUeE JGIa6SysCph0mB8pYkhmCjt5O6lFxhBNwcXC98Sthc2iomh1tQQVdrugIjuj0hb4+Ieo=; Received: from mail-io1-f49.google.com ([209.85.166.49]) by sfi-mx-1.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.95) id 1pDb0d-006nh9-LX for openvpn-devel@lists.sourceforge.net; Fri, 06 Jan 2023 00:55:00 +0000 Received: by mail-io1-f49.google.com with SMTP id r72so108660iod.5 for ; Thu, 05 Jan 2023 16:54:59 -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=yc7IOkDlW52Zrpx+kICe18ztoQJ+bAh4Dq1QG3Wu9P0=; b=TdJlhtPUk7PzLHlqRGi1l1VDDeWObINWhBoWR850NhBoa7cUZggPhoFcm0F8r0WmEf 9+jEX5NoLrZC3uJunHKza7M7BXbxkAy/RIOyzjKaywF30OnQ/5UwoRWTBxdxbcMCA5rb 90GW5gODXC6BWcZKYDbv+CnJPK4WXeAVrhMHhq4Y86uKT4t9fQjYq6i/5e1UTe9J3qbZ 14b/hTAAcqTGpjNpGrHzGZX10lrrsjN7Kj/EOQVva7OOlO0FwcdDxBHbRLkp3FrHzP8/ qjGacoQjffzcFgUk/KnCdzlIlh15QqqyKQv9KfiPvIzDCqYkYF1RemVf/ZeA14hXIXAv cbNA== 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=yc7IOkDlW52Zrpx+kICe18ztoQJ+bAh4Dq1QG3Wu9P0=; b=34bLIqv1MITmeDKtI/6sJvakH995tRAPD6EcxXvtJ+UnxRy7pmrGGCOuTwZBHrg+zX y4QVgr3ewqToX5iGQsvm/awYEq9sVcMux54mMnl5F1JE6rAipGkjbzAzzfN9NFGIUaz+ nHdlLTZjqyQYSDiV5olK8FXJZoGLqZFuAzNscZeKQ550Zb1VKOeXvPKnAoBo1OZVxt94 twE52srFEnvsXBCpevhotSL3SiYBpyQIVdSyakF1HSLrmvkYqBPjAfts5H3eFD2nSt3e 9tBVOMM78lU+7BHlGbLFieNmpHYhmf7SRPPlBkPmfLzig6/ZKBnGt8sJjh4VhbxTKrOg mAcQ== X-Gm-Message-State: AFqh2krf64jazObo/sIy1ZtKs8CHT5xJWMBPRGnbRx9wwj7YqhFFW/jH x5Di4MOWyjUHEyYs2WA+CT5FrXZdblk= X-Received: by 2002:a05:6602:2439:b0:6dd:7096:d9bc with SMTP id g25-20020a056602243900b006dd7096d9bcmr7143206iob.2.1672966493768; Thu, 05 Jan 2023 16:54:53 -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 f23-20020a056602071700b0067b75781af9sm13869896iox.37.2023.01.05.16.54.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 05 Jan 2023 16:54:53 -0800 (PST) From: selva.nair@gmail.com To: openvpn-devel@lists.sourceforge.net Date: Thu, 5 Jan 2023 19:54:38 -0500 Message-Id: <20230106005438.1664046-1-selva.nair@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230105230755.1662053-1-selva.nair@gmail.com> References: <20230105230755.1662053-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.49 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.49 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: 1pDb0d-006nh9-LX Subject: [Openvpn-devel] [PATCH v4 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?1754232551482220216?= 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 v4: Avoid Sleep(0) and never loop back to wait again if wait-failed Signed-off-by: Selva Nair Acked-by: Lev Stipakov --- 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 key-press and only on a second round when key-press 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 | 105 +++++++++++++++++++++++++++++-------------- src/openvpn/win32.h | 3 ++ 3 files changed, 88 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..569e086e 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,47 @@ 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)) + { + if (n > 0) + { + Sleep(n*1000); + } + 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) /* wait failed or some unexpected error ? */ + { + if (expire > now) + { + 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 */