From 68996fc874300337ec7349f50d0b1cbb3a6f1bec Mon Sep 17 00:00:00 2001 From: "kenton@google.com" Date: Fri, 7 Aug 2009 21:02:02 +0000 Subject: Gigantic descriptors shouldn't overflow the Java string literal size limit. --- java/src/main/java/com/google/protobuf/Descriptors.java | 12 ++++++++++-- java/src/test/java/com/google/protobuf/DescriptorsTest.java | 8 ++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) (limited to 'java/src') diff --git a/java/src/main/java/com/google/protobuf/Descriptors.java b/java/src/main/java/com/google/protobuf/Descriptors.java index df934bb4..0c162d5d 100644 --- a/java/src/main/java/com/google/protobuf/Descriptors.java +++ b/java/src/main/java/com/google/protobuf/Descriptors.java @@ -244,7 +244,8 @@ public final class Descriptors { * encoded in protocol buffer wire format. */ public static void internalBuildGeneratedFileFrom( - final String descriptorData, final FileDescriptor[] dependencies, + final String[] descriptorDataParts, + final FileDescriptor[] dependencies, final InternalDescriptorAssigner descriptorAssigner) { // Hack: We can't embed a raw byte array inside generated Java code // (at least, not efficiently), but we can embed Strings. So, the @@ -255,9 +256,16 @@ public final class Descriptors { // serialized form. So, if we convert it to bytes in ISO-8859-1, we // should get the original bytes that we want. + // descriptorData may contain multiple strings in order to get around the + // Java 64k string literal limit. + StringBuilder descriptorData = new StringBuilder(); + for (String part : descriptorDataParts) { + descriptorData.append(part); + } + final byte[] descriptorBytes; try { - descriptorBytes = descriptorData.getBytes("ISO-8859-1"); + descriptorBytes = descriptorData.toString().getBytes("ISO-8859-1"); } catch (UnsupportedEncodingException e) { throw new RuntimeException( "Standard encoding ISO-8859-1 not supported by JVM.", e); diff --git a/java/src/test/java/com/google/protobuf/DescriptorsTest.java b/java/src/test/java/com/google/protobuf/DescriptorsTest.java index 6fa56267..c5c38b27 100644 --- a/java/src/test/java/com/google/protobuf/DescriptorsTest.java +++ b/java/src/test/java/com/google/protobuf/DescriptorsTest.java @@ -397,4 +397,12 @@ public class DescriptorsTest extends TestCase { assertEquals(values1[i].toString(), values2[i].toString()); } } + + public void testEnormousDescriptor() throws Exception { + // The descriptor for this file is larger than 64k, yet it did not cause + // a compiler error due to an over-long string literal. + assertTrue( + UnittestEnormousDescriptor.getDescriptor() + .toProto().getSerializedSize() > 65536); + } } -- cgit v1.2.3