From af6dcec8f79586099f3e9f8f829a370aed1b1777 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20K=C3=B6llner?= Date: Thu, 16 Apr 2020 07:57:26 +0200 Subject: [PATCH] test & fix --- Capnp.Net.Runtime.Tests/DeserializationTests.cs | 4 ++++ Capnp.Net.Runtime.Tests/ImpatientTests.cs | 6 ++++++ Capnp.Net.Runtime.Tests/LocalRpc.cs | 17 +++++++++++++++++ Capnp.Net.Runtime/Capnp.Net.Runtime.csproj | 2 +- Capnp.Net.Runtime/DeserializerState.cs | 14 ++++++++++---- 5 files changed, 38 insertions(+), 5 deletions(-) diff --git a/Capnp.Net.Runtime.Tests/DeserializationTests.cs b/Capnp.Net.Runtime.Tests/DeserializationTests.cs index e90269d..e42637d 100644 --- a/Capnp.Net.Runtime.Tests/DeserializationTests.cs +++ b/Capnp.Net.Runtime.Tests/DeserializationTests.cs @@ -842,12 +842,16 @@ namespace Capnp.Net.Runtime.Tests data[0] = p; Assert.ThrowsException(() => DeserializerState.CreateRoot(wf)); p.SetFarPointer(0, 0, false); + data[0] = p; Assert.ThrowsException(() => DeserializerState.CreateRoot(wf)); p.SetFarPointer(1, 0, false); + data[0] = p; Assert.ThrowsException(() => DeserializerState.CreateRoot(wf)); p.SetFarPointer(0, 1, false); + data[0] = p; Assert.ThrowsException(() => DeserializerState.CreateRoot(wf)); p.SetFarPointer(0, 0, true); + data[0] = p; Assert.ThrowsException(() => DeserializerState.CreateRoot(wf)); var data2 = new ulong[3]; diff --git a/Capnp.Net.Runtime.Tests/ImpatientTests.cs b/Capnp.Net.Runtime.Tests/ImpatientTests.cs index e32c89f..551c242 100644 --- a/Capnp.Net.Runtime.Tests/ImpatientTests.cs +++ b/Capnp.Net.Runtime.Tests/ImpatientTests.cs @@ -18,6 +18,12 @@ namespace Capnp.Net.Runtime.Tests { var impl = new TestInterfaceImpl2(); Assert.AreEqual(impl, await impl.Unwrap()); + using (var proxy = Proxy.Share(impl)) + using (var reso = ((Proxy)proxy).GetResolvedCapability()) + { + + Assert.AreEqual(((Proxy)proxy).ConsumedCap, ((Proxy)reso).ConsumedCap); + } Assert.IsNull(await default(ITestInterface).Unwrap()); var tcs = new TaskCompletionSource(); tcs.SetResult(null); diff --git a/Capnp.Net.Runtime.Tests/LocalRpc.cs b/Capnp.Net.Runtime.Tests/LocalRpc.cs index f77746a..a618b84 100644 --- a/Capnp.Net.Runtime.Tests/LocalRpc.cs +++ b/Capnp.Net.Runtime.Tests/LocalRpc.cs @@ -226,5 +226,22 @@ namespace Capnp.Net.Runtime.Tests Assert.IsTrue(Task.WaitAll(new Task[] { w1, w2 }, MediumNonDbgTimeout)); } } + + [TestMethod] + public void DisposedProxy() + { + var b = new BareProxy(); + Assert.ThrowsException(() => b.Bind(null)); + var impl = new TestInterfaceImpl2(); + var proxy = Proxy.Share(impl); + var p = (Proxy)proxy; + Assert.ThrowsException(() => p.Bind(p.ConsumedCap)); + Assert.IsFalse(p.IsDisposed); + proxy.Dispose(); + Assert.IsTrue(p.IsDisposed); + Assert.ThrowsException(() => p.ConsumedCap); + var t = proxy.Foo(123, true); + Assert.IsTrue(Assert.ThrowsExceptionAsync(() => t).Wait(MediumNonDbgTimeout)); + } } } diff --git a/Capnp.Net.Runtime/Capnp.Net.Runtime.csproj b/Capnp.Net.Runtime/Capnp.Net.Runtime.csproj index 6f81750..b7675b9 100644 --- a/Capnp.Net.Runtime/Capnp.Net.Runtime.csproj +++ b/Capnp.Net.Runtime/Capnp.Net.Runtime.csproj @@ -29,7 +29,7 @@ - DebugFinalizers + diff --git a/Capnp.Net.Runtime/DeserializerState.cs b/Capnp.Net.Runtime/DeserializerState.cs index c5e7b71..1aee28e 100644 --- a/Capnp.Net.Runtime/DeserializerState.cs +++ b/Capnp.Net.Runtime/DeserializerState.cs @@ -329,10 +329,13 @@ namespace Capnp case PointerKind.Far: + if (pointer.TargetSegmentIndex >= Segments.Count) + throw new DeserializationException("Error decoding pointer: Invalid target segment index"); + + CurrentSegmentIndex = pointer.TargetSegmentIndex; + if (pointer.IsDoubleFar) { - CurrentSegmentIndex = pointer.TargetSegmentIndex; - if (pointer.LandingPadOffset >= CurrentSegment.Length - 1) throw new DeserializationException("Error decoding double-far pointer: exceeds segment bounds"); @@ -353,9 +356,12 @@ namespace Capnp } else { - CurrentSegmentIndex = pointer.TargetSegmentIndex; Offset = 0; offset = pointer.LandingPadOffset; + + if (pointer.LandingPadOffset >= CurrentSegment.Length) + throw new DeserializationException("Error decoding pointer: exceeds segment bounds"); + pointer = CurrentSegment[pointer.LandingPadOffset]; } continue; @@ -701,7 +707,7 @@ namespace Capnp { foreach (var cap in Caps) { - cap?.Release(); + cap.Release(); } Caps = null;