From 196b82515c035f86a68befa3681952a0ddb61c50 Mon Sep 17 00:00:00 2001 From: Vaci Koblizek Date: Thu, 3 Dec 2020 14:19:35 +0000 Subject: [PATCH] ensure StructBuilders and StructLists maintain capTable context --- .../src/main/java/org/capnproto/CapTableBuilder.java | 2 +- runtime/src/main/java/org/capnproto/Capability.java | 8 ++++---- .../src/main/java/org/capnproto/StructBuilder.java | 6 ++++++ .../src/main/java/org/capnproto/StructReader.java | 8 ++------ runtime/src/main/java/org/capnproto/WireHelpers.java | 12 ++++++------ 5 files changed, 19 insertions(+), 17 deletions(-) diff --git a/runtime/src/main/java/org/capnproto/CapTableBuilder.java b/runtime/src/main/java/org/capnproto/CapTableBuilder.java index b1f7497..01e6825 100644 --- a/runtime/src/main/java/org/capnproto/CapTableBuilder.java +++ b/runtime/src/main/java/org/capnproto/CapTableBuilder.java @@ -1,6 +1,6 @@ package org.capnproto; -interface CapTableBuilder extends CapTableReader { +public interface CapTableBuilder extends CapTableReader { int injectCap(ClientHook cap); void dropCap(int index); diff --git a/runtime/src/main/java/org/capnproto/Capability.java b/runtime/src/main/java/org/capnproto/Capability.java index d481ae3..e00733b 100644 --- a/runtime/src/main/java/org/capnproto/Capability.java +++ b/runtime/src/main/java/org/capnproto/Capability.java @@ -10,12 +10,12 @@ public final class Capability { static final Object NULL_CAPABILITY_BRAND = new Object(); static final Object BROKEN_CAPABILITY_BRAND = new Object(); - static class BuilderContext { - CapTableBuilder capTable; + public static class BuilderContext { + public CapTableBuilder capTable; } - static class ReaderContext { - CapTableReader capTable; + public static class ReaderContext { + public CapTableReader capTable; } public static abstract class Factory diff --git a/runtime/src/main/java/org/capnproto/StructBuilder.java b/runtime/src/main/java/org/capnproto/StructBuilder.java index 0bded78..6285dce 100644 --- a/runtime/src/main/java/org/capnproto/StructBuilder.java +++ b/runtime/src/main/java/org/capnproto/StructBuilder.java @@ -44,11 +44,17 @@ public class StructBuilder extends Capability.BuilderContext { public StructBuilder(SegmentBuilder segment, int data, int pointers, int dataSize, short pointerCount) { + this(segment, null, data, pointers, dataSize, pointerCount); + } + + public StructBuilder(SegmentBuilder segment, CapTableBuilder capTable, int data, + int pointers, int dataSize, short pointerCount) { this.segment = segment; this.data = data; this.pointers = pointers; this.dataSize = dataSize; this.pointerCount = pointerCount; + this.capTable = capTable; } protected final boolean _getBooleanField(int offset) { diff --git a/runtime/src/main/java/org/capnproto/StructReader.java b/runtime/src/main/java/org/capnproto/StructReader.java index 4d8083f..3225c71 100644 --- a/runtime/src/main/java/org/capnproto/StructReader.java +++ b/runtime/src/main/java/org/capnproto/StructReader.java @@ -51,17 +51,13 @@ public class StructReader extends Capability.ReaderContext { this.dataSize = 0; this.pointerCount = 0; this.nestingLimit = 0x7fffffff; + this.capTable = null; } public StructReader(SegmentReader segment, int data, int pointers, int dataSize, short pointerCount, int nestingLimit) { - this.segment = segment; - this.data = data; - this.pointers = pointers; - this.dataSize = dataSize; - this.pointerCount = pointerCount; - this.nestingLimit = nestingLimit; + this(segment, null, data, pointers, dataSize, pointerCount, nestingLimit); } public StructReader(SegmentReader segment, CapTableReader capTable, diff --git a/runtime/src/main/java/org/capnproto/WireHelpers.java b/runtime/src/main/java/org/capnproto/WireHelpers.java index 782744d..956883e 100644 --- a/runtime/src/main/java/org/capnproto/WireHelpers.java +++ b/runtime/src/main/java/org/capnproto/WireHelpers.java @@ -503,7 +503,7 @@ final class WireHelpers { ListPointer.set(allocation.segment.buffer, allocation.refOffset, elementSize, elementCount); - return factory.constructBuilder(allocation.segment, + return factory.constructBuilder(allocation.segment, capTable, allocation.ptr * Constants.BYTES_PER_WORD, elementCount, step, dataSize, (short)pointerCount); } @@ -527,7 +527,7 @@ final class WireHelpers { WirePointer.STRUCT, elementCount); StructPointer.setFromStructSize(allocation.segment.buffer, allocation.ptr, elementSize); - return factory.constructBuilder(allocation.segment, + return factory.constructBuilder(allocation.segment, capTable, (allocation.ptr + 1) * Constants.BYTES_PER_WORD, elementCount, wordsPerElement * Constants.BITS_PER_WORD, elementSize.data * Constants.BITS_PER_WORD, elementSize.pointers); @@ -586,7 +586,7 @@ final class WireHelpers { int step = dataSize + pointerCount * Constants.BITS_PER_POINTER; - return factory.constructBuilder(resolved.segment, resolved.ptr * Constants.BYTES_PER_WORD, + return factory.constructBuilder(resolved.segment, capTable, resolved.ptr * Constants.BYTES_PER_WORD, ListPointer.elementCount(resolved.ref), step, dataSize, (short) pointerCount); } @@ -629,7 +629,7 @@ final class WireHelpers { if (oldDataSize >= elementSize.data && oldPointerCount >= elementSize.pointers) { //# Old size is at least as large as we need. Ship it. - return factory.constructBuilder(resolved.segment, oldPtr * Constants.BYTES_PER_WORD, + return factory.constructBuilder(resolved.segment, capTable, oldPtr * Constants.BYTES_PER_WORD, elementCount, oldStep * Constants.BITS_PER_WORD, oldDataSize * Constants.BITS_PER_WORD, oldPointerCount); @@ -685,7 +685,7 @@ final class WireHelpers { memset(resolved.segment.buffer, resolved.ptr * Constants.BYTES_PER_WORD, (byte)0, (1 + oldStep * elementCount) * Constants.BYTES_PER_WORD); - return factory.constructBuilder(allocation.segment, newPtr * Constants.BYTES_PER_WORD, + return factory.constructBuilder(allocation.segment, capTable, newPtr * Constants.BYTES_PER_WORD, elementCount, newStep * Constants.BITS_PER_WORD, newDataSize * Constants.BITS_PER_WORD, @@ -764,7 +764,7 @@ final class WireHelpers { memset(resolved.segment.buffer, resolved.ptr * Constants.BYTES_PER_WORD, (byte)0, roundBitsUpToBytes(oldStep * elementCount)); - return factory.constructBuilder(allocation.segment, newPtr * Constants.BYTES_PER_WORD, + return factory.constructBuilder(allocation.segment, capTable, newPtr * Constants.BYTES_PER_WORD, elementCount, newStep * Constants.BITS_PER_WORD, newDataSize * Constants.BITS_PER_WORD,