7038843: IIOP serialization fails with NullPointerException when serializing Throwable
authordarcy
Thu, 28 Apr 2011 17:51:25 -0700
changeset 9534 080badb816ac
parent 9533 13cc5e8eb9f1
child 9535 d930011fd275
7038843: IIOP serialization fails with NullPointerException when serializing Throwable Reviewed-by: dholmes, mchung
jdk/src/share/classes/java/lang/Throwable.java
--- 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;
+        }
     }
 
     /**