aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build
diff options
context:
space:
mode:
authorGravatar janakr <janakr@google.com>2018-04-05 13:38:15 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-04-05 13:40:02 -0700
commit58fe737d06b63c44d0a1991ada772e78de9e0056 (patch)
tree5321a17c5e5a0e4e00f18f870de8d77b67858b62 /src/main/java/com/google/devtools/build
parentbd64f605435ed71a685ef2b2685425ff3e1cb8e4 (diff)
Transform StackOverflowError thrown in ArrayCodec into SerializationException. This can happen with deep nested sets.
PiperOrigin-RevId: 191790431
Diffstat (limited to 'src/main/java/com/google/devtools/build')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/ArrayCodec.java18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/ArrayCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/ArrayCodec.java
index a9988fb362..366843587e 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/ArrayCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/ArrayCodec.java
@@ -29,8 +29,13 @@ class ArrayCodec implements ObjectCodec<Object[]> {
public void serialize(SerializationContext context, Object[] obj, CodedOutputStream codedOut)
throws SerializationException, IOException {
codedOut.writeInt32NoTag(obj.length);
- for (Object item : obj) {
- context.serialize(item, codedOut);
+ try {
+ for (Object item : obj) {
+ context.serialize(item, codedOut);
+ }
+ } catch (StackOverflowError e) {
+ // TODO(janakr): figure out if we need to handle this better and handle it better if so.
+ throw new SerializationException("StackOverflow serializing array", e);
}
}
@@ -38,8 +43,13 @@ class ArrayCodec implements ObjectCodec<Object[]> {
public Object[] deserialize(DeserializationContext context, CodedInputStream codedIn)
throws SerializationException, IOException {
Object[] result = new Object[codedIn.readInt32()];
- for (int i = 0; i < result.length; i++) {
- result[i] = context.deserialize(codedIn);
+ try {
+ for (int i = 0; i < result.length; i++) {
+ result[i] = context.deserialize(codedIn);
+ }
+ } catch (StackOverflowError e) {
+ // TODO(janakr): figure out if we need to handle this better and handle it better if so.
+ throw new SerializationException("StackOverflow deserializing array", e);
}
return result;
}