6799854: CodeSigner.hashCode() does not work with serialization
Reviewed-by: mullan
--- a/jdk/src/share/classes/java/security/CodeSigner.java Mon Dec 06 18:52:23 2010 +0000
+++ b/jdk/src/share/classes/java/security/CodeSigner.java Mon Dec 13 14:58:52 2010 +0000
@@ -25,7 +25,7 @@
package java.security;
-import java.io.Serializable;
+import java.io.*;
import java.security.cert.CRL;
import java.security.cert.CertPath;
import sun.misc.JavaSecurityCodeSignerAccess;
@@ -205,4 +205,10 @@
});
}
+ // Explicitly reset hash code value to -1
+ private void readObject(ObjectInputStream ois)
+ throws IOException, ClassNotFoundException {
+ ois.defaultReadObject();
+ myhash = -1;
+ }
}
--- a/jdk/src/share/classes/java/security/Timestamp.java Mon Dec 06 18:52:23 2010 +0000
+++ b/jdk/src/share/classes/java/security/Timestamp.java Mon Dec 13 14:58:52 2010 +0000
@@ -25,7 +25,7 @@
package java.security;
-import java.io.Serializable;
+import java.io.*;
import java.security.cert.Certificate;
import java.security.cert.CertPath;
import java.security.cert.X509Extension;
@@ -153,4 +153,11 @@
sb.append(")");
return sb.toString();
}
+
+ // Explicitly reset hash code value to -1
+ private void readObject(ObjectInputStream ois)
+ throws IOException, ClassNotFoundException {
+ ois.defaultReadObject();
+ myhash = -1;
+ }
}
--- a/jdk/src/share/native/sun/security/ec/ECC_JNI.cpp Mon Dec 06 18:52:23 2010 +0000
+++ b/jdk/src/share/native/sun/security/ec/ECC_JNI.cpp Mon Dec 13 14:58:52 2010 +0000
@@ -89,7 +89,7 @@
// Fill a new ECParams using the supplied OID
if (EC_DecodeParams(¶ms_item, &ecparams, 0) != SECSuccess) {
/* bad curve OID */
- ThrowException(env, INVALID_ALGORITHM_PARAMETER_EXCEPTION);
+ ThrowException(env, (char *) INVALID_ALGORITHM_PARAMETER_EXCEPTION);
goto cleanup;
}
@@ -101,7 +101,7 @@
// Generate the new keypair (using the supplied seed)
if (EC_NewKey(ecparams, &privKey, (unsigned char *) pSeedBuffer,
jSeedLength, 0) != SECSuccess) {
- ThrowException(env, KEY_EXCEPTION);
+ ThrowException(env, (char *) KEY_EXCEPTION);
goto cleanup;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/security/CodeSigner/Serialize.java Mon Dec 13 14:58:52 2010 +0000
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2010, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 6799854
+ * @summary CodeSigner.hashCode() does not work with serialization
+ */
+
+import java.io.*;
+import java.security.CodeSigner;
+import java.security.Timestamp;
+import java.security.cert.*;
+import java.util.Collections;
+import java.util.Date;
+
+public class Serialize {
+
+ public static void main(String[] args) throws Exception {
+
+ // Create a certpath consisting of one certificate
+ File f = new File(System.getProperty("test.src", "."), "cert_file");
+ FileInputStream fis = new FileInputStream(f);
+ CertificateFactory cf = CertificateFactory.getInstance("X.509");
+ Certificate c = cf.generateCertificate(fis);
+ fis.close();
+ CertPath cp = cf.generateCertPath(Collections.singletonList(c));
+
+ // Create a code signer
+ CodeSigner cs = new CodeSigner(cp, new Timestamp(new Date(), cp));
+
+ // Serialize the code signer
+ ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
+ ObjectOutputStream out = new ObjectOutputStream(byteOut);
+ out.writeObject(cs);
+ out.close();
+
+ // Deserialize the code signer
+ byte[] data = byteOut.toByteArray();
+ CodeSigner cs2 = (CodeSigner) new ObjectInputStream(
+ new ByteArrayInputStream(data)).readObject();
+
+ // Test for equality
+ if (!cs.equals(cs2) || cs.hashCode() != cs2.hashCode()) {
+ throw new Exception("CodeSigner serialization test FAILED");
+ }
+ }
+}
Binary file jdk/test/java/security/CodeSigner/cert_file has changed