diff --git a/Makefile b/Makefile index 3bc6599..8e24093 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,7 @@ CXX=g++ -std=c++11 CAPNP_SOURCES=\ src/capnp/AnyPointer.java\ + src/capnp/DecodeException.java\ src/capnp/FieldSize.java\ src/capnp/FromStructBuilder.java\ src/capnp/FromStructReader.java\ diff --git a/examples/AddressbookMain.java b/examples/AddressbookMain.java index 9d4ecb7..542cbd9 100644 --- a/examples/AddressbookMain.java +++ b/examples/AddressbookMain.java @@ -15,7 +15,7 @@ public class AddressbookMain { int size = people.size(); for(int ii = 0; ii < size; ++ii) { Addressbook.Person.Reader person = people.get(ii); - System.out.println(person.getName().toString() + ": " + person.getEmail().toString()); + System.out.println(person.getName() + ": " + person.getEmail()); StructList.Reader phones = person.getPhones(); for (int jj = 0; jj < phones.size(); ++jj) { @@ -32,7 +32,7 @@ public class AddressbookMain { typeName = "work"; break; } - System.out.println(" " + typeName + " phone: " + phone.getNumber().toString()); + System.out.println(" " + typeName + " phone: " + phone.getNumber()); } Addressbook.Person.Employment.Reader employment = person.getEmployment(); @@ -41,10 +41,10 @@ public class AddressbookMain { System.out.println(" unemployed"); break; case EMPLOYER : - System.out.println(" employer: " + employment.getEmployer().toString()); + System.out.println(" employer: " + employment.getEmployer()); break; case SCHOOL : - System.out.println(" student at: " + employment.getSchool().toString()); + System.out.println(" student at: " + employment.getSchool()); break; case SELF_EMPLOYED: System.out.println(" self-employed"); diff --git a/src/capnp/DecodeException.java b/src/capnp/DecodeException.java new file mode 100644 index 0000000..4aad297 --- /dev/null +++ b/src/capnp/DecodeException.java @@ -0,0 +1,7 @@ +package org.capnproto; + +public class DecodeException extends RuntimeException { + public DecodeException(String message) { + super(message); + } +} diff --git a/src/capnp/WireHelpers.java b/src/capnp/WireHelpers.java index fe5f1aa..76cf8cd 100644 --- a/src/capnp/WireHelpers.java +++ b/src/capnp/WireHelpers.java @@ -81,6 +81,21 @@ final class WireHelpers { int ptrOffset = WirePointer.target(refOffset, ref); int listPtr = WirePointer.listPointer(ref); int size = ListPointer.elementCount(listPtr); - return new Text.Reader(segment.buffer, ptrOffset, size); + + if (WirePointer.kind(ref) != WirePointer.LIST) { + throw new DecodeException("Message contains non-list pointer where text was expected."); + } + + if (ListPointer.elementSize(listPtr) != FieldSize.BYTE) { + throw new DecodeException("Message contains list pointer of non-bytes where text was expected."); + } + + // TODO bounds check? + + if (size == 0 || segment.buffer.get(8 * ptrOffset + size - 1) != 0) { + throw new DecodeException("Message containts text that is not NUL-terminated."); + } + + return new Text.Reader(segment.buffer, ptrOffset, size - 1); } }