From patchwork Fri Apr 22 03:40:37 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arne Schwabe X-Patchwork-Id: 2383 Return-Path: Delivered-To: patchwork@openvpn.net Delivered-To: patchwork@openvpn.net Received: from director15.mail.ord1d.rsapps.net ([172.30.191.6]) by backend41.mail.ord1d.rsapps.net with LMTP id iLChB0q1YmJzCAAAqwncew (envelope-from ) for ; Fri, 22 Apr 2022 10:01:46 -0400 Received: from proxy10.mail.ord1d.rsapps.net ([172.30.191.6]) by director15.mail.ord1d.rsapps.net with LMTP id OHfLEUq1YmLUPwAAIcMcQg (envelope-from ) for ; Fri, 22 Apr 2022 10:01:46 -0400 Received: from smtp3.gate.ord1c ([172.30.191.6]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) by proxy10.mail.ord1d.rsapps.net with LMTPS id IIHQEEq1YmJcEAAAfSg8FQ (envelope-from ) for ; Fri, 22 Apr 2022 10:01:46 -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: smtp3.gate.ord1c.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; dmarc=none (p=nil; dis=none) header.from=rfc2549.org X-Suspicious-Flag: YES X-Classification-ID: be4cef38-c244-11ec-8cbd-842b2b47481a-1-1 Received: from [216.105.38.7] ([216.105.38.7:56168] helo=lists.sourceforge.net) by smtp3.gate.ord1c.rsapps.net (envelope-from ) (ecelerity 4.2.38.62370 r(:)) with ESMTPS (cipher=DHE-RSA-AES256-GCM-SHA384) id CD/FE-28333-945B2626; Fri, 22 Apr 2022 10:01:45 -0400 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.94.2) (envelope-from ) id 1nhtpi-000339-FE; Fri, 22 Apr 2022 14:00:27 +0000 Received: from [172.30.20.202] (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.94.2) (envelope-from ) id 1nhtpg-000332-Sq for openvpn-devel@lists.sourceforge.net; Fri, 22 Apr 2022 14:00:25 +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:To:From:Sender:Reply-To:Cc: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=5P082HUJOPfoMtwIPC8SdNyDKsj3tuyq/OfFhKlJevk=; b=YwzDKf0aLCJLYNosZhWt3iKInm RD7R3DOOpcVo9VTmQKqtQkM8Dg5pz9ugRkaqqekkEXo4GgtV4ijNdsfpnbgPyxabPTlosRxSE5wEr /jHuqvh8uO+asC+ITe9vrAvq6fbgONjkhMlIQ80/iBNgEktQaPQSxrAqZm99PUTLFNwY=; 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:To:From:Sender:Reply-To:Cc: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=5P082HUJOPfoMtwIPC8SdNyDKsj3tuyq/OfFhKlJevk=; b=hudn67kFaahSbZ88NpX+RoCO2w 2b3JZreLLQEkK7FoobZYUR6s/75pd2JSInQ006Q20u6b0fpOvhtEJfs84AcMF7iWEA+C7Gb1YP+Pc dMNz1nDfICdKSwxNnd0pTxC8kVgh58IeaazrMLiQEBaSS1G7gvJA/6Eyi3BjmPL5idwk=; Received: from mail.blinkt.de ([192.26.174.232]) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.94.2) id 1nhtpc-00040X-Du for openvpn-devel@lists.sourceforge.net; Fri, 22 Apr 2022 14:00:25 +0000 Received: from kamera.blinkt.de ([2001:638:502:390:20c:29ff:fec8:535c]) by mail.blinkt.de with smtp (Exim 4.95 (FreeBSD)) (envelope-from ) id 1nhtWY-0008sb-Vl for openvpn-devel@lists.sourceforge.net; Fri, 22 Apr 2022 15:40:38 +0200 Received: (nullmailer pid 3801309 invoked by uid 10006); Fri, 22 Apr 2022 13:40:38 -0000 From: Arne Schwabe To: openvpn-devel@lists.sourceforge.net Date: Fri, 22 Apr 2022 15:40:37 +0200 Message-Id: <20220422134038.3801239-9-arne@rfc2549.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220422134038.3801239-1-arne@rfc2549.org> References: <20220422134038.3801239-1-arne@rfc2549.org> MIME-Version: 1.0 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: This allows only the parsing without verification to be reused in other code parts. --- src/openvpn/reliable.c | 60 ++++++++++++++++++++++++ src/openvpn/reliable.h | 22 +++++++++++++ [...] Content analysis details: (0.2 points, 6.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record 0.2 HEADER_FROM_DIFFERENT_DOMAINS From and EnvelopeFrom 2nd level mail domains are different 0.0 SPF_NONE SPF: sender does not publish an SPF Record X-Headers-End: 1nhtpc-00040X-Du Subject: [Openvpn-devel] [PATCH 08/28] Split out reliable_ack_parse from reliable_ack_read 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 This allows only the parsing without verification to be reused in other code parts. Acked-By: Frank Lichtenheld --- src/openvpn/reliable.c | 60 ++++++++++++++++++++++++------------------ src/openvpn/reliable.h | 22 ++++++++++++++++ src/openvpn/ssl.c | 1 - 3 files changed, 56 insertions(+), 27 deletions(-) diff --git a/src/openvpn/reliable.c b/src/openvpn/reliable.c index 10a798a59..274f937ab 100644 --- a/src/openvpn/reliable.c +++ b/src/openvpn/reliable.c @@ -153,56 +153,64 @@ reliable_ack_acknowledge_packet_id(struct reliable_ack *ack, packet_id_type pid) return false; } -/* read a packet ID acknowledgement record from buf into ack */ + bool reliable_ack_read(struct reliable_ack *ack, struct buffer *buf, const struct session_id *sid) { - struct gc_arena gc = gc_new(); - int i; - uint8_t count; - packet_id_type net_pid; - packet_id_type pid; struct session_id session_id_remote; + if (!reliable_ack_parse(buf, ack, &session_id_remote)) + { + return false; + } + + if (ack->len >= 1 && (!session_id_defined(&session_id_remote) + || !session_id_equal(&session_id_remote, sid))) + { + struct gc_arena gc = gc_new(); + dmsg(D_REL_LOW, + "ACK read BAD SESSION-ID FROM REMOTE, local=%s, remote=%s", + session_id_print(sid, &gc), session_id_print(&session_id_remote, &gc)); + gc_free(&gc); + return false; + } + return true; +} + +bool +reliable_ack_parse(struct buffer *buf, struct reliable_ack *ack, + struct session_id *session_id_remote) +{ + uint8_t count; + ack->len = 0; + if (!buf_read(buf, &count, sizeof(count))) { - goto error; + return false; } - for (i = 0; i < count; ++i) + for (int i = 0; i < count; ++i) { + packet_id_type net_pid; if (!buf_read(buf, &net_pid, sizeof(net_pid))) { - goto error; + return false; } if (ack->len >= RELIABLE_ACK_SIZE) { - goto error; + return false; } - pid = ntohpid(net_pid); + packet_id_type pid = ntohpid(net_pid); ack->packet_id[ack->len++] = pid; } if (count) { - if (!session_id_read(&session_id_remote, buf)) - { - goto error; - } - if (!session_id_defined(&session_id_remote) - || !session_id_equal(&session_id_remote, sid)) + if (!session_id_read(session_id_remote, buf)) { - dmsg(D_REL_LOW, - "ACK read BAD SESSION-ID FROM REMOTE, local=%s, remote=%s", - session_id_print(sid, &gc), session_id_print(&session_id_remote, &gc)); - goto error; + return false; } } - gc_free(&gc); return true; - -error: - gc_free(&gc); - return false; } /* write a packet ID acknowledgement record to buf, */ diff --git a/src/openvpn/reliable.h b/src/openvpn/reliable.h index cd80bbfb2..05426fd8c 100644 --- a/src/openvpn/reliable.h +++ b/src/openvpn/reliable.h @@ -126,6 +126,28 @@ struct reliable bool reliable_ack_read(struct reliable_ack *ack, struct buffer *buf, const struct session_id *sid); + +/** + * Parse an acknowledgment record from a received packet. + * + * This function parses the packet ID acknowledgment record from the packet + * contained in \a buf. If the record contains acknowledgments, these are + * stored in \a ack. This function also compares extracts packet's session ID + * and returns it in \a session_id_remote + * + * @param ack The acknowledgment structure in which received + * acknowledgments are to be stored. + * @param buf The buffer containing the packet. + * @param session_id_remote The parsed remote session id. This field is + * is only filled if ack->len >= 1 + * @return + * @li True, if processing was successful. + * @li False, if an error occurs during processing. + */ +bool +reliable_ack_parse(struct buffer *buf, struct reliable_ack *ack, + struct session_id *session_id_remote); + /** * Remove acknowledged packets from a reliable structure. * diff --git a/src/openvpn/ssl.c b/src/openvpn/ssl.c index 91f0e214d..cdf3e31da 100644 --- a/src/openvpn/ssl.c +++ b/src/openvpn/ssl.c @@ -3435,7 +3435,6 @@ tls_pre_decrypt(struct tls_multi *multi, /* buffers all packet IDs to delete from send_reliable */ struct reliable_ack send_ack; - send_ack.len = 0; if (!reliable_ack_read(&send_ack, buf, &session->session_id)) { msg(D_TLS_ERRORS,