8001033: Refactor network address handling in virtual machine identifiers
Reviewed-by: smarks, hawtin, mchung
--- a/jdk/src/share/classes/java/rmi/dgc/VMID.java Thu Mar 14 13:46:15 2013 -0700
+++ b/jdk/src/share/classes/java/rmi/dgc/VMID.java Wed Mar 13 17:24:34 2013 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2013, 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
@@ -25,10 +25,8 @@
package java.rmi.dgc;
-import java.io.*;
-import java.net.*;
import java.rmi.server.UID;
-import java.security.*;
+import java.security.SecureRandom;
/**
* A VMID is a identifier that is unique across all Java virtual
@@ -39,9 +37,8 @@
* @author Peter Jones
*/
public final class VMID implements java.io.Serializable {
-
- /** array of bytes uniquely identifying this host */
- private static byte[] localAddr = computeAddressHash();
+ /** Array of bytes uniquely identifying this host */
+ private static final byte[] randomBytes;
/**
* @serial array of bytes uniquely identifying host created on
@@ -56,6 +53,14 @@
/** indicate compatibility with JDK 1.1.x version of class */
private static final long serialVersionUID = -538642295484486218L;
+ static {
+ // Generate 8 bytes of random data.
+ SecureRandom secureRandom = new SecureRandom();
+ byte bytes[] = new byte[8];
+ secureRandom.nextBytes(bytes);
+ randomBytes = bytes;
+ }
+
/**
* Create a new VMID. Each new VMID returned from this constructor
* is unique for all Java virtual machines under the following
@@ -65,7 +70,7 @@
* for the lifetime of this object. <p>
*/
public VMID() {
- addr = localAddr;
+ addr = randomBytes;
uid = new UID();
}
@@ -126,52 +131,4 @@
result.append(uid.toString());
return result.toString();
}
-
- /**
- * Compute the hash an IP address. The hash is the first 8 bytes
- * of the SHA digest of the IP address.
- */
- private static byte[] computeAddressHash() {
-
- /*
- * Get the local host's IP address.
- */
- byte[] addr = java.security.AccessController.doPrivileged(
- new PrivilegedAction<byte[]>() {
- public byte[] run() {
- try {
- return InetAddress.getLocalHost().getAddress();
- } catch (Exception e) {
- }
- return new byte[] { 0, 0, 0, 0 };
- }
- });
-
- byte[] addrHash;
- final int ADDR_HASH_LENGTH = 8;
-
- try {
- /*
- * Calculate message digest of IP address using SHA.
- */
- MessageDigest md = MessageDigest.getInstance("SHA");
- ByteArrayOutputStream sink = new ByteArrayOutputStream(64);
- DataOutputStream out = new DataOutputStream(
- new DigestOutputStream(sink, md));
- out.write(addr, 0, addr.length);
- out.flush();
-
- byte digest[] = md.digest();
- int hashlength = Math.min(ADDR_HASH_LENGTH, digest.length);
- addrHash = new byte[hashlength];
- System.arraycopy(digest, 0, addrHash, 0, hashlength);
-
- } catch (IOException ignore) {
- /* can't happen, but be deterministic anyway. */
- addrHash = new byte[0];
- } catch (NoSuchAlgorithmException complain) {
- throw new InternalError(complain.toString(), complain);
- }
- return addrHash;
- }
}