From 57dec34d2cc734e4a21231ab22063d5ca961ae23 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Tue, 5 Oct 2021 17:03:57 -0400 Subject: [PATCH] fix bug in short to int conversion in StructPointer --- .../java/org/capnproto/StructPointer.java | 2 +- .../java/org/capnproto/StructPointerTest.java | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 runtime/src/test/java/org/capnproto/StructPointerTest.java diff --git a/runtime/src/main/java/org/capnproto/StructPointer.java b/runtime/src/main/java/org/capnproto/StructPointer.java index 582e6eb..75d9930 100644 --- a/runtime/src/main/java/org/capnproto/StructPointer.java +++ b/runtime/src/main/java/org/capnproto/StructPointer.java @@ -34,7 +34,7 @@ final class StructPointer{ } public static int wordSize(long ref) { - return (int)dataSize(ref) + (int)ptrCount(ref); + return Short.toUnsignedInt(dataSize(ref)) + Short.toUnsignedInt(ptrCount(ref)); } public static void setFromStructSize(ByteBuffer buffer, int offset, StructSize size) { diff --git a/runtime/src/test/java/org/capnproto/StructPointerTest.java b/runtime/src/test/java/org/capnproto/StructPointerTest.java new file mode 100644 index 0000000..d1a3af3 --- /dev/null +++ b/runtime/src/test/java/org/capnproto/StructPointerTest.java @@ -0,0 +1,21 @@ +package org.capnproto; + +import org.junit.Assert; +import org.junit.Test; + +public class StructPointerTest { + + @Test + public void testWordSize() { + Assert.assertEquals( + 3, + StructPointer.wordSize(0x0001000200000000L)); + } + + @Test + public void testWordSizeUnderflow() { + Assert.assertEquals( + 0x1fffe, + StructPointer.wordSize(0xffffffff00000000L)); + } +}