--- old/test/java/io/Serializable/superclassDataLoss/Test.java 2017-05-24 21:59:22.885549328 -0700 +++ new/test/java/io/Serializable/superclassDataLoss/Test.java 2017-05-24 21:59:22.675522635 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,7 +22,12 @@ */ /* + * @test * @bug 4325590 + * @library /lib/testlibrary + * @build JarUtils Driver A B + * @run driver Driver + * @run main Test * @summary Verify that superclass data is not lost when incoming superclass * descriptor is matched with local class that is not a superclass of * the deserialized instance's class. @@ -30,22 +35,35 @@ import java.io.*; import java.net.*; +import java.nio.file.*; class MixedSuperclassStream extends ObjectInputStream { - MixedSuperclassStream(InputStream in) throws IOException { super(in); } + private boolean ldr12A; + + MixedSuperclassStream(InputStream in, boolean ldr1First) throws IOException { + super(in); + this.ldr12A = ldr12A; + } protected Class resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { // resolve A's classdesc to class != B's superclass String name = desc.getName(); - if (name.equals("A")) { - return Class.forName(name, true, Test.ldr1); - } else if (name.equals("B")) { - return Class.forName(name, true, Test.ldr2); + if (ldr12A) { + if (name.equals("A")) { + return Class.forName(name, true, Test.ldr1); + } else if (name.equals("B")) { + return Class.forName(name, true, Test.ldr2); + } } else { - return super.resolveClass(desc); + if (name.equals("B")) { + return Class.forName(name, true, Test.ldr1); + } else if (name.equals("A")) { + return Class.forName(name, true, Test.ldr2); + } } + return super.resolveClass(desc); } } @@ -70,10 +88,18 @@ oout.writeObject(a); oout.close(); + test(bout, true); + test(bout, false); + + ldr1.close(); + ldr2.close(); + } + + private static void test(ByteArrayOutputStream bout, boolean ldr12A) throws Exception { ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); - ObjectInputStream oin = new MixedSuperclassStream(bin); - a = (Runnable) oin.readObject(); + ObjectInputStream oin = new MixedSuperclassStream(bin, ldr12A); + Runnable a = (Runnable) oin.readObject(); a.run(); } }