From bfde078b732672f8668793722b6ba1209f78c6b3 Mon Sep 17 00:00:00 2001
From: Todd Short <tshort@akamai.com>
Date: Mon, 26 Aug 2019 13:29:17 -0400
Subject: [PATCH 07/43] QUIC: Fix quic_transport constructors/parsers

---
 ssl/statem/extensions_clnt.c | 16 +++-------------
 ssl/statem/extensions_srvr.c | 16 +++-------------
 2 files changed, 6 insertions(+), 26 deletions(-)

--- a/ssl/statem/extensions_clnt.c
+++ b/ssl/statem/extensions_clnt.c
@@ -1208,10 +1208,8 @@ EXT_RETURN tls_construct_ctos_quic_trans
     }
 
     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_quic_transport_parameters)
-            || !WPACKET_start_sub_packet_u16(pkt)
-            || !WPACKET_sub_memcpy_u16(pkt, s->ext.quic_transport_params,
-                                       s->ext.quic_transport_params_len)
-            || !WPACKET_close(pkt)) {
+        || !WPACKET_sub_memcpy_u16(pkt, s->ext.quic_transport_params,
+                                   s->ext.quic_transport_params_len)) {
         SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
         return EXT_RETURN_FAIL;
     }
@@ -2033,19 +2031,11 @@ int tls_parse_stoc_psk(SSL *s, PACKET *p
 int tls_parse_stoc_quic_transport_params(SSL *s, PACKET *pkt, unsigned int context,
                                          X509 *x, size_t chainidx)
 {
-    PACKET trans_param;
-
-    if (!PACKET_as_length_prefixed_2(pkt, &trans_param)
-            || PACKET_remaining(&trans_param) == 0) {
-        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
-        return 0;
-    }
-
     OPENSSL_free(s->ext.peer_quic_transport_params);
     s->ext.peer_quic_transport_params = NULL;
     s->ext.peer_quic_transport_params_len = 0;
 
-    if (!PACKET_memdup(&trans_param,
+    if (!PACKET_memdup(pkt,
                        &s->ext.peer_quic_transport_params,
                        &s->ext.peer_quic_transport_params_len)) {
         SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
--- a/ssl/statem/extensions_srvr.c
+++ b/ssl/statem/extensions_srvr.c
@@ -1254,19 +1254,11 @@ int tls_parse_ctos_post_handshake_auth(S
 int tls_parse_ctos_quic_transport_params(SSL *s, PACKET *pkt, unsigned int context,
                                          X509 *x, size_t chainidx)
 {
-    PACKET trans_param;
-
-    if (!PACKET_as_length_prefixed_2(pkt, &trans_param)
-            || PACKET_remaining(&trans_param) == 0) {
-        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
-        return 0;
-    }
-
     OPENSSL_free(s->ext.peer_quic_transport_params);
     s->ext.peer_quic_transport_params = NULL;
     s->ext.peer_quic_transport_params_len = 0;
 
-    if (!PACKET_memdup(&trans_param,
+    if (!PACKET_memdup(pkt,
                        &s->ext.peer_quic_transport_params,
                        &s->ext.peer_quic_transport_params_len)) {
         SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
@@ -1972,10 +1964,8 @@ EXT_RETURN tls_construct_stoc_quic_trans
     }
 
     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_quic_transport_parameters)
-            || !WPACKET_start_sub_packet_u16(pkt)
-            || !WPACKET_sub_memcpy_u16(pkt, s->ext.quic_transport_params,
-                                       s->ext.quic_transport_params_len)
-            || !WPACKET_close(pkt)) {
+        || !WPACKET_sub_memcpy_u16(pkt, s->ext.quic_transport_params,
+                                   s->ext.quic_transport_params_len)) {
         SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
         return EXT_RETURN_FAIL;
     }
