From patchwork Tue Oct 2 10:01:14 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Selva Nair X-Patchwork-Id: 475 Return-Path: Delivered-To: patchwork@openvpn.net Delivered-To: patchwork@openvpn.net Received: from director7.mail.ord1d.rsapps.net ([172.31.255.6]) by backend30.mail.ord1d.rsapps.net with LMTP id INz4LeTOs1scAgAAIUCqbw for ; Tue, 02 Oct 2018 16:02:44 -0400 Received: from proxy14.mail.iad3b.rsapps.net ([172.31.255.6]) by director7.mail.ord1d.rsapps.net with LMTP id +K9KK+TOs1sbSgAAovjBpQ ; Tue, 02 Oct 2018 16:02:44 -0400 Received: from smtp4.gate.iad3b ([172.31.255.6]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) by proxy14.mail.iad3b.rsapps.net with LMTP id KNJnJeTOs1ttKQAA+7ETDg ; Tue, 02 Oct 2018 16:02:44 -0400 X-Spam-Threshold: 95 X-Spam-Score: 0 X-Spam-Flag: NO X-Virus-Scanned: OK X-Orig-To: openvpnslackdevel@openvpn.net X-Originating-Ip: [216.105.38.7] Authentication-Results: smtp4.gate.iad3b.rsapps.net; iprev=pass policy.iprev="216.105.38.7"; spf=pass smtp.mailfrom="openvpn-devel-bounces@lists.sourceforge.net" smtp.helo="lists.sourceforge.net"; dkim=fail (signature verification failed) header.d=sourceforge.net; dkim=fail (signature verification failed) header.d=sf.net; dkim=fail (signature verification failed) header.d=gmail.com; dmarc=fail (p=none; dis=none) header.from=gmail.com X-Suspicious-Flag: YES X-Classification-ID: 1fbeca32-c67e-11e8-932b-525400789c6c-1-1 Received: from [216.105.38.7] ([216.105.38.7:40462] helo=lists.sourceforge.net) by smtp4.gate.iad3b.rsapps.net (envelope-from ) (ecelerity 4.2.38.62370 r(:)) with ESMTPS (cipher=DHE-RSA-AES256-GCM-SHA384) id A6/FB-19525-4EEC3BB5; Tue, 02 Oct 2018 16:02:44 -0400 Received: from [127.0.0.1] (helo=sfs-ml-1.v29.lw.sourceforge.com) by sfs-ml-1.v29.lw.sourceforge.com with esmtp (Exim 4.90_1) (envelope-from ) id 1g7QrM-0003hz-2u; Tue, 02 Oct 2018 20:01:32 +0000 Received: from [172.30.20.202] (helo=mx.sourceforge.net) by sfs-ml-1.v29.lw.sourceforge.com with esmtps (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.90_1) (envelope-from ) id 1g7QrK-0003ht-4I for openvpn-devel@lists.sourceforge.net; Tue, 02 Oct 2018 20:01:30 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=References:In-Reply-To:Message-Id:Date:Subject:Cc: To:From:Sender:Reply-To:MIME-Version:Content-Type:Content-Transfer-Encoding: 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=oLDAowQl7r64OYgzV/vxXLGqWWq8p/Di+9+Aksy1hCs=; b=SzRVzy8GF1rrgzNs6hXn8D14MW gAz2sR5N+8Dovd08/Hy7C2jwgjOMRb6dR3TvOw3Ytt+32S9nRZiCwFeE2u330mNB5K5Z2YHK77sl+ HKAj0FemJO2QM+4WRxFuQ4qZ2/RD3q8iTpLs9ECF+GU/eH6daA601G1cTG0Vn2n6QBHE=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To :MIME-Version:Content-Type:Content-Transfer-Encoding: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=oLDAowQl7r64OYgzV/vxXLGqWWq8p/Di+9+Aksy1hCs=; b=c5w+0HzPsYCvmGLvMzINY9Wgcx LvQmgcQi1b7WD8Q1wQu88fjtNgaFHqCTa5uTeNzxyK2sPAwPs581Irg9e3/1cyDDzU7k8oduhVcAA ShMPWtYm7URtjyRo9If/wobkzfq/92MFEB8hp23YOvkMZyDroOuXjy5xWRHggxpe7+No=; Received: from mail-io1-f47.google.com ([209.85.166.47]) by sfi-mx-1.v28.lw.sourceforge.com with esmtps (TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.90_1) id 1g7QrI-00Ggl0-Aj for openvpn-devel@lists.sourceforge.net; Tue, 02 Oct 2018 20:01:30 +0000 Received: by mail-io1-f47.google.com with SMTP id z16-v6so3129971iol.6 for ; Tue, 02 Oct 2018 13:01:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=oLDAowQl7r64OYgzV/vxXLGqWWq8p/Di+9+Aksy1hCs=; b=P8mhiNpbs0gnzvBqiP0WRKNy1lQe+GtYFK99soAzn8lNHzLCby8gMDMtepwJiXgAcB oNWLGsfUyjCjkiGrD9njeAYrVRK/0ddHZ0VeseuAUUKmHasGJMX73JzhJ2wj9pzS6ITB sONrJuTMxnQBsD1k7WOX07zlL2G0UIk0VMEPSqeip9RuSYqJQE05HvPR5WiL4NT1NEQa CeZBYpS0/SHg+nMOuKbYRyB5xkFVo0Q4h52AMdPvgt8PNHDUkeDaGUIjvVZf0CYCLjJQ BENbdOCcfbfjBOhAVoQel1ZaIH/AOJYGfYetWWzo7yOv3ppxGJE1BZTgh6JtmVH5vrrv ASYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=oLDAowQl7r64OYgzV/vxXLGqWWq8p/Di+9+Aksy1hCs=; b=HJmAK0IhlKz5XyxWsBPUjMMp9nTsNj7Hn+t4LXhvwiPKUrQ5R0MX55jVaF4iLGDj3Q pq4dVpDATlgYW9FBZ2lKSI8T+tWlETqXtUy5uCJvYGeeiC1Jyn9DvWvjRs9ntJCdTBnQ +DhvxIeAFTkMlRynMCwvJG5gK0cBZG6rXlhhPVxgxN4NEJBWl83SQMuWliciaBajf+Bf aQ1SAVdmmGJfbyU0WOC7KOvDVjrkuDkZLlkWhN2ml5B0IorazQZyRh//PWZW3spARfmY IjlhndNPuVoFhIa3Dw8EtFWlaKya+QHKmVKbHqtu/i7Ziu1XnA6U0fpopP2Cj+IRXomJ 0nIg== X-Gm-Message-State: ABuFfohVnFLaSwnSFjRYlP+dCKzDwE8xyCRmeJwSLbzGPTB5qsydq3lh ojzzkP5zAbT4mKd0VrnXwXTyVofcBhw= X-Google-Smtp-Source: ACcGV62HxQm96r8Ire+FHk5yf1nhoj7BNZ72LLZ5JqZMaQSjzSaJkmuFsrdYDM4IjegA3CcRPH8AnQ== X-Received: by 2002:a6b:6a02:: with SMTP id x2-v6mr8557869iog.38.1538510482254; Tue, 02 Oct 2018 13:01:22 -0700 (PDT) Received: from saturn.home.sansel.ca (CPE40167ea0e1c2-CM788df74daaa0.cpe.net.cable.rogers.com. [99.228.215.92]) by smtp.gmail.com with ESMTPSA id o201-v6sm6342961ito.41.2018.10.02.13.01.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 02 Oct 2018 13:01:21 -0700 (PDT) From: selva.nair@gmail.com To: openvpn-devel@lists.sourceforge.net Date: Tue, 2 Oct 2018 16:01:14 -0400 Message-Id: <1538510474-27602-3-git-send-email-selva.nair@gmail.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1538510474-27602-1-git-send-email-selva.nair@gmail.com> References: <1538229228-10620-1-git-send-email-selva.nair@gmail.com> <1538510474-27602-1-git-send-email-selva.nair@gmail.com> X-Spam-Report: Spam Filtering performed by mx.sourceforge.net. See http://spamassassin.org/tag/ for more details. -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [209.85.166.47 listed in list.dnswl.org] 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.47 listed in wl.mailspike.net] -0.0 SPF_PASS SPF: sender matches SPF record -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid 0.0 AWL AWL: Adjusted score from AWL reputation of From: address X-Headers-End: 1g7QrI-00Ggl0-Aj Subject: [Openvpn-devel] [PATCH 3/3] Refactor sending commands to interactive service 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: , MIME-Version: 1.0 Errors-To: openvpn-devel-bounces@lists.sourceforge.net X-getmail-retrieved-from-mailbox: Inbox From: Selva Nair Move writing the message buffer to the interactive service pipe and reading acknowledgement to a function. A minor bug in open_tun where the ack data could be read even after a communication error is fixed. Signed-off-by: Selva Nair Acked-by: Gert Doering --- src/openvpn/route.c | 6 +----- src/openvpn/tun.c | 34 +++++++++------------------------- src/openvpn/win32.c | 27 ++++++++++++++++++++++----- src/openvpn/win32.h | 9 +++++++++ 4 files changed, 41 insertions(+), 35 deletions(-) diff --git a/src/openvpn/route.c b/src/openvpn/route.c index ff39230..8a3e8b4 100644 --- a/src/openvpn/route.c +++ b/src/openvpn/route.c @@ -2991,16 +2991,12 @@ del_route_ipapi(const struct route_ipv4 *r, const struct tuntap *tt) static bool do_route_service(const bool add, const route_message_t *rt, const size_t size, HANDLE pipe) { - DWORD len; bool ret = false; ack_message_t ack; struct gc_arena gc = gc_new(); - if (!WriteFile(pipe, rt, size, &len, NULL) - || !ReadFile(pipe, &ack, sizeof(ack), &len, NULL)) + if (!send_msg_iservice(pipe, rt, size, &ack, "ROUTE")) { - msg(M_WARN, "ROUTE: could not talk to service: %s [%lu]", - strerror_win32(GetLastError(), &gc), GetLastError()); goto out; } diff --git a/src/openvpn/tun.c b/src/openvpn/tun.c index a2d5315..948fd17 100644 --- a/src/openvpn/tun.c +++ b/src/openvpn/tun.c @@ -82,7 +82,6 @@ static DWORD get_adapter_index_flexible(const char *name); static bool do_address_service(const bool add, const short family, const struct tuntap *tt) { - DWORD len; bool ret = false; ack_message_t ack; struct gc_arena gc = gc_new(); @@ -115,11 +114,8 @@ do_address_service(const bool add, const short family, const struct tuntap *tt) addr.prefix_len = tt->netbits_ipv6; } - if (!WriteFile(pipe, &addr, sizeof(addr), &len, NULL) - || !ReadFile(pipe, &ack, sizeof(ack), &len, NULL)) + if (!send_msg_iservice(pipe, &addr, sizeof(addr), &ack, "TUN")) { - msg(M_WARN, "TUN: could not talk to service: %s [%lu]", - strerror_win32(GetLastError(), &gc), GetLastError()); goto out; } @@ -141,7 +137,6 @@ out: static bool do_dns6_service(bool add, const struct tuntap *tt) { - DWORD len; bool ret = false; ack_message_t ack; struct gc_arena gc = gc_new(); @@ -185,11 +180,8 @@ do_dns6_service(bool add, const struct tuntap *tt) msg(D_LOW, "%s IPv6 dns servers on '%s' (if_index = %d) using service", (add ? "Setting" : "Deleting"), dns.iface.name, dns.iface.index); - if (!WriteFile(pipe, &dns, sizeof(dns), &len, NULL) - || !ReadFile(pipe, &ack, sizeof(ack), &len, NULL)) + if (!send_msg_iservice(pipe, &dns, sizeof(dns), &ack, "TUN")) { - msg(M_WARN, "TUN: could not talk to service: %s [%lu]", - strerror_win32(GetLastError(), &gc), GetLastError()); goto out; } @@ -5222,11 +5214,8 @@ service_enable_dhcp(const struct tuntap *tt) .iface = { .index = tt->adapter_index, .name = "" } }; - if (!WriteFile(pipe, &dhcp, sizeof(dhcp), &len, NULL) - || !ReadFile(pipe, &ack, sizeof(ack), &len, NULL)) + if (!send_msg_iservice(pipe, &dhcp, sizeof(dhcp), &ack, "Enable_dhcp")) { - msg(M_WARN, "Enable_dhcp: could not talk to service: %s [%lu]", - strerror_win32(GetLastError(), &gc), GetLastError()); goto out; } @@ -5461,18 +5450,16 @@ fork_dhcp_action(struct tuntap *tt) static void register_dns_service(const struct tuntap *tt) { - DWORD len; HANDLE msg_channel = tt->options.msg_channel; ack_message_t ack; struct gc_arena gc = gc_new(); message_header_t rdns = { msg_register_dns, sizeof(message_header_t), 0 }; - if (!WriteFile(msg_channel, &rdns, sizeof(rdns), &len, NULL) - || !ReadFile(msg_channel, &ack, sizeof(ack), &len, NULL)) + if (!send_msg_iservice(msg_channel, &rdns, sizeof(rdns), &ack, "Register_dns")) { - msg(M_WARN, "Register_dns: could not talk to service: %s [status=0x%lx]", - strerror_win32(GetLastError(), &gc), GetLastError()); + gc_free(&gc); + return; } else if (ack.error_number != NO_ERROR) @@ -5936,14 +5923,11 @@ open_tun(const char *dev, const char *dev_type, const char *dev_node, struct tun .iface = { .index = index, .name = "" } }; - if (!WriteFile(tt->options.msg_channel, &msg, sizeof(msg), &len, NULL) - || !ReadFile(tt->options.msg_channel, &ack, sizeof(ack), &len, NULL)) + if (send_msg_iservice(tt->options.msg_channel, &msg, sizeof(msg), + &ack, "TUN")) { - msg(M_WARN, "TUN: could not talk to service: %s [%lu]", - strerror_win32(GetLastError(), &gc), GetLastError()); + status = ack.error_number; } - - status = ack.error_number; } else { diff --git a/src/openvpn/win32.c b/src/openvpn/win32.c index 3905524..e43296e 100644 --- a/src/openvpn/win32.c +++ b/src/openvpn/win32.c @@ -1264,7 +1264,6 @@ win_get_tempdir(void) static bool win_block_dns_service(bool add, int index, const HANDLE pipe) { - DWORD len; bool ret = false; ack_message_t ack; struct gc_arena gc = gc_new(); @@ -1278,11 +1277,8 @@ win_block_dns_service(bool add, int index, const HANDLE pipe) .iface = { .index = index, .name = "" } }; - if (!WriteFile(pipe, &data, sizeof(data), &len, NULL) - || !ReadFile(pipe, &ack, sizeof(ack), &len, NULL)) + if (!send_msg_iservice(pipe, &data, sizeof(data), &ack, "Block_DNS")) { - msg(M_WARN, "Block_DNS: could not talk to service: %s [%lu]", - strerror_win32(GetLastError(), &gc), GetLastError()); goto out; } @@ -1473,4 +1469,25 @@ win32_version_string(struct gc_arena *gc, bool add_name) return (const char *)out.data; } +bool +send_msg_iservice(HANDLE pipe, const void *data, size_t size, + ack_message_t *ack, const char *context) +{ + struct gc_arena gc = gc_new(); + DWORD len; + bool ret = true; + + if (!WriteFile(pipe, data, size, &len, NULL) + || !ReadFile(pipe, ack, sizeof(*ack), &len, NULL)) + { + msg(M_WARN, "%s: could not talk to service: %s [%lu]", + context? context : "Unknown", + strerror_win32(GetLastError(), &gc), GetLastError()); + ret = false; + } + + gc_free(&gc); + return ret; +} + #endif /* ifdef _WIN32 */ diff --git a/src/openvpn/win32.h b/src/openvpn/win32.h index 4b99a5e..b5cbe25 100644 --- a/src/openvpn/win32.h +++ b/src/openvpn/win32.h @@ -26,6 +26,7 @@ #define OPENVPN_WIN32_H #include "mtu.h" +#include "openvpn-msg.h" /* location of executables */ #define SYS_PATH_ENV_VAR_NAME "SystemRoot" /* environmental variable name that normally contains the system path */ @@ -307,5 +308,13 @@ int win32_version_info(void); */ const char *win32_version_string(struct gc_arena *gc, bool add_name); +/* + * Send the |size| bytes in buffer |data| to the interactive service |pipe| + * and read the result in |ack|. Returns false on communication error. + * The string in |context| is used to prefix error messages. + */ +bool send_msg_iservice(HANDLE pipe, const void *data, size_t size, + ack_message_t *ack, const char *context); + #endif /* ifndef OPENVPN_WIN32_H */ #endif /* ifdef _WIN32 */