From patchwork Wed Sep 17 09:05:48 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Gert Doering X-Patchwork-Id: 4420 Return-Path: Delivered-To: patchwork@openvpn.net Received: by 2002:a05:7000:fc89:b0:671:5a2c:6455 with SMTP id cv9csp1974mac; Wed, 17 Sep 2025 02:06:18 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWKfrvWKnmV/pk+PASsGBSoUsIdCUZPTZDpwOat8tWCIM1ow8c3qGyIcK7F/oM4GeA7I+wxzIB5ox8=@openvpn.net X-Google-Smtp-Source: AGHT+IHS2fTRGhCYVN2JrIvzGqAAKo4qx3fGoM+Nc7L5ofhsFPwHs72Lp2Y6IZ3esHUl0M83Dnyv X-Received: by 2002:a05:6808:4f4f:b0:43b:52d8:f882 with SMTP id 5614622812f47-43d5067cfc3mr592219b6e.10.1758099978457; Wed, 17 Sep 2025 02:06:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1758099978; cv=none; d=google.com; s=arc-20240605; b=eHGCDzdNAUo4ro9BrpEjRvjbYtpYQqspy2NVbVfU5/Ym7p6JhVbLkcLRPsX8SlSexX hpb6mJtV+kp87hXYWxshMPfvYzou0rzkEqqzG5sJ71WlalF3Ruz+GTidwgJRdPLq+ev2 WTwxzobNmdtM5NR/duhhdYDjurXla7IoZ5MSgsi3P8cH//wU4SA+SvPwF1R4VSCV6wE9 qMKn6E5577bEHvJQpiJnQGnZuSUWaEzqAWrmZ0FEjIA5hI4RrGx1xmPyfX8H0HmPNztt aKnXBMEnyDFjawVYnRtaprrrNcFnywFqhR2dsPtX7YBM5FWSnst4j6JMN2G3STS+G0on OXJQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; 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=KnD6ZI4DOS39HtRB608hqllqZVM3paOS/SUEnpUSdg0=; fh=4NbAC/LsuMLI0S0hprUlLSLCiHwg6SCAifhH718Jh0Q=; b=lo0mEm8/a+44KeCRE099c/mwjm/fy2YBegL9Y1OXj9tn5sxPLiVyMDHbfeDbzOIdTs dbrPwFtdlDORUBlAL0ze7DqXNmSntDydqHepG3ajiBx/57nMUx5V+OLvO/PbYPlEh8ss QYZZ2E6fccLtH1Hxmj8gf+MFhiMvRjwqb8yB4WnWaOUsdrB0z0hW1iVLNXLlXO9AnSjX SMPdAVWzy1ahStJ6Z5/l4NMQTN83SiGOa2cluj8q95O0pHTXkuOH0TzUScth2QMbu8ni +raZrd3F6TyM+b9Xf6WYXzx7jCS8MTLM5y6z7+bbuKvLsopEg58mZdiPQW8pUIyFY0sX U6Xg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@lists.sourceforge.net header.s=beta header.b=jZlX3Gqn; dkim=neutral (body hash did not verify) header.i=@sourceforge.net header.s=x header.b=Q+ny9kQm; dkim=neutral (body hash did not verify) header.i=@sf.net header.s=x header.b=Jl3uEa84; 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=NONE dis=NONE) header.from=muc.de Received: from lists.sourceforge.net (lists.sourceforge.net. [216.105.38.7]) by mx.google.com with ESMTPS id 5614622812f47-43d4a904c71si458791b6e.66.2025.09.17.02.06.17 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Sep 2025 02:06:18 -0700 (PDT) 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=pass header.i=@lists.sourceforge.net header.s=beta header.b=jZlX3Gqn; dkim=neutral (body hash did not verify) header.i=@sourceforge.net header.s=x header.b=Q+ny9kQm; dkim=neutral (body hash did not verify) header.i=@sf.net header.s=x header.b=Jl3uEa84; 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=NONE dis=NONE) header.from=muc.de DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.sourceforge.net; s=beta; h=Content-Transfer-Encoding:Content-Type: List-Subscribe:List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id: Subject:MIME-Version:References:In-Reply-To:Message-ID:Date:To:From:Sender: Reply-To:Cc:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=KnD6ZI4DOS39HtRB608hqllqZVM3paOS/SUEnpUSdg0=; b=jZlX3GqnF/c7DTJyVUcKq/Lz59 f5uiUn88yHZjmGnqiYoBwJB6P/aaY3jGycfWJOuIehafecAgjSZvUCzxhXvE65ibX0OQfDv1spCpd Sy3z2ULOC9/pNW3dfXmo/NODvcndSCdCuH87l1AXskUYZaiiYDgIxUjUMA9eqmFrccVI=; Received: from [127.0.0.1] (helo=sfs-ml-2.v29.lw.sourceforge.com) by sfs-ml-2.v29.lw.sourceforge.com with esmtp (Exim 4.95) (envelope-from ) id 1uyo79-0003Or-Al; Wed, 17 Sep 2025 09:06:12 +0000 Received: from [172.30.29.66] (helo=mx.sourceforge.net) by sfs-ml-2.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1uyo78-0003Od-59 for openvpn-devel@lists.sourceforge.net; Wed, 17 Sep 2025 09:06:10 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=Content-Transfer-Encoding:Content-Type:MIME-Version :References:In-Reply-To:Message-ID:Date:Subject:To:From:Sender:Reply-To:Cc: 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=67Hzp1JK2IlqXJi6ZDWZjiDZB8xgEPTqLWDV0WFH7nY=; b=Q+ny9kQmlbJ6cPdhKipKTP+VL1 HM1Tc533k4YRz9hUkcq4svHLgvMNqnKJCpTm7EAJ+rN+b3kIKtqdvQRhml4gaPOzCN8iSZhK5AB/h z55r2cOkdnr2a7mZ+Auur6QQLqACn/YbabWf9xJo0q3MpqB+gJ0RmyTF14B+WSQ4CwN8=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=Content-Transfer-Encoding:Content-Type:MIME-Version:References: In-Reply-To:Message-ID:Date:Subject:To:From:Sender:Reply-To:Cc: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=67Hzp1JK2IlqXJi6ZDWZjiDZB8xgEPTqLWDV0WFH7nY=; b=Jl3uEa848fcjOPvQlwBHSQhfj8 Row8ynlHUJHUtVeBuShiGJG1ItPpf4U3t8zGQP9+qAGbDM7jqDiM1Y8+JzLG4COh/5R9hX2R5mIk5 4WTsVGI1ppw/VaNv3HkmQPEkfI3bRdRUGqThiQLkhWBB57Qk/7GiP6rt7mXAtZhRDmSg=; Received: from [193.149.48.134] (helo=blue.greenie.muc.de) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.95) id 1uyo77-0007H4-NG for openvpn-devel@lists.sourceforge.net; Wed, 17 Sep 2025 09:06:10 +0000 Received: from blue.greenie.muc.de (localhost [127.0.0.1]) by blue.greenie.muc.de (8.18.1/8.18.1) with ESMTP id 58H95vnW025433 for ; Wed, 17 Sep 2025 11:05:57 +0200 Received: (from gert@localhost) by blue.greenie.muc.de (8.18.1/8.18.1/Submit) id 58H95vU4025432 for openvpn-devel@lists.sourceforge.net; Wed, 17 Sep 2025 11:05:57 +0200 From: Gert Doering To: openvpn-devel@lists.sourceforge.net Date: Wed, 17 Sep 2025 11:05:48 +0200 Message-ID: <20250917090557.25414-1-gert@greenie.muc.de> X-Mailer: git-send-email 2.49.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Score: 1.3 (+) X-Spam-Report: Spam detection software, running on the system "sfi-spamd-2.hosts.colo.sdot.me", 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: Lev Stipakov There are two problems with the current implementation: - due to the code bug, we never display actual error message corresponding to the Windows error code. We use FORMAT_MESSAGE_ALLOCATE_BUFFER, in which case we must pass a pointer to the LPTSTR, not th [...] Content analysis details: (1.3 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 1.3 RDNS_NONE Delivered to internal network by a host with no rDNS X-Headers-End: 1uyo77-0007H4-NG Subject: [Openvpn-devel] [PATCH v2] openvpnserv: Fix writing messages to the event log 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?1843501443026663030?= X-GMAIL-MSGID: =?utf-8?q?1843501443026663030?= From: Lev Stipakov There are two problems with the current implementation: - due to the code bug, we never display actual error message corresponding to the Windows error code. We use FORMAT_MESSAGE_ALLOCATE_BUFFER, in which case we must pass a pointer to the LPTSTR, not the LPTSTR itself. - The error is not displayed in the "General" tab, which is very confusing. One needs to go to the "Details" tab to see what is wrong. This commit solves both problems. We now display a proper error message in addition to the text provided by the service ("what went wrong"). While on it, remove trailing symbols ín a safer way. To display the message in "General" tab, we create a registered message file (openvpnservmsg.dll), which contains message template. Note that this requires changes to the installer - we need to install the new DLL and add a registry entry. GitHub: https://github.com/OpenVPN/openvpn/issues/842 Change-Id: I423c9880def0eb479abb72bef2e8034a73cf5905 Signed-off-by: Lev Stipakov Acked-by: Selva Nair --- This change was reviewed on Gerrit and approved by at least one developer. I request to merge it to master. Gerrit URL: https://gerrit.openvpn.net/c/openvpn/+/1188 This mail reflects revision 2 of this Change. Acked-by according to Gerrit (reflected above): Selva Nair diff --git a/src/openvpnserv/CMakeLists.txt b/src/openvpnserv/CMakeLists.txt index 7e3efb2..82099f1 100644 --- a/src/openvpnserv/CMakeLists.txt +++ b/src/openvpnserv/CMakeLists.txt @@ -6,11 +6,14 @@ add_executable(openvpnserv) +set(MC_GEN_DIR ${CMAKE_CURRENT_BINARY_DIR}/mc) + target_include_directories(openvpnserv PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/../../ ../../include/ ../openvpn/ ../compat/ + ${MC_GEN_DIR} ) target_sources(openvpnserv PRIVATE common.c @@ -33,3 +36,34 @@ target_compile_options(openvpnserv PRIVATE -municode) target_link_options(openvpnserv PRIVATE -municode) endif () + +# below we generate a DLL which contains an event source for event log messages from eventmsg.mc template +file(MAKE_DIRECTORY ${MC_GEN_DIR}) +set(MC_FILE ${CMAKE_CURRENT_SOURCE_DIR}/eventmsg.mc) + +find_program(MC_COMPILER NAMES mc mc.exe x86_64-w64-mingw32-windmc i686-w64-mingw32-windmc windmc) + +if (NOT MC_COMPILER) + message(FATAL_ERROR "No message compiler found.") +endif() + +add_custom_command( + OUTPUT ${MC_GEN_DIR}/eventmsg.rc ${MC_GEN_DIR}/eventmsg.h + COMMAND ${MC_COMPILER} -U -h ${MC_GEN_DIR} -r ${MC_GEN_DIR} ${MC_FILE} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/eventmsg.mc + VERBATIM + ) + +# generate rc file for DLL and header for the service binary +add_custom_target(msg_mc_gen ALL DEPENDS ${MC_GEN_DIR}/eventmsg.rc ${MC_GEN_DIR}/eventmsg.h) + +add_library(openvpnservmsg SHARED ${MC_GEN_DIR}/eventmsg.rc) + +if (MSVC) + set_target_properties(openvpnservmsg PROPERTIES LINK_FLAGS "/NOENTRY") +else() + target_link_options(openvpnservmsg PRIVATE "-Wl,--no-entry") +endif() + +add_dependencies(openvpnservmsg msg_mc_gen) +add_dependencies(openvpnserv msg_mc_gen) diff --git a/src/openvpnserv/common.c b/src/openvpnserv/common.c index a42c65d..e975cc7 100644 --- a/src/openvpnserv/common.c +++ b/src/openvpnserv/common.c @@ -22,6 +22,7 @@ #include "service.h" #include "validate.h" +#include "eventmsg.h" LPCWSTR service_instance = L""; static wchar_t win_sys_path[MAX_PATH]; @@ -203,25 +204,29 @@ LPWSTR tmp = NULL; error = GetLastError(); - len = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM - | FORMAT_MESSAGE_ARGUMENT_ARRAY, - NULL, error, LANG_NEUTRAL, tmp, 0, NULL); + len = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM + | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&tmp, 0, NULL); - if (len == 0 || (long)_countof(buf) < (long)len + 14) + if (!len || !tmp) { - buf[0] = L'\0'; - } - else - { - tmp[wcslen(tmp) - 2] = L'\0'; /* remove CR/LF characters */ - swprintf(buf, _countof(buf), L"%ls (0x%x)", tmp, error); + swprintf(buf, _countof(buf), L"Unknown error (0x%lx)", error); + if (tmp) + { + LocalFree(tmp); + } + return buf; } - if (tmp) + /* trim trailing CR / LF / spaces safely */ + while (len && (tmp[len - 1] == L'\r' || tmp[len - 1] == L'\n' || tmp[len - 1] == L' ')) { - LocalFree(tmp); + tmp[--len] = L'\0'; } + swprintf(buf, _countof(buf), L"%ls (0x%lx)", tmp, error); + + LocalFree(tmp); return buf; } @@ -253,8 +258,14 @@ const WCHAR *mesg[] = { msg[0], msg[1] }; ReportEvent(hEventSource, - flags & MSG_FLAGS_ERROR ? EVENTLOG_ERROR_TYPE : EVENTLOG_INFORMATION_TYPE, 0, 0, - NULL, 2, 0, mesg, NULL); + flags & MSG_FLAGS_ERROR ? EVENTLOG_ERROR_TYPE : EVENTLOG_INFORMATION_TYPE, + 0, + EVT_TEXT_2, + NULL, + 2, + 0, + mesg, + NULL); DeregisterEventSource(hEventSource); } diff --git a/src/openvpnserv/eventmsg.mc b/src/openvpnserv/eventmsg.mc new file mode 100644 index 0000000..722a30e --- /dev/null +++ b/src/openvpnserv/eventmsg.mc @@ -0,0 +1,23 @@ +MessageIdTypedef=DWORD + +SeverityNames=(Success=0x0:STATUS_SEVERITY_SUCCESS + Informational=0x1:STATUS_SEVERITY_INFORMATIONAL + Warning=0x2:STATUS_SEVERITY_WARNING + Error=0x3:STATUS_SEVERITY_ERROR + ) + +FacilityNames=(System=0x0:FACILITY_SYSTEM + Runtime=0x2:FACILITY_RUNTIME + Stubs=0x3:FACILITY_STUBS + Io=0x4:FACILITY_IO_ERROR_CODE +) + +LanguageNames=(English=0x409:MSG00409) + +MessageId=0x1 +Severity=Error +Facility=Runtime +SymbolicName=EVT_TEXT_2 +Language=English +%1%n%2 +.