]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
QUIC QTEST_FAULT: Allow deleted TLS extension to be output
authorHugo Landau <hlandau@openssl.org>
Thu, 26 Oct 2023 10:37:21 +0000 (11:37 +0100)
committerTomas Mraz <tomas@openssl.org>
Thu, 2 Nov 2023 13:22:04 +0000 (14:22 +0100)
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/22523)

test/helpers/quictestlib.c
test/helpers/quictestlib.h
test/quicfaultstest.c

index 26cd67e23630ab73f20186cc88ab1ae0a028ec52..2c74b26252b4f5e1a11d3bef8408d01af1fc290e 100644 (file)
@@ -929,12 +929,14 @@ int qtest_fault_resize_message(QTEST_FAULT *fault, size_t newlen)
 
 int qtest_fault_delete_extension(QTEST_FAULT *fault,
                                  unsigned int exttype, unsigned char *ext,
-                                 size_t *extlen)
+                                 size_t *extlen,
+                                 BUF_MEM *old_ext)
 {
     PACKET pkt, sub, subext;
+    WPACKET old_ext_wpkt;
     unsigned int type;
     const unsigned char *start, *end;
-    size_t newlen;
+    size_t newlen, w;
     size_t msglen = fault->handbuflen;
 
     if (!PACKET_buf_init(&pkt, ext, *extlen))
@@ -954,6 +956,21 @@ int qtest_fault_delete_extension(QTEST_FAULT *fault,
     /* Found it */
     end = PACKET_data(&sub);
 
+    if (old_ext != NULL) {
+        if (!WPACKET_init(&old_ext_wpkt, old_ext))
+            return 0;
+
+        if (!WPACKET_memcpy(&old_ext_wpkt, PACKET_data(&subext),
+                            PACKET_remaining(&subext))
+            || !WPACKET_get_total_written(&old_ext_wpkt, &w)) {
+            WPACKET_cleanup(&old_ext_wpkt);
+            return 0;
+        }
+
+        WPACKET_finish(&old_ext_wpkt);
+        old_ext->length = w;
+    }
+
     /*
      * If we're not the last extension we need to move the rest earlier. The
      * cast below is safe because we own the underlying buffer and we're no
index d1ac350c244610c3c2ae5bc50fcb0f6cc5b7b68d..79de17d153255d76a3102facf59cae873a245822 100644 (file)
@@ -194,11 +194,13 @@ int qtest_fault_resize_message(QTEST_FAULT *fault, size_t newlen);
  * Helper function to delete an extension from an extension block. |exttype| is
  * the type of the extension to be deleted. |ext| points to the extension block.
  * On entry |*extlen| contains the length of the extension block. It is updated
- * with the new length on exit.
+ * with the new length on exit. If old_ext is non-NULL, the deleted extension
+ * is appended to the given BUF_MEM.
  */
 int qtest_fault_delete_extension(QTEST_FAULT *fault,
                                  unsigned int exttype, unsigned char *ext,
-                                 size_t *extlen);
+                                 size_t *extlen,
+                                 BUF_MEM *old_ext);
 
 /*
  * Add additional helper functions for querying extensions here (e.g.
index 28f52cd6f22a26c923c0363dd1d56cfe4cfbf27c..ad200f7acedc0f5c8aa8de36fbb596c515ec2f0f 100644 (file)
@@ -168,7 +168,7 @@ static int drop_extensions_cb(QTEST_FAULT *fault,
     int *ext = (int *)encextcbarg;
 
     if (!qtest_fault_delete_extension(fault, *ext, ee->extensions,
-                                      &ee->extensionslen))
+                                      &ee->extensionslen, NULL))
         return 0;
 
     return 1;