From: Arne Schwabe Date: Fri, 22 Apr 2022 13:40:37 +0000 (+0200) Subject: Split out reliable_ack_parse from reliable_ack_read X-Git-Tag: v2.6_beta1~225 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ac97e16123aba7d4792ca978a4e2e6875973b8ed;p=thirdparty%2Fopenvpn.git Split out reliable_ack_parse from reliable_ack_read This allows only the parsing without verification to be reused in other code parts. Acked-by: Frank Lichtenheld Message-Id: <20220422134038.3801239-9-arne@rfc2549.org> URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg24145.html Signed-off-by: Gert Doering --- diff --git a/src/openvpn/reliable.c b/src/openvpn/reliable.c index f19257888..5c897b225 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 34bcfd009..1f3dc7088 100644 --- a/src/openvpn/reliable.h +++ b/src/openvpn/reliable.h @@ -124,6 +124,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 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 12905a03f..6669c4719 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,