7038843: IIOP serialization fails with NullPointerException when serializing Throwable
Reviewed-by: dholmes, mchung
--- a/jdk/src/share/classes/java/lang/Throwable.java Fri Apr 29 00:21:54 2011 +0100
+++ b/jdk/src/share/classes/java/lang/Throwable.java Thu Apr 28 17:51:25 2011 -0700
@@ -848,10 +848,9 @@
throw new NullPointerException("stackTrace[" + i + "]");
}
- if (this.stackTrace == null) // Immutable stack
- return;
-
synchronized (this) {
+ if (this.stackTrace == null) // Immutable stack
+ return;
this.stackTrace = defensiveCopy;
}
}
@@ -958,18 +957,15 @@
// trace field is a valid value indicating the stack trace
// should not be set.
getOurStackTrace();
- ObjectOutputStream.PutField fields = s.putFields();
- fields.put("detailMessage", detailMessage);
- fields.put("cause", cause);
- // Serialize a null stacktrace using the stack trace sentinel.
- if (stackTrace == null)
- fields.put("stackTrace", SentinelHolder.STACK_TRACE_SENTINEL);
- else
- fields.put("stackTrace", stackTrace);
- fields.put("suppressedExceptions", suppressedExceptions);
-
- s.writeFields();
+ StackTraceElement[] oldStackTrace = stackTrace;
+ try {
+ if (stackTrace == null)
+ stackTrace = SentinelHolder.STACK_TRACE_SENTINEL;
+ s.defaultWriteObject();
+ } finally {
+ stackTrace = oldStackTrace;
+ }
}
/**