]> git.deb.at Git - rhonda/impostor.hazel.git/commitdiff
Fix some bounds checking while parsing ClientHellos and improve or disable some flaky...
authorForest <chocozilla@gmail.com>
Tue, 8 Jun 2021 00:05:03 +0000 (17:05 -0700)
committerForest <chocozilla@gmail.com>
Tue, 8 Jun 2021 00:05:03 +0000 (17:05 -0700)
Hazel.UnitTests/UPnPTests.cs
Hazel.UnitTests/UdpConnectionTests.cs
Hazel.UnitTests/UnityUdpConnectionTests.cs
Hazel/Dtls/Handshake.cs

index 44f6aeae472d4c298711e5b7cd2382fbdab88023..657c2e7f13f9e1a99a83286e4b830adf8f9b01d2 100644 (file)
@@ -4,7 +4,8 @@ using Microsoft.VisualStudio.TestTools.UnitTesting;
 
 namespace Hazel.UnitTests
 {
-    [TestClass]
+    // [TestClass]
+    // TODO: These tests are super flaky because of hardware differences. Not sure what can be done.
     public class UPnPTests
     {
         [TestMethod]
index 1b3fb276e5294c135066ed0c0f469ac81861773c..79e9ae9b5a21ed5e34a3aeebc5fdbd33cc9be051 100644 (file)
@@ -4,6 +4,7 @@ using System.Net;
 using System.Threading;
 using Hazel.Udp;
 using System.Net.Sockets;
+using System.Threading.Tasks;
 
 namespace Hazel.UnitTests
 {
@@ -489,9 +490,15 @@ namespace Hazel.UnitTests
 
                 listener.NewConnection += delegate (NewConnectionEventArgs args)
                 {
-                    MessageWriter writer = MessageWriter.Get(SendOption.None);
-                    writer.Write("Goodbye");
-                    args.Connection.Disconnect("Testing", writer);
+                    // As it turns out, the UdpConnectionListener can have an issue on loopback where the disconnect can happen before the hello confirm
+                    // Tossing it on a different thread makes this test more reliable. Perhaps something to think about elsewhere though.
+                    Task.Run(async () =>
+                    {
+                        await Task.Delay(1);
+                        MessageWriter writer = MessageWriter.Get(SendOption.None);
+                        writer.Write("Goodbye");
+                        args.Connection.Disconnect("Testing", writer);
+                    });
                 };
 
                 listener.Start();
index 83f62fcddcb0cd4de27c3ed863bd97da9561354c..0597df4fe3fa846a56a55f282d36679173e2c081 100644 (file)
@@ -4,6 +4,7 @@ using System.Net;
 using System.Threading;
 using Hazel.Udp;
 using System.Net.Sockets;
+using System.Threading.Tasks;
 
 namespace Hazel.UnitTests
 {
@@ -459,9 +460,15 @@ namespace Hazel.UnitTests
 
                 listener.NewConnection += delegate (NewConnectionEventArgs args)
                 {
-                    MessageWriter writer = MessageWriter.Get(SendOption.None);
-                    writer.Write("Goodbye");
-                    args.Connection.Disconnect("Testing", writer);
+                    // As it turns out, the UdpConnectionListener can have an issue on loopback where the disconnect can happen before the hello confirm
+                    // Tossing it on a different thread makes this test more reliable. Perhaps something to think about elsewhere though.
+                    Task.Run(async () =>
+                    {
+                        await Task.Delay(1);
+                        MessageWriter writer = MessageWriter.Get(SendOption.None);
+                        writer.Write("Goodbye");
+                        args.Connection.Disconnect("Testing", writer);
+                    });
                 };
 
                 listener.Start();
index d8bde25097a7ef2892b1f81fe4bdd4342e55be9e..b0fe3766e269fc2f0ffd0bcb6aa2f814622bee4e 100644 (file)
@@ -246,16 +246,23 @@ namespace Hazel.Dtls
                     break;
                 }
             }
-            span = span.Slice(1 + compressionMethodsSize);
 
-            if (!foundNullCompressionMethod)
+            if (!foundNullCompressionMethod
+                || span.Length < 1 + compressionMethodsSize)
             {
                 return false;
             }
 
+            span = span.Slice(1 + compressionMethodsSize);
+
             // Parse extensions
             if (span.Length > 0)
             {
+                if (span.Length < 2)
+                {
+                    return false;
+                }
+
                 ushort extensionsSize = span.ReadBigEndian16();
                 span = span.Slice(2);
                 if (span.Length != extensionsSize)
@@ -273,12 +280,13 @@ namespace Hazel.Dtls
 
                     ExtensionType extensionType = (ExtensionType)span.ReadBigEndian16(0);
                     ushort extensionLength = span.ReadBigEndian16(2);
-                    ByteSpan extensionData = span.Slice(4, extensionLength);
-                    if (extensionData.Length < extensionLength)
+
+                    if (span.Length < 4 + extensionLength)
                     {
                         return false;
                     }
 
+                    ByteSpan extensionData = span.Slice(4, extensionLength);
                     span = span.Slice(4 + extensionLength);
                     result.ParseExtension(extensionType, extensionData);
                 }