--- a/jdk/src/share/classes/com/sun/jndi/ldap/Connection.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/src/share/classes/com/sun/jndi/ldap/Connection.java Mon Jul 21 09:04:24 2014 -0700
@@ -258,9 +258,9 @@
// create the factory
+ @SuppressWarnings("unchecked")
Class<? extends SocketFactory> socketFactoryClass =
- (Class<? extends SocketFactory>) Obj.helper.loadClass
- (socketFactory);
+ (Class<? extends SocketFactory>)Obj.helper.loadClass(socketFactory);
Method getDefault =
socketFactoryClass.getMethod("getDefault", new Class<?>[]{});
SocketFactory factory = (SocketFactory) getDefault.invoke(null, new Object[]{});
--- a/jdk/src/share/classes/com/sun/jndi/toolkit/corba/CorbaUtils.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/src/share/classes/com/sun/jndi/toolkit/corba/CorbaUtils.java Mon Jul 21 09:04:24 2014 -0700
@@ -55,7 +55,6 @@
* Returns the CORBA object reference associated with a Remote
* object by using the javax.rmi.CORBA package.
*<p>
- * Use reflection to avoid hard dependencies on javax.rmi.CORBA package.
* This method effective does the following:
*<blockquote><pre>
* java.lang.Object stub;
--- a/jdk/src/share/classes/com/sun/security/auth/module/Krb5LoginModule.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/src/share/classes/com/sun/security/auth/module/Krb5LoginModule.java Mon Jul 21 09:04:24 2014 -0700
@@ -33,7 +33,10 @@
import java.util.*;
import javax.security.auth.*;
-import javax.security.auth.kerberos.*;
+import javax.security.auth.kerberos.KerberosTicket;
+import javax.security.auth.kerberos.KerberosPrincipal;
+import javax.security.auth.kerberos.KerberosKey;
+import javax.security.auth.kerberos.KeyTab;
import javax.security.auth.callback.*;
import javax.security.auth.login.*;
import javax.security.auth.spi.*;
--- a/jdk/src/share/classes/com/sun/security/jgss/ExtendedGSSContext.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/src/share/classes/com/sun/security/jgss/ExtendedGSSContext.java Mon Jul 21 09:04:24 2014 -0700
@@ -36,33 +36,7 @@
public interface ExtendedGSSContext extends GSSContext {
/**
* Return the mechanism-specific attribute associated with {@code type}.
- * <br><br>
- * For each supported attribute type, the type for the output are
- * defined below.
- * <ol>
- * <li>{@code KRB5_GET_TKT_FLAGS}:
- * the returned object is a boolean array for the service ticket flags,
- * which is long enough to contain all true bits. This means if
- * the user wants to get the <em>n</em>'th bit but the length of the
- * returned array is less than <em>n</em>, it is regarded as false.
- * <li>{@code KRB5_GET_SESSION_KEY}:
- * the returned object is an instance of {@link java.security.Key},
- * which has the following properties:
- * <ul>
- * <li>Algorithm: enctype as a string, where
- * enctype is defined in RFC 3961, section 8.
- * <li>Format: "RAW"
- * <li>Encoded form: the raw key bytes, not in any ASN.1 encoding
- * </ul>
- * <li>{@code KRB5_GET_AUTHZ_DATA}:
- * the returned object is an array of
- * {@link com.sun.security.jgss.AuthorizationDataEntry}, or null if the
- * optional field is missing in the service ticket.
- * <li>{@code KRB5_GET_AUTHTIME}:
- * the returned object is a String object in the standard KerberosTime
- * format defined in RFC 4120 5.2.3
- * </ol>
- *
+ * <p>
* If there is a security manager, an {@link InquireSecContextPermission}
* with the name {@code type.mech} must be granted. Otherwise, this could
* result in a {@link SecurityException}.<p>
@@ -97,6 +71,7 @@
* @throws SecurityException if a security manager exists and a proper
* {@link InquireSecContextPermission} is not granted.
* @see InquireSecContextPermission
+ * @see InquireType
*/
public Object inquireSecContext(InquireType type)
throws GSSException;
--- a/jdk/src/share/classes/com/sun/security/jgss/InquireType.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/src/share/classes/com/sun/security/jgss/InquireType.java Mon Jul 21 09:04:24 2014 -0700
@@ -32,13 +32,38 @@
@jdk.Exported
public enum InquireType {
/**
- * Attribute type for retrieving the session key of an
- * established Kerberos 5 security context.
+ * Attribute type for retrieving the session key of an established
+ * Kerberos 5 security context. The returned object is an instance of
+ * {@link java.security.Key}, which has the following properties:
+ * <ul>
+ * <li>Algorithm: enctype as a string, where
+ * enctype is defined in RFC 3961, section 8.
+ * <li>Format: "RAW"
+ * <li>Encoded form: the raw key bytes, not in any ASN.1 encoding
+ * </ul>
+ * @deprecated as of 1.9, replaced by {@link #KRB5_GET_SESSION_KEY_EX}
+ * which returns an instance of
+ * {@link sun.security.jgss.krb5.Krb5Context.EncryptionKey}
+ * that implements the {@link javax.crypto.SecretKey} interface and
+ * has similar methods with {@link javax.security.auth.kerberos.KerberosKey}.
*/
+ @Deprecated
KRB5_GET_SESSION_KEY,
/**
+ * Attribute type for retrieving the session key of an
+ * established Kerberos 5 security context. The return value is an
+ * instance of {@link javax.security.auth.kerberos.EncryptionKey}.
+ *
+ * @since 1.9
+ */
+ KRB5_GET_SESSION_KEY_EX,
+ /**
* Attribute type for retrieving the service ticket flags of an
- * established Kerberos 5 security context.
+ * established Kerberos 5 security context. The returned object is
+ * a boolean array for the service ticket flags, which is long enough
+ * to contain all true bits. This means if the user wants to get the
+ * <em>n</em>'th bit but the length of the returned array is less than
+ * <em>n</em>, it is regarded as false.
*/
KRB5_GET_TKT_FLAGS,
/**
@@ -49,7 +74,17 @@
KRB5_GET_AUTHZ_DATA,
/**
* Attribute type for retrieving the authtime in the service ticket
- * of an established Kerberos 5 security context.
+ * of an established Kerberos 5 security context. The returned object
+ * is a String object in the standard KerberosTime format defined in
+ * RFC 4120 Section 5.2.3.
*/
- KRB5_GET_AUTHTIME
+ KRB5_GET_AUTHTIME,
+ /**
+ * Attribute type for retrieving the KRB_CRED message that an initiator
+ * is about to send to an acceptor. The return type is an instance of
+ * {@link javax.security.auth.kerberos.KerberosCredMessage}.
+ *
+ * @since 1.9
+ */
+ KRB5_GET_KRB_CRED,
}
--- a/jdk/src/share/classes/java/lang/Integer.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/src/share/classes/java/lang/Integer.java Mon Jul 21 09:04:24 2014 -0700
@@ -26,6 +26,7 @@
package java.lang;
import java.lang.annotation.Native;
+import java.util.Objects;
/**
* The {@code Integer} class wraps a value of the primitive type
@@ -319,24 +320,27 @@
}
/**
- * Format a long (treated as unsigned) into a character buffer.
+ * Format an {@code int} (treated as unsigned) into a character buffer. If
+ * {@code len} exceeds the formatted ASCII representation of {@code val},
+ * {@code buf} will be padded with leading zeroes.
+ *
* @param val the unsigned int to format
* @param shift the log2 of the base to format in (4 for hex, 3 for octal, 1 for binary)
* @param buf the character buffer to write to
* @param offset the offset in the destination buffer to start at
* @param len the number of characters to write
- * @return the lowest character location used
*/
- static int formatUnsignedInt(int val, int shift, char[] buf, int offset, int len) {
- int charPos = len;
+ static void formatUnsignedInt(int val, int shift, char[] buf, int offset, int len) {
+ // assert shift > 0 && shift <=5 : "Illegal shift value";
+ // assert offset >= 0 && offset < buf.length : "illegal offset";
+ // assert len > 0 && (offset + len) <= buf.length : "illegal length";
+ int charPos = offset + len;
int radix = 1 << shift;
int mask = radix - 1;
do {
- buf[offset + --charPos] = Integer.digits[val & mask];
+ buf[--charPos] = Integer.digits[val & mask];
val >>>= shift;
- } while (val != 0 && charPos > 0);
-
- return charPos;
+ } while (charPos > offset);
}
final static char [] DigitTens = {
@@ -549,12 +553,9 @@
" greater than Character.MAX_RADIX");
}
- int result = 0;
boolean negative = false;
int i = 0, len = s.length();
int limit = -Integer.MAX_VALUE;
- int multmin;
- int digit;
if (len > 0) {
char firstChar = s.charAt(0);
@@ -562,21 +563,21 @@
if (firstChar == '-') {
negative = true;
limit = Integer.MIN_VALUE;
- } else if (firstChar != '+')
+ } else if (firstChar != '+') {
throw NumberFormatException.forInputString(s);
+ }
- if (len == 1) // Cannot have lone "+" or "-"
+ if (len == 1) { // Cannot have lone "+" or "-"
throw NumberFormatException.forInputString(s);
+ }
i++;
}
- multmin = limit / radix;
+ int multmin = limit / radix;
+ int result = 0;
while (i < len) {
// Accumulating negatively avoids surprises near MAX_VALUE
- digit = Character.digit(s.charAt(i++),radix);
- if (digit < 0) {
- throw NumberFormatException.forInputString(s);
- }
- if (result < multmin) {
+ int digit = Character.digit(s.charAt(i++), radix);
+ if (digit < 0 || result < multmin) {
throw NumberFormatException.forInputString(s);
}
result *= radix;
@@ -585,10 +586,126 @@
}
result -= digit;
}
+ return negative ? result : -result;
} else {
throw NumberFormatException.forInputString(s);
}
- return negative ? result : -result;
+ }
+
+ /**
+ * Parses the {@link CharSequence} argument as a signed {@code int} in the
+ * specified {@code radix}, beginning at the specified {@code beginIndex}
+ * and extending to the end of the sequence.
+ *
+ * <p>The method does not take steps to guard against the
+ * {@code CharSequence} being mutated while parsing.
+ *
+ * @param s the {@code CharSequence} containing the {@code int}
+ * representation to be parsed
+ * @param radix the radix to be used while parsing {@code s}.
+ * @param beginIndex the beginning index, inclusive.
+ * @return the signed {@code int} represented by the subsequence in
+ * the specified radix.
+ * @throws NullPointerException if {@code s} is null.
+ * @throws IndexOutOfBoundsException if {@code beginIndex} is
+ * negative, or if {@code beginIndex} is greater than
+ * {@code s.length()}.
+ * @throws NumberFormatException if the {@code CharSequence} does not
+ * contain a parsable {@code int} in the specified
+ * {@code radix}, or if {@code radix} is either smaller than
+ * {@link java.lang.Character#MIN_RADIX} or larger than
+ * {@link java.lang.Character#MAX_RADIX}.
+ * @since 1.9
+ */
+ public static int parseInt(CharSequence s, int radix, int beginIndex)
+ throws NumberFormatException {
+ // forces an implicit null check of s
+ return parseInt(s, radix, beginIndex, s.length());
+ }
+
+ /**
+ * Parses the {@link CharSequence} argument as a signed {@code int} in the
+ * specified {@code radix}, beginning at the specified {@code beginIndex}
+ * and extending to {@code endIndex - 1}.
+ *
+ * <p>The method does not take steps to guard against the
+ * {@code CharSequence} being mutated while parsing.
+ *
+ * @param s the {@code CharSequence} containing the {@code int}
+ * representation to be parsed
+ * @param radix the radix to be used while parsing {@code s}.
+ * @param beginIndex the beginning index, inclusive.
+ * @param endIndex the ending index, exclusive.
+ * @return the signed {@code int} represented by the subsequence in
+ * the specified radix.
+ * @throws NullPointerException if {@code s} is null.
+ * @throws IndexOutOfBoundsException if {@code beginIndex} is
+ * negative, or if {@code beginIndex} is greater than
+ * {@code endIndex} or if {@code endIndex} is greater than
+ * {@code s.length()}.
+ * @throws NumberFormatException if the {@code CharSequence} does not
+ * contain a parsable {@code int} in the specified
+ * {@code radix}, or if {@code radix} is either smaller than
+ * {@link java.lang.Character#MIN_RADIX} or larger than
+ * {@link java.lang.Character#MAX_RADIX}.
+ * @since 1.9
+ */
+ public static int parseInt(CharSequence s, int radix, int beginIndex, int endIndex)
+ throws NumberFormatException {
+ s = Objects.requireNonNull(s);
+
+ if (beginIndex < 0 || beginIndex > endIndex || endIndex > s.length()) {
+ throw new IndexOutOfBoundsException();
+ }
+ if (radix < Character.MIN_RADIX) {
+ throw new NumberFormatException("radix " + radix +
+ " less than Character.MIN_RADIX");
+ }
+ if (radix > Character.MAX_RADIX) {
+ throw new NumberFormatException("radix " + radix +
+ " greater than Character.MAX_RADIX");
+ }
+
+ boolean negative = false;
+ int i = beginIndex;
+ int limit = -Integer.MAX_VALUE;
+
+ if (i < endIndex) {
+ char firstChar = s.charAt(i);
+ if (firstChar < '0') { // Possible leading "+" or "-"
+ if (firstChar == '-') {
+ negative = true;
+ limit = Integer.MIN_VALUE;
+ } else if (firstChar != '+') {
+ throw NumberFormatException.forCharSequence(s, beginIndex,
+ endIndex, i);
+ }
+ i++;
+ if (i == endIndex) { // Cannot have lone "+" or "-"
+ throw NumberFormatException.forCharSequence(s, beginIndex,
+ endIndex, i);
+ }
+ }
+ int multmin = limit / radix;
+ int result = 0;
+ while (i < endIndex) {
+ // Accumulating negatively avoids surprises near MAX_VALUE
+ int digit = Character.digit(s.charAt(i++), radix);
+ if (digit < 0 || result < multmin) {
+ throw NumberFormatException.forCharSequence(s, beginIndex,
+ endIndex, i);
+ }
+ result *= radix;
+ if (result < limit + digit) {
+ throw NumberFormatException.forCharSequence(s, beginIndex,
+ endIndex, i);
+ }
+ result -= digit;
+ }
+ return negative ? result : -result;
+ } else {
+ throw NumberFormatException.forInputString("");
+ }
}
/**
@@ -689,6 +806,99 @@
}
/**
+ * Parses the {@link CharSequence} argument as an unsigned {@code int} in
+ * the specified {@code radix}, beginning at the specified
+ * {@code beginIndex} and extending to the end of the sequence.
+ *
+ * <p>The method does not take steps to guard against the
+ * {@code CharSequence} being mutated while parsing.
+ *
+ * @param s the {@code CharSequence} containing the unsigned
+ * {@code int} representation to be parsed
+ * @param radix the radix to be used while parsing {@code s}.
+ * @param beginIndex the beginning index, inclusive.
+ * @return the unsigned {@code int} represented by the subsequence in
+ * the specified radix.
+ * @throws NullPointerException if {@code s} is null.
+ * @throws IndexOutOfBoundsException if {@code beginIndex} is
+ * negative, or if {@code beginIndex} is greater than
+ * {@code s.length()}.
+ * @throws NumberFormatException if the {@code CharSequence} does not
+ * contain a parsable unsigned {@code int} in the specified
+ * {@code radix}, or if {@code radix} is either smaller than
+ * {@link java.lang.Character#MIN_RADIX} or larger than
+ * {@link java.lang.Character#MAX_RADIX}.
+ * @since 1.9
+ */
+ public static int parseUnsignedInt(CharSequence s, int radix, int beginIndex)
+ throws NumberFormatException {
+ // forces an implicit null check of s
+ return parseUnsignedInt(s, radix, beginIndex, s.length());
+ }
+
+ /**
+ * Parses the {@link CharSequence} argument as an unsigned {@code int} in
+ * the specified {@code radix}, beginning at the specified
+ * {@code beginIndex} and extending to {@code endIndex - 1}.
+ *
+ * <p>The method does not take steps to guard against the
+ * {@code CharSequence} being mutated while parsing.
+ *
+ * @param s the {@code CharSequence} containing the unsigned
+ * {@code int} representation to be parsed
+ * @param radix the radix to be used while parsing {@code s}.
+ * @param beginIndex the beginning index, inclusive.
+ * @param endIndex the ending index, exclusive.
+ * @return the unsigned {@code int} represented by the subsequence in
+ * the specified radix.
+ * @throws NullPointerException if {@code s} is null.
+ * @throws IndexOutOfBoundsException if {@code beginIndex} is
+ * negative, or if {@code beginIndex} is greater than
+ * {@code endIndex} or if {@code endIndex} is greater than
+ * {@code s.length()}.
+ * @throws NumberFormatException if the {@code CharSequence} does not
+ * contain a parsable unsigned {@code int} in the specified
+ * {@code radix}, or if {@code radix} is either smaller than
+ * {@link java.lang.Character#MIN_RADIX} or larger than
+ * {@link java.lang.Character#MAX_RADIX}.
+ * @since 1.9
+ */
+ public static int parseUnsignedInt(CharSequence s, int radix, int beginIndex, int endIndex)
+ throws NumberFormatException {
+ s = Objects.requireNonNull(s);
+
+ if (beginIndex < 0 || beginIndex > endIndex || endIndex > s.length()) {
+ throw new IndexOutOfBoundsException();
+ }
+ int start = beginIndex, len = endIndex - beginIndex;
+
+ if (len > 0) {
+ char firstChar = s.charAt(start);
+ if (firstChar == '-') {
+ throw new
+ NumberFormatException(String.format("Illegal leading minus sign " +
+ "on unsigned string %s.", s));
+ } else {
+ if (len <= 5 || // Integer.MAX_VALUE in Character.MAX_RADIX is 6 digits
+ (radix == 10 && len <= 9)) { // Integer.MAX_VALUE in base 10 is 10 digits
+ return parseInt(s, radix, start, start + len);
+ } else {
+ long ell = Long.parseLong(s, radix, start, start + len);
+ if ((ell & 0xffff_ffff_0000_0000L) == 0) {
+ return (int) ell;
+ } else {
+ throw new
+ NumberFormatException(String.format("String value %s exceeds " +
+ "range of unsigned int.", s));
+ }
+ }
+ }
+ } else {
+ throw new NumberFormatException("");
+ }
+ }
+
+ /**
* Parses the string argument as an unsigned decimal integer. The
* characters in the string must all be decimal digits, except
* that the first character may be an an ASCII plus sign {@code
--- a/jdk/src/share/classes/java/lang/Long.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/src/share/classes/java/lang/Long.java Mon Jul 21 09:04:24 2014 -0700
@@ -27,6 +27,7 @@
import java.lang.annotation.Native;
import java.math.*;
+import java.util.Objects;
/**
@@ -360,24 +361,27 @@
}
/**
- * Format a long (treated as unsigned) into a character buffer.
+ * Format a long (treated as unsigned) into a character buffer. If
+ * {@code len} exceeds the formatted ASCII representation of {@code val},
+ * {@code buf} will be padded with leading zeroes.
+ *
* @param val the unsigned long to format
* @param shift the log2 of the base to format in (4 for hex, 3 for octal, 1 for binary)
* @param buf the character buffer to write to
* @param offset the offset in the destination buffer to start at
* @param len the number of characters to write
- * @return the lowest character location used
*/
- static int formatUnsignedLong(long val, int shift, char[] buf, int offset, int len) {
- int charPos = len;
+ static void formatUnsignedLong(long val, int shift, char[] buf, int offset, int len) {
+ // assert shift > 0 && shift <=5 : "Illegal shift value";
+ // assert offset >= 0 && offset < buf.length : "illegal offset";
+ // assert len > 0 && (offset + len) <= buf.length : "illegal length";
+ int charPos = offset + len;
int radix = 1 << shift;
int mask = radix - 1;
do {
- buf[offset + --charPos] = Integer.digits[((int) val) & mask];
+ buf[--charPos] = Integer.digits[((int) val) & mask];
val >>>= shift;
- } while (val != 0 && charPos > 0);
-
- return charPos;
+ } while (charPos > offset);
}
/**
@@ -561,12 +565,9 @@
" greater than Character.MAX_RADIX");
}
- long result = 0;
boolean negative = false;
int i = 0, len = s.length();
long limit = -Long.MAX_VALUE;
- long multmin;
- int digit;
if (len > 0) {
char firstChar = s.charAt(0);
@@ -574,21 +575,21 @@
if (firstChar == '-') {
negative = true;
limit = Long.MIN_VALUE;
- } else if (firstChar != '+')
+ } else if (firstChar != '+') {
throw NumberFormatException.forInputString(s);
+ }
- if (len == 1) // Cannot have lone "+" or "-"
+ if (len == 1) { // Cannot have lone "+" or "-"
throw NumberFormatException.forInputString(s);
+ }
i++;
}
- multmin = limit / radix;
+ long multmin = limit / radix;
+ long result = 0;
while (i < len) {
// Accumulating negatively avoids surprises near MAX_VALUE
- digit = Character.digit(s.charAt(i++),radix);
- if (digit < 0) {
- throw NumberFormatException.forInputString(s);
- }
- if (result < multmin) {
+ int digit = Character.digit(s.charAt(i++),radix);
+ if (digit < 0 || result < multmin) {
throw NumberFormatException.forInputString(s);
}
result *= radix;
@@ -597,10 +598,126 @@
}
result -= digit;
}
+ return negative ? result : -result;
} else {
throw NumberFormatException.forInputString(s);
}
- return negative ? result : -result;
+ }
+
+ /**
+ * Parses the {@link CharSequence} argument as a signed {@code long} in
+ * the specified {@code radix}, beginning at the specified {@code beginIndex}
+ * and extending to the end of the sequence.
+ *
+ * <p>The method does not take steps to guard against the
+ * {@code CharSequence} being mutated while parsing.
+ *
+ * @param s the {@code CharSequence} containing the {@code long}
+ * representation to be parsed
+ * @param radix the radix to be used while parsing {@code s}.
+ * @param beginIndex the beginning index, inclusive.
+ * @return the signed {@code long} represented by the subsequence in
+ * the specified radix.
+ * @throws NullPointerException if {@code s} is null.
+ * @throws IndexOutOfBoundsException if {@code beginIndex} is
+ * negative, or if {@code beginIndex} is greater than
+ * {@code s.length()}.
+ * @throws NumberFormatException if the {@code CharSequence} does not
+ * contain a parsable {@code long} in the specified
+ * {@code radix}, or if {@code radix} is either smaller than
+ * {@link java.lang.Character#MIN_RADIX} or larger than
+ * {@link java.lang.Character#MAX_RADIX}.
+ * @since 1.9
+ */
+ public static long parseLong(CharSequence s, int radix, int beginIndex)
+ throws NumberFormatException {
+ // forces a null check of s
+ return parseLong(s, radix, beginIndex, s.length());
+ }
+
+ /**
+ * Parses the {@link CharSequence} argument as a signed {@code long} in
+ * the specified {@code radix}, beginning at the specified
+ * {@code beginIndex} and extending to {@code endIndex - 1}.
+ *
+ * <p>The method does not take steps to guard against the
+ * {@code CharSequence} being mutated while parsing.
+ *
+ * @param s the {@code CharSequence} containing the {@code long}
+ * representation to be parsed
+ * @param radix the radix to be used while parsing {@code s}.
+ * @param beginIndex the beginning index, inclusive.
+ * @param endIndex the ending index, exclusive.
+ * @return the signed {@code long} represented by the subsequence in
+ * the specified radix.
+ * @throws NullPointerException if {@code s} is null.
+ * @throws IndexOutOfBoundsException if {@code beginIndex} is
+ * negative, or if {@code beginIndex} is greater than
+ * {@code endIndex} or if {@code endIndex} is greater than
+ * {@code s.length()}.
+ * @throws NumberFormatException if the {@code CharSequence} does not
+ * contain a parsable {@code int} in the specified
+ * {@code radix}, or if {@code radix} is either smaller than
+ * {@link java.lang.Character#MIN_RADIX} or larger than
+ * {@link java.lang.Character#MAX_RADIX}.
+ * @since 1.9
+ */
+ public static long parseLong(CharSequence s, int radix, int beginIndex, int endIndex)
+ throws NumberFormatException {
+ s = Objects.requireNonNull(s);
+
+ if (beginIndex < 0 || beginIndex > endIndex || endIndex > s.length()) {
+ throw new IndexOutOfBoundsException();
+ }
+ if (radix < Character.MIN_RADIX) {
+ throw new NumberFormatException("radix " + radix +
+ " less than Character.MIN_RADIX");
+ }
+ if (radix > Character.MAX_RADIX) {
+ throw new NumberFormatException("radix " + radix +
+ " greater than Character.MAX_RADIX");
+ }
+
+ boolean negative = false;
+ int i = beginIndex;
+ long limit = -Long.MAX_VALUE;
+
+ if (i < endIndex) {
+ char firstChar = s.charAt(i);
+ if (firstChar < '0') { // Possible leading "+" or "-"
+ if (firstChar == '-') {
+ negative = true;
+ limit = Long.MIN_VALUE;
+ } else if (firstChar != '+') {
+ throw NumberFormatException.forCharSequence(s, beginIndex,
+ endIndex, i);
+ }
+ i++;
+ }
+ if (i >= endIndex) { // Cannot have lone "+", "-" or ""
+ throw NumberFormatException.forCharSequence(s, beginIndex,
+ endIndex, i);
+ }
+ long multmin = limit / radix;
+ long result = 0;
+ while (i < endIndex) {
+ // Accumulating negatively avoids surprises near MAX_VALUE
+ int digit = Character.digit(s.charAt(i++), radix);
+ if (digit < 0 || result < multmin) {
+ throw NumberFormatException.forCharSequence(s, beginIndex,
+ endIndex, i);
+ }
+ result *= radix;
+ if (result < limit + digit) {
+ throw NumberFormatException.forCharSequence(s, beginIndex,
+ endIndex, i);
+ }
+ result -= digit;
+ }
+ return negative ? result : -result;
+ } else {
+ throw new NumberFormatException("");
+ }
}
/**
@@ -694,7 +811,7 @@
}
// No need for range checks on len due to testing above.
- long first = parseLong(s.substring(0, len - 1), radix);
+ long first = parseLong(s, radix, 0, len - 1);
int second = Character.digit(s.charAt(len - 1), radix);
if (second < 0) {
throw new NumberFormatException("Bad digit at end of " + s);
@@ -764,6 +881,155 @@
}
/**
+ * Parses the {@link CharSequence} argument as an unsigned {@code long} in
+ * the specified {@code radix}, beginning at the specified
+ * {@code beginIndex} and extending to the end of the sequence.
+ *
+ * <p>The method does not take steps to guard against the
+ * {@code CharSequence} being mutated while parsing.
+ *
+ * @param s the {@code CharSequence} containing the unsigned
+ * {@code long} representation to be parsed
+ * @param radix the radix to be used while parsing {@code s}.
+ * @param beginIndex the beginning index, inclusive.
+ * @return the unsigned {@code long} represented by the subsequence in
+ * the specified radix.
+ * @throws NullPointerException if {@code s} is null.
+ * @throws IndexOutOfBoundsException if {@code beginIndex} is
+ * negative, or if {@code beginIndex} is greater than
+ * {@code s.length()}.
+ * @throws NumberFormatException if the {@code CharSequence} does not
+ * contain a parsable unsigned {@code long} in the specified
+ * {@code radix}, or if {@code radix} is either smaller than
+ * {@link java.lang.Character#MIN_RADIX} or larger than
+ * {@link java.lang.Character#MAX_RADIX}.
+ * @since 1.9
+ */
+ public static long parseUnsignedLong(CharSequence s, int radix, int beginIndex)
+ throws NumberFormatException {
+ // forces a null check of s
+ return parseUnsignedLong(s, radix, beginIndex, s.length());
+ }
+
+ /**
+ * Parses the {@link CharSequence} argument as an unsigned {@code long} in
+ * the specified {@code radix}, beginning at the specified
+ * {@code beginIndex} and extending to {@code endIndex - 1}.
+ *
+ * <p>The method does not take steps to guard against the
+ * {@code CharSequence} being mutated while parsing.
+ *
+ * @param s the {@code CharSequence} containing the unsigned
+ * {@code long} representation to be parsed
+ * @param radix the radix to be used while parsing {@code s}.
+ * @param beginIndex the beginning index, inclusive.
+ * @param endIndex the ending index, exclusive.
+ * @return the unsigned {@code long} represented by the subsequence in
+ * the specified radix.
+ * @throws NullPointerException if {@code s} is null.
+ * @throws IndexOutOfBoundsException if {@code beginIndex} is
+ * negative, or if {@code beginIndex} is greater than
+ * {@code endIndex} or if {@code endIndex} is greater than
+ * {@code s.length()}.
+ * @throws NumberFormatException if the {@code CharSequence} does not
+ * contain a parsable unsigned {@code long} in the specified
+ * {@code radix}, or if {@code radix} is either smaller than
+ * {@link java.lang.Character#MIN_RADIX} or larger than
+ * {@link java.lang.Character#MAX_RADIX}.
+ * @since 1.9
+ */
+ public static long parseUnsignedLong(CharSequence s, int radix, int beginIndex, int endIndex)
+ throws NumberFormatException {
+ s = Objects.requireNonNull(s);
+
+ if (beginIndex < 0 || beginIndex > endIndex || endIndex > s.length()) {
+ throw new IndexOutOfBoundsException();
+ }
+ int start = beginIndex, len = endIndex - beginIndex;
+
+ if (len > 0) {
+ char firstChar = s.charAt(start);
+ if (firstChar == '-') {
+ throw new NumberFormatException(String.format("Illegal leading minus sign " +
+ "on unsigned string %s.", s.subSequence(start, start + len)));
+ } else {
+ if (len <= 12 || // Long.MAX_VALUE in Character.MAX_RADIX is 13 digits
+ (radix == 10 && len <= 18) ) { // Long.MAX_VALUE in base 10 is 19 digits
+ return parseLong(s, radix, start, start + len);
+ }
+
+ // No need for range checks on end due to testing above.
+ long first = parseLong(s, radix, start, start + len - 1);
+ int second = Character.digit(s.charAt(start + len - 1), radix);
+ if (second < 0) {
+ throw new NumberFormatException("Bad digit at end of " +
+ s.subSequence(start, start + len));
+ }
+ long result = first * radix + second;
+
+ /*
+ * Test leftmost bits of multiprecision extension of first*radix
+ * for overflow. The number of bits needed is defined by
+ * GUARD_BIT = ceil(log2(Character.MAX_RADIX)) + 1 = 7. Then
+ * int guard = radix*(int)(first >>> (64 - GUARD_BIT)) and
+ * overflow is tested by splitting guard in the ranges
+ * guard < 92, 92 <= guard < 128, and 128 <= guard, where
+ * 92 = 128 - Character.MAX_RADIX. Note that guard cannot take
+ * on a value which does not include a prime factor in the legal
+ * radix range.
+ */
+ int guard = radix * (int) (first >>> 57);
+ if (guard >= 128 ||
+ (result >= 0 && guard >= 128 - Character.MAX_RADIX)) {
+ /*
+ * For purposes of exposition, the programmatic statements
+ * below should be taken to be multi-precision, i.e., not
+ * subject to overflow.
+ *
+ * A) Condition guard >= 128:
+ * If guard >= 128 then first*radix >= 2^7 * 2^57 = 2^64
+ * hence always overflow.
+ *
+ * B) Condition guard < 92:
+ * Define left7 = first >>> 57.
+ * Given first = (left7 * 2^57) + (first & (2^57 - 1)) then
+ * result <= (radix*left7)*2^57 + radix*(2^57 - 1) + second.
+ * Thus if radix*left7 < 92, radix <= 36, and second < 36,
+ * then result < 92*2^57 + 36*(2^57 - 1) + 36 = 2^64 hence
+ * never overflow.
+ *
+ * C) Condition 92 <= guard < 128:
+ * first*radix + second >= radix*left7*2^57 + second
+ * so that first*radix + second >= 92*2^57 + 0 > 2^63
+ *
+ * D) Condition guard < 128:
+ * radix*first <= (radix*left7) * 2^57 + radix*(2^57 - 1)
+ * so
+ * radix*first + second <= (radix*left7) * 2^57 + radix*(2^57 - 1) + 36
+ * thus
+ * radix*first + second < 128 * 2^57 + 36*2^57 - radix + 36
+ * whence
+ * radix*first + second < 2^64 + 2^6*2^57 = 2^64 + 2^63
+ *
+ * E) Conditions C, D, and result >= 0:
+ * C and D combined imply the mathematical result
+ * 2^63 < first*radix + second < 2^64 + 2^63. The lower
+ * bound is therefore negative as a signed long, but the
+ * upper bound is too small to overflow again after the
+ * signed long overflows to positive above 2^64 - 1. Hence
+ * result >= 0 implies overflow given C and D.
+ */
+ throw new NumberFormatException(String.format("String value %s exceeds " +
+ "range of unsigned long.", s.subSequence(start, start + len)));
+ }
+ return result;
+ }
+ } else {
+ throw NumberFormatException.forInputString("");
+ }
+ }
+
+ /**
* Parses the string argument as an unsigned decimal {@code long}. The
* characters in the string must all be decimal digits, except
* that the first character may be an an ASCII plus sign {@code
--- a/jdk/src/share/classes/java/lang/NumberFormatException.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/src/share/classes/java/lang/NumberFormatException.java Mon Jul 21 09:04:24 2014 -0700
@@ -56,7 +56,7 @@
}
/**
- * Factory method for making a <code>NumberFormatException</code>
+ * Factory method for making a {@code NumberFormatException}
* given the specified input which caused the error.
*
* @param s the input causing the error
@@ -64,4 +64,20 @@
static NumberFormatException forInputString(String s) {
return new NumberFormatException("For input string: \"" + s + "\"");
}
+
+ /**
+ * Factory method for making a {@code NumberFormatException}
+ * given the specified input which caused the error.
+ *
+ * @param s the input causing the error
+ * @param beginIndex the beginning index, inclusive.
+ * @param endIndex the ending index, exclusive.
+ * @param errorIndex the index of the first error in s
+ */
+ static NumberFormatException forCharSequence(CharSequence s,
+ int beginIndex, int endIndex, int errorIndex) {
+ return new NumberFormatException("Error at index "
+ + (errorIndex - beginIndex) + " in: \""
+ + s.subSequence(beginIndex, endIndex) + "\"");
+ }
}
--- a/jdk/src/share/classes/java/lang/String.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/src/share/classes/java/lang/String.java Mon Jul 21 09:04:24 2014 -0700
@@ -2580,7 +2580,8 @@
}
for (int i = first; i < len; i++) {
int cp = (int)value[i];
- if (cp == '\u03A3') { // GREEK CAPITAL LETTER SIGMA
+ if (cp == '\u03A3' || // GREEK CAPITAL LETTER SIGMA
+ Character.isSurrogate((char)cp)) {
return toLowerCaseEx(result, i, locale, false);
}
if (cp == '\u0130') { // LATIN CAPITAL LETTER I WITH DOT ABOVE
@@ -2742,7 +2743,11 @@
return toUpperCaseEx(result, first, locale, false);
}
for (int i = first; i < len; i++) {
- int cp = Character.toUpperCaseEx((int)value[i]);
+ int cp = (int)value[i];
+ if (Character.isSurrogate((char)cp)) {
+ return toUpperCaseEx(result, i, locale, false);
+ }
+ cp = Character.toUpperCaseEx(cp);
if (!Character.isBmpCodePoint(cp)) { // Character.ERROR is not bmp
return toUpperCaseEx(result, i, locale, false);
}
--- a/jdk/src/share/classes/java/lang/System.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/src/share/classes/java/lang/System.java Mon Jul 21 09:04:24 2014 -0700
@@ -1263,6 +1263,12 @@
public void invokeFinalize(Object o) throws Throwable {
o.finalize();
}
+ public void formatUnsignedLong(long val, int shift, char[] buf, int offset, int len) {
+ Long.formatUnsignedLong(val, shift, buf, offset, len);
+ }
+ public void formatUnsignedInt(int val, int shift, char[] buf, int offset, int len) {
+ Integer.formatUnsignedInt(val, shift, buf, offset, len);
+ }
});
}
}
--- a/jdk/src/share/classes/java/nio/StringCharBuffer.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/src/share/classes/java/nio/StringCharBuffer.java Mon Jul 21 09:04:24 2014 -0700
@@ -100,7 +100,7 @@
}
final String toString(int start, int end) {
- return str.toString().substring(start + offset, end + offset);
+ return str.subSequence(start + offset, end + offset).toString();
}
public final CharBuffer subSequence(int start, int end) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/javax/security/auth/kerberos/EncryptionKey.java Mon Jul 21 09:04:24 2014 -0700
@@ -0,0 +1,208 @@
+/*
+ * Copyright (c) 2014, 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. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+
+package javax.security.auth.kerberos;
+
+import java.util.Arrays;
+import java.util.Objects;
+import javax.crypto.SecretKey;
+import javax.security.auth.DestroyFailedException;
+
+/**
+ * This class encapsulates an EncryptionKey used in Kerberos.<p>
+ *
+ * An EncryptionKey is defined in Section 4.2.9 of the Kerberos Protocol
+ * Specification (<a href=http://www.ietf.org/rfc/rfc4120.txt>RFC 4120</a>) as:
+ * <pre>
+ * EncryptionKey ::= SEQUENCE {
+ * keytype [0] Int32 -- actually encryption type --,
+ * keyvalue [1] OCTET STRING
+ * }
+ * </pre>
+ * The key material of an {@code EncryptionKey} is defined as the value
+ * of the {@code keyValue} above.<p>
+ *
+ * @since 1.9
+ */
+public final class EncryptionKey implements SecretKey {
+
+ private static final long serialVersionUID = 9L;
+
+ /**
+ * {@code KeyImpl} is serialized by writing out the ASN.1 encoded bytes
+ * of the encryption key.
+ *
+ * @serial
+ */
+ final private KeyImpl key;
+
+ private transient boolean destroyed = false;
+
+ /**
+ * Constructs a {@code EncryptionKey} from the given bytes and
+ * the key type.
+ * <p>
+ * The contents of the byte array are copied; subsequent modification of
+ * the byte array does not affect the newly created key.
+ *
+ * @param keyBytes the key material for the key
+ * @param keyType the key type for the key as defined by the
+ * Kerberos protocol specification.
+ * @throws NullPointerException if keyBytes is null
+ */
+ public EncryptionKey(byte[] keyBytes, int keyType) {
+ key = new KeyImpl(Objects.requireNonNull(keyBytes), keyType);
+ }
+
+ /**
+ * Returns the key type for this key.
+ *
+ * @return the key type.
+ * @throws IllegalStateException if the key is destroyed
+ */
+ public int getKeyType() {
+ // KeyImpl already checked if destroyed
+ return key.getKeyType();
+ }
+
+ /*
+ * Methods from java.security.Key
+ */
+
+ /**
+ * Returns the standard algorithm name for this key. The algorithm names
+ * are the encryption type string defined on the IANA
+ * <a href="https://www.iana.org/assignments/kerberos-parameters/kerberos-parameters.xhtml#kerberos-parameters-1">Kerberos Encryption Type Numbers</a>
+ * page.
+ * <p>
+ * This method can return the following value not defined on the IANA page:
+ * <ol>
+ * <li>none: for etype equal to 0</li>
+ * <li>unknown: for etype greater than 0 but unsupported by
+ * the implementation</li>
+ * <li>private: for etype smaller than 0</li>
+ * </ol>
+ *
+ * @return the name of the algorithm associated with this key.
+ * @throws IllegalStateException if the key is destroyed
+ */
+ @Override
+ public String getAlgorithm() {
+ // KeyImpl already checked if destroyed
+ return key.getAlgorithm();
+ }
+
+ /**
+ * Returns the name of the encoding format for this key.
+ *
+ * @return the String "RAW"
+ * @throws IllegalStateException if the key is destroyed
+ */
+ @Override
+ public String getFormat() {
+ // KeyImpl already checked if destroyed
+ return key.getFormat();
+ }
+
+ /**
+ * Returns the key material of this key.
+ *
+ * @return a newly allocated byte array that contains the key material
+ * @throws IllegalStateException if the key is destroyed
+ */
+ @Override
+ public byte[] getEncoded() {
+ // KeyImpl already checked if destroyed
+ return key.getEncoded();
+ }
+
+ /**
+ * Destroys this key by clearing out the key material of this key.
+ *
+ * @throws DestroyFailedException if some error occurs while destorying
+ * this key.
+ */
+ @Override
+ public void destroy() throws DestroyFailedException {
+ if (!destroyed) {
+ key.destroy();
+ destroyed = true;
+ }
+ }
+
+
+ @Override
+ public boolean isDestroyed() {
+ return destroyed;
+ }
+
+ @Override
+ public String toString() {
+ if (destroyed) {
+ return "Destroyed EncryptionKey";
+ }
+ return "key " + key.toString();
+ }
+
+ @Override
+ public int hashCode() {
+ int result = 17;
+ if (isDestroyed()) {
+ return result;
+ }
+ result = 37 * result + Arrays.hashCode(getEncoded());
+ return 37 * result + getKeyType();
+ }
+
+ /**
+ * Compares the specified Object with this key for equality.
+ * Returns true if the given object is also a
+ * {@code EncryptionKey} and the two
+ * {@code EncryptionKey} instances are equivalent.
+ *
+ * @param other the Object to compare to
+ * @return true if the specified object is equal to this EncryptionKey,
+ * false otherwise. NOTE: Returns false if either of the EncryptionKey
+ * objects has been destroyed.
+ */
+ @Override
+ public boolean equals(Object other) {
+
+ if (other == this)
+ return true;
+
+ if (! (other instanceof EncryptionKey)) {
+ return false;
+ }
+
+ EncryptionKey otherKey = ((EncryptionKey) other);
+ if (isDestroyed() || otherKey.isDestroyed()) {
+ return false;
+ }
+
+ return getKeyType() == otherKey.getKeyType()
+ && Arrays.equals(getEncoded(), otherKey.getEncoded());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/javax/security/auth/kerberos/KerberosCredMessage.java Mon Jul 21 09:04:24 2014 -0700
@@ -0,0 +1,171 @@
+/*
+ * Copyright (c) 2014, 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. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+
+package javax.security.auth.kerberos;
+
+import javax.security.auth.Destroyable;
+import java.util.Arrays;
+import java.util.Base64;
+import java.util.Objects;
+
+/**
+ * This class encapsulates a Kerberos 5 KRB_CRED message which can be used to
+ * send Kerberos credentials from one principal to another.<p>
+ *
+ * A KRB_CRED message is defined in Section 5.8.1 of the Kerberos Protocol
+ * Specification (<a href=http://www.ietf.org/rfc/rfc4120.txt>RFC 4120</a>) as:
+ * <pre>
+ * KRB-CRED ::= [APPLICATION 22] SEQUENCE {
+ * pvno [0] INTEGER (5),
+ * msg-type [1] INTEGER (22),
+ * tickets [2] SEQUENCE OF Ticket,
+ * enc-part [3] EncryptedData -- EncKrbCredPart
+ * }
+ * </pre><p>
+ *
+ * @since 1.9
+ */
+public final class KerberosCredMessage implements Destroyable {
+
+ final private KerberosPrincipal sender;
+ final private KerberosPrincipal recipient;
+ final private byte[] message;
+
+ private boolean destroyed = false;
+
+ /**
+ * Constructs a {@code KerberosCredMessage} object.
+ * <p>
+ * The contents of the {@code message} argument are copied; subsequent
+ * modification of the byte array does not affect the newly created object.
+ *
+ * @param sender the sender of the message
+ * @param recipient the recipient of the message
+ * @param message the DER encoded KRB_CRED message
+ * @throws NullPointerException if any of sender, recipient
+ * or message is null
+ */
+ public KerberosCredMessage(KerberosPrincipal sender,
+ KerberosPrincipal recipient,
+ byte[] message) {
+ this.sender = Objects.requireNonNull(sender);
+ this.recipient = Objects.requireNonNull(recipient);
+ this.message = Objects.requireNonNull(message).clone();
+ }
+
+ /**
+ * Returns the DER encoded form of the KRB_CRED message.
+ *
+ * @return a newly allocated byte array that contains the encoded form
+ * @throws IllegalStateException if the object is destroyed
+ */
+ public byte[] getEncoded() {
+ if (destroyed) {
+ throw new IllegalStateException("This object is no longer valid");
+ }
+ return message.clone();
+ }
+
+ /**
+ * Returns the sender of this message.
+ *
+ * @return the sender
+ * @throws IllegalStateException if the object is destroyed
+ */
+ public KerberosPrincipal getSender() {
+ if (destroyed) {
+ throw new IllegalStateException("This object is no longer valid");
+ }
+ return sender;
+ }
+
+ /**
+ * Returns the recipient of this message.
+ *
+ * @return the recipient
+ * @throws IllegalStateException if the object is destroyed
+ */
+ public KerberosPrincipal getRecipient() {
+ if (destroyed) {
+ throw new IllegalStateException("This object is no longer valid");
+ }
+ return recipient;
+ }
+
+ /**
+ * Destroys this object by clearing out the message.
+ */
+ @Override
+ public void destroy() {
+ if (!destroyed) {
+ Arrays.fill(message, (byte)0);
+ destroyed = true;
+ }
+ }
+
+ @Override
+ public boolean isDestroyed() {
+ return destroyed;
+ }
+
+ @Override
+ public String toString() {
+ if (destroyed) {
+ return "Destroyed KerberosCredMessage";
+ } else {
+ return "KRB_CRED from " + sender + " to " + recipient + ":\n"
+ + Base64.getUrlEncoder().encodeToString(message);
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ if (isDestroyed()) {
+ return -1;
+ } else {
+ return Objects.hash(sender, recipient, Arrays.hashCode(message));
+ }
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other == this) {
+ return true;
+ }
+
+ if (! (other instanceof KerberosCredMessage)) {
+ return false;
+ }
+
+ KerberosCredMessage otherMessage = ((KerberosCredMessage) other);
+ if (isDestroyed() || otherMessage.isDestroyed()) {
+ return false;
+ }
+
+ return Objects.equals(sender, otherMessage.sender)
+ && Objects.equals(recipient, otherMessage.recipient)
+ && Arrays.equals(message, otherMessage.message);
+ }
+}
--- a/jdk/src/share/classes/javax/security/auth/kerberos/KerberosKey.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/src/share/classes/javax/security/auth/kerberos/KerberosKey.java Mon Jul 21 09:04:24 2014 -0700
@@ -27,13 +27,27 @@
import java.util.Arrays;
import javax.crypto.SecretKey;
-import javax.security.auth.Destroyable;
import javax.security.auth.DestroyFailedException;
/**
* This class encapsulates a long term secret key for a Kerberos
* principal.<p>
*
+ * A {@code KerberosKey} object includes an EncryptionKey, a
+ * {@link KerberosPrincipal} as its owner, and the version number
+ * of the key.<p>
+ *
+ * An EncryptionKey is defined in Section 4.2.9 of the Kerberos Protocol
+ * Specification (<a href=http://www.ietf.org/rfc/rfc4120.txt>RFC 4120</a>) as:
+ * <pre>
+ * EncryptionKey ::= SEQUENCE {
+ * keytype [0] Int32 -- actually encryption type --,
+ * keyvalue [1] OCTET STRING
+ * }
+ * </pre>
+ * The key material of a {@code KerberosKey} is defined as the value
+ * of the {@code keyValue} above.<p>
+ *
* All Kerberos JAAS login modules that obtain a principal's password and
* generate the secret key from it should use this class.
* Sometimes, such as when authenticating a server in
@@ -70,7 +84,7 @@
* @author Mayank Upadhyay
* @since 1.4
*/
-public class KerberosKey implements SecretKey, Destroyable {
+public class KerberosKey implements SecretKey {
private static final long serialVersionUID = -4625402278148246993L;
@@ -89,15 +103,8 @@
private final int versionNum;
/**
- * {@code KeyImpl} is serialized by writing out the ASN1 Encoded bytes
+ * {@code KeyImpl} is serialized by writing out the ASN.1 encoded bytes
* of the encryption key.
- * The ASN1 encoding is defined in RFC4120 and as follows:
- * <pre>
- * EncryptionKey ::= SEQUENCE {
- * keytype [0] Int32 -- actually encryption type --,
- * keyvalue [1] OCTET STRING
- * }
- * </pre>
*
* @serial
*/
@@ -111,7 +118,7 @@
* key information from a Kerberos "keytab".
*
* @param principal the principal that this secret key belongs to
- * @param keyBytes the raw bytes for the secret key
+ * @param keyBytes the key material for the secret key
* @param keyType the key type for the secret key as defined by the
* Kerberos protocol specification.
* @param versionNum the version number of this secret key
@@ -153,10 +160,12 @@
* Returns the principal that this key belongs to.
*
* @return the principal this key belongs to.
+ * @throws IllegalStateException if the key is destroyed
*/
public final KerberosPrincipal getPrincipal() {
- if (destroyed)
+ if (destroyed) {
throw new IllegalStateException("This key is no longer valid");
+ }
return principal;
}
@@ -164,10 +173,12 @@
* Returns the key version number.
*
* @return the key version number.
+ * @throws IllegalStateException if the key is destroyed
*/
public final int getVersionNumber() {
- if (destroyed)
+ if (destroyed) {
throw new IllegalStateException("This key is no longer valid");
+ }
return versionNum;
}
@@ -175,10 +186,10 @@
* Returns the key type for this long-term key.
*
* @return the key type.
+ * @throws IllegalStateException if the key is destroyed
*/
public final int getKeyType() {
- if (destroyed)
- throw new IllegalStateException("This key is no longer valid");
+ // KeyImpl already checked if destroyed
return key.getKeyType();
}
@@ -201,10 +212,10 @@
* </ol>
*
* @return the name of the algorithm associated with this key.
+ * @throws IllegalStateException if the key is destroyed
*/
public final String getAlgorithm() {
- if (destroyed)
- throw new IllegalStateException("This key is no longer valid");
+ // KeyImpl already checked if destroyed
return key.getAlgorithm();
}
@@ -212,10 +223,10 @@
* Returns the name of the encoding format for this secret key.
*
* @return the String "RAW"
+ * @throws IllegalStateException if the key is destroyed
*/
public final String getFormat() {
- if (destroyed)
- throw new IllegalStateException("This key is no longer valid");
+ // KeyImpl already checked if destroyed
return key.getFormat();
}
@@ -223,16 +234,15 @@
* Returns the key material of this secret key.
*
* @return the key material
+ * @throws IllegalStateException if the key is destroyed
*/
public final byte[] getEncoded() {
- if (destroyed)
- throw new IllegalStateException("This key is no longer valid");
+ // KeyImpl already checked if destroyed
return key.getEncoded();
}
/**
- * Destroys this key. A call to any of its other methods after this
- * will cause an IllegalStateException to be thrown.
+ * Destroys this key by clearing out the key material of this secret key.
*
* @throws DestroyFailedException if some error occurs while destorying
* this key.
@@ -253,9 +263,9 @@
public String toString() {
if (destroyed) {
- return "Destroyed Principal";
+ return "Destroyed KerberosKey";
}
- return "Kerberos Principal " + principal.toString() +
+ return "Kerberos Principal " + principal +
"Key Version " + versionNum +
"key " + key.toString();
}
@@ -293,8 +303,9 @@
*/
public boolean equals(Object other) {
- if (other == this)
+ if (other == this) {
return true;
+ }
if (! (other instanceof KerberosKey)) {
return false;
--- a/jdk/src/share/classes/javax/security/auth/kerberos/KerberosTicket.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/src/share/classes/javax/security/auth/kerberos/KerberosTicket.java Mon Jul 21 09:04:24 2014 -0700
@@ -35,9 +35,6 @@
import javax.security.auth.RefreshFailedException;
import javax.security.auth.DestroyFailedException;
import sun.misc.HexDumpEncoder;
-import sun.security.krb5.EncryptionKey;
-import sun.security.krb5.Asn1Exception;
-import sun.security.util.*;
/**
* This class encapsulates a Kerberos ticket and associated
@@ -253,9 +250,10 @@
Date endTime,
Date renewTill,
InetAddress[] clientAddresses) {
- if (sessionKey == null)
- throw new IllegalArgumentException("Session key for ticket"
- + " cannot be null");
+ if (sessionKey == null) {
+ throw new IllegalArgumentException("Session key for ticket"
+ + " cannot be null");
+ }
init(asn1Encoding, client, server,
new KeyImpl(sessionKey, keyType), flags, authTime,
startTime, endTime, renewTill, clientAddresses);
@@ -271,41 +269,46 @@
Date endTime,
Date renewTill,
InetAddress[] clientAddresses) {
- if (asn1Encoding == null)
- throw new IllegalArgumentException("ASN.1 encoding of ticket"
- + " cannot be null");
+ if (asn1Encoding == null) {
+ throw new IllegalArgumentException("ASN.1 encoding of ticket"
+ + " cannot be null");
+ }
this.asn1Encoding = asn1Encoding.clone();
- if (client == null)
- throw new IllegalArgumentException("Client name in ticket"
- + " cannot be null");
+ if (client == null) {
+ throw new IllegalArgumentException("Client name in ticket"
+ + " cannot be null");
+ }
this.client = client;
- if (server == null)
- throw new IllegalArgumentException("Server name in ticket"
- + " cannot be null");
+ if (server == null) {
+ throw new IllegalArgumentException("Server name in ticket"
+ + " cannot be null");
+ }
this.server = server;
// Caller needs to make sure `sessionKey` will not be null
this.sessionKey = sessionKey;
if (flags != null) {
- if (flags.length >= NUM_FLAGS)
- this.flags = flags.clone();
- else {
+ if (flags.length >= NUM_FLAGS) {
+ this.flags = flags.clone();
+ } else {
this.flags = new boolean[NUM_FLAGS];
// Fill in whatever we have
- for (int i = 0; i < flags.length; i++)
+ for (int i = 0; i < flags.length; i++) {
this.flags[i] = flags[i];
+ }
}
- } else
- this.flags = new boolean[NUM_FLAGS];
+ } else {
+ this.flags = new boolean[NUM_FLAGS];
+ }
if (this.flags[RENEWABLE_TICKET_FLAG]) {
- if (renewTill == null)
- throw new IllegalArgumentException("The renewable period "
+ if (renewTill == null) {
+ throw new IllegalArgumentException("The renewable period "
+ "end time cannot be null for renewable tickets.");
-
+ }
this.renewTill = new Date(renewTill.getTime());
}
@@ -318,13 +321,15 @@
this.startTime = this.authTime;
}
- if (endTime == null)
- throw new IllegalArgumentException("End time for ticket validity"
- + " cannot be null");
+ if (endTime == null) {
+ throw new IllegalArgumentException("End time for ticket validity"
+ + " cannot be null");
+ }
this.endTime = new Date(endTime.getTime());
- if (clientAddresses != null)
- this.clientAddresses = clientAddresses.clone();
+ if (clientAddresses != null) {
+ this.clientAddresses = clientAddresses.clone();
+ }
}
/**
@@ -346,14 +351,17 @@
}
/**
- * Returns the session key associated with this ticket.
+ * Returns the session key associated with this ticket. The return value
+ * is always a {@link EncryptionKey} object.
*
* @return the session key.
*/
public final SecretKey getSessionKey() {
- if (destroyed)
+ if (destroyed) {
throw new IllegalStateException("This ticket is no longer valid");
- return sessionKey;
+ }
+ return new EncryptionKey(
+ sessionKey.getEncoded(), sessionKey.getKeyType());
}
/**
@@ -366,8 +374,9 @@
* @see #getSessionKey()
*/
public final int getSessionKeyType() {
- if (destroyed)
+ if (destroyed) {
throw new IllegalStateException("This ticket is no longer valid");
+ }
return sessionKey.getKeyType();
}
@@ -508,8 +517,9 @@
* @return an ASN.1 encoding of the entire ticket.
*/
public final byte[] getEncoded() {
- if (destroyed)
+ if (destroyed) {
throw new IllegalStateException("This ticket is no longer valid");
+ }
return asn1Encoding.clone();
}
@@ -539,16 +549,17 @@
*/
public void refresh() throws RefreshFailedException {
- if (destroyed)
+ if (destroyed) {
throw new RefreshFailedException("A destroyed ticket "
- + "cannot be renewd.");
-
- if (!isRenewable())
+ + "cannot be renewd.");
+ }
+ if (!isRenewable()) {
throw new RefreshFailedException("This ticket is not renewable");
-
- if (System.currentTimeMillis() > getRenewTill().getTime())
+ }
+ if (System.currentTimeMillis() > getRenewTill().getTime()) {
throw new RefreshFailedException("This ticket is past "
- + "its last renewal time.");
+ + "its last renewal time.");
+ }
Throwable e = null;
sun.security.krb5.Credentials krb5Creds = null;
@@ -634,8 +645,9 @@
}
public String toString() {
- if (destroyed)
- throw new IllegalStateException("This ticket is no longer valid");
+ if (destroyed) {
+ return "Destroyed KerberosTicket";
+ }
StringBuilder caddrString = new StringBuilder();
if (clientAddresses != null) {
for (int i = 0; i < clientAddresses.length; i++) {
@@ -715,8 +727,9 @@
*/
public boolean equals(Object other) {
- if (other == this)
+ if (other == this) {
return true;
+ }
if (! (other instanceof KerberosTicket)) {
return false;
@@ -731,7 +744,7 @@
!endTime.equals(otherTicket.getEndTime()) ||
!server.equals(otherTicket.getServer()) ||
!client.equals(otherTicket.getClient()) ||
- !sessionKey.equals(otherTicket.getSessionKey()) ||
+ !sessionKey.equals(otherTicket.sessionKey) ||
!Arrays.equals(clientAddresses, otherTicket.getClientAddresses()) ||
!Arrays.equals(flags, otherTicket.getFlags())) {
return false;
@@ -739,35 +752,41 @@
// authTime may be null
if (authTime == null) {
- if (otherTicket.getAuthTime() != null)
+ if (otherTicket.getAuthTime() != null) {
return false;
+ }
} else {
- if (!authTime.equals(otherTicket.getAuthTime()))
+ if (!authTime.equals(otherTicket.getAuthTime())) {
return false;
+ }
}
// startTime may be null
if (startTime == null) {
- if (otherTicket.getStartTime() != null)
+ if (otherTicket.getStartTime() != null) {
return false;
+ }
} else {
- if (!startTime.equals(otherTicket.getStartTime()))
+ if (!startTime.equals(otherTicket.getStartTime())) {
return false;
+ }
}
if (renewTill == null) {
- if (otherTicket.getRenewTill() != null)
+ if (otherTicket.getRenewTill() != null) {
return false;
+ }
} else {
- if (!renewTill.equals(otherTicket.getRenewTill()))
+ if (!renewTill.equals(otherTicket.getRenewTill())) {
return false;
+ }
}
return true;
}
private void readObject(ObjectInputStream s)
- throws IOException, ClassNotFoundException {
+ throws IOException, ClassNotFoundException {
s.defaultReadObject();
if (sessionKey == null) {
throw new InvalidObjectException("Session key cannot be null");
--- a/jdk/src/share/classes/sun/misc/JavaLangAccess.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/src/share/classes/sun/misc/JavaLangAccess.java Mon Jul 21 09:04:24 2014 -0700
@@ -132,4 +132,14 @@
* Invokes the finalize method of the given object.
*/
void invokeFinalize(Object o) throws Throwable;
+
+ /**
+ * Invokes Long.formatUnsignedLong(long val, int shift, char[] buf, int offset, int len)
+ */
+ void formatUnsignedLong(long val, int shift, char[] buf, int offset, int len);
+
+ /**
+ * Invokes Integer.formatUnsignedInt(long val, int shift, char[] buf, int offset, int len)
+ */
+ void formatUnsignedInt(int val, int shift, char[] buf, int offset, int len);
}
--- a/jdk/src/share/classes/sun/nio/cs/ext/ExtendedCharsets.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/src/share/classes/sun/nio/cs/ext/ExtendedCharsets.java Mon Jul 21 09:04:24 2014 -0700
@@ -1173,8 +1173,7 @@
if (!sun.misc.VM.isBooted())
return;
- String map = AccessController.doPrivileged(
- (PrivilegedAction<String>) () -> System.getProperty("sun.nio.cs.map"));
+ String map = getProperty("sun.nio.cs.map");
boolean sjisIsMS932 = false;
boolean iso2022jpIsMS50221 = false;
boolean iso2022jpIsMS50220 = false;
@@ -1294,8 +1293,7 @@
}
}
- String osName = AccessController.doPrivileged(
- (PrivilegedAction<String>) () -> System.getProperty("os.name"));
+ String osName = getProperty("os.name");
if ("SunOS".equals(osName) || "Linux".equals(osName) || "AIX".equals(osName)
|| osName.contains("OS X")) {
charset("x-COMPOUND_TEXT", "COMPOUND_TEXT",
@@ -1308,6 +1306,18 @@
initialized = true;
}
+ private static String getProperty(String key) {
+ // this method may be called during initialization of
+ // system class loader and thus not using lambda
+ return AccessController.doPrivileged(
+ new PrivilegedAction<String>() {
+ @Override
+ public String run() {
+ return System.getProperty(key);
+ }
+ });
+ }
+
public static String[] aliasesFor(String charsetName) {
if (instance == null)
return null;
--- a/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Context.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Context.java Mon Jul 21 09:04:24 2014 -0700
@@ -40,11 +40,13 @@
import java.security.AccessController;
import java.security.AccessControlContext;
import java.security.Key;
+import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
-import java.security.PrivilegedActionException;
-import javax.crypto.Cipher;
import javax.security.auth.Subject;
-import javax.security.auth.kerberos.*;
+import javax.security.auth.kerberos.ServicePermission;
+import javax.security.auth.kerberos.KerberosCredMessage;
+import javax.security.auth.kerberos.KerberosPrincipal;
+import javax.security.auth.kerberos.KerberosTicket;
import sun.security.krb5.internal.Ticket;
/**
@@ -118,6 +120,7 @@
// XXX See if the required info from these can be extracted and
// stored elsewhere
+ private Credentials tgt;
private Credentials serviceCreds;
private KrbApReq apReq;
Ticket serviceTicket;
@@ -616,7 +619,6 @@
"No TGT available");
}
myName = (Krb5NameElement) myCred.getName();
- Credentials tgt;
final Krb5ProxyCredential second;
if (myCred instanceof Krb5InitCredential) {
second = null;
@@ -750,7 +752,6 @@
// No need to write anything;
// just validate the incoming token
new AcceptSecContextToken(this, serviceCreds, apReq, is);
- serviceCreds = null;
apReq = null;
state = STATE_DONE;
} else {
@@ -1304,6 +1305,9 @@
public final void dispose() throws GSSException {
state = STATE_DELETED;
delegatedCred = null;
+ tgt = null;
+ serviceCreds = null;
+ key = null;
}
public final Provider getProvider() {
@@ -1424,6 +1428,9 @@
switch (type) {
case KRB5_GET_SESSION_KEY:
return new KerberosSessionKey(key);
+ case KRB5_GET_SESSION_KEY_EX:
+ return new javax.security.auth.kerberos.EncryptionKey(
+ key.getBytes(), key.getEType());
case KRB5_GET_TKT_FLAGS:
return tktFlags.clone();
case KRB5_GET_AUTHZ_DATA:
@@ -1435,6 +1442,26 @@
}
case KRB5_GET_AUTHTIME:
return authTime;
+ case KRB5_GET_KRB_CRED:
+ if (!isInitiator()) {
+ throw new GSSException(GSSException.UNAVAILABLE, -1,
+ "KRB_CRED not available on acceptor side.");
+ }
+ KerberosPrincipal sender = new KerberosPrincipal(
+ myName.getKrb5PrincipalName().getName());
+ KerberosPrincipal recipient = new KerberosPrincipal(
+ peerName.getKrb5PrincipalName().getName());
+ try {
+ byte[] krbCred = new KrbCred(tgt, serviceCreds, key)
+ .getMessage();
+ return new KerberosCredMessage(
+ sender, recipient, krbCred);
+ } catch (KrbException | IOException e) {
+ GSSException gsse = new GSSException(GSSException.UNAVAILABLE, -1,
+ "KRB_CRED not generated correctly.");
+ gsse.initCause(e);
+ throw gsse;
+ }
}
throw new GSSException(GSSException.UNAVAILABLE, -1,
"Inquire type not supported.");
@@ -1456,4 +1483,5 @@
public void setAuthzData(com.sun.security.jgss.AuthorizationDataEntry[] authzData) {
this.authzData = authzData;
}
+
}
--- a/jdk/src/share/classes/sun/security/jgss/krb5/Krb5InitCredential.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/src/share/classes/sun/security/jgss/krb5/Krb5InitCredential.java Mon Jul 21 09:04:24 2014 -0700
@@ -29,8 +29,8 @@
import sun.security.jgss.GSSCaller;
import sun.security.jgss.spi.*;
import sun.security.krb5.*;
-import sun.security.krb5.Config;
-import javax.security.auth.kerberos.*;
+import javax.security.auth.kerberos.KerberosTicket;
+import javax.security.auth.kerberos.KerberosPrincipal;
import java.net.InetAddress;
import java.io.IOException;
import java.util.Date;
--- a/jdk/src/share/classes/sun/text/normalizer/UnicodeSet.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/src/share/classes/sun/text/normalizer/UnicodeSet.java Mon Jul 21 09:04:24 2014 -0700
@@ -367,6 +367,7 @@
* copied to this object
* @stable ICU 2.0
*/
+ @SuppressWarnings("unchecked") // Casting result of clone of a collection
public UnicodeSet set(UnicodeSet other) {
list = other.list.clone();
len = other.len;
--- a/jdk/src/windows/native/sun/tools/attach/WindowsVirtualMachine.c Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/src/windows/native/sun/tools/attach/WindowsVirtualMachine.c Mon Jul 21 09:04:24 2014 -0700
@@ -388,6 +388,7 @@
if (argsLen > 0) {
if (argsLen > MAX_ARGS) {
JNU_ThrowInternalError(env, "Too many arguments");
+ return;
}
for (i=0; i<argsLen; i++) {
jobject obj = (*env)->GetObjectArrayElement(env, args, i);
@@ -423,6 +424,8 @@
stubLen = (DWORD)(*env)->GetArrayLength(env, stub);
stubCode = (*env)->GetByteArrayElements(env, stub, &isCopy);
+ if ((*env)->ExceptionOccurred(env)) return;
+
pCode = (PDWORD) VirtualAllocEx( hProcess, 0, stubLen, MEM_COMMIT, PAGE_EXECUTE_READWRITE );
if (pCode == NULL) {
JNU_ThrowIOExceptionWithLastError(env, "VirtualAllocEx failed");
@@ -592,6 +595,8 @@
cstr[0] = '\0';
} else {
str = JNU_GetStringPlatformChars(env, jstr, &isCopy);
+ if ((*env)->ExceptionOccurred(env)) return;
+
strncpy(cstr, str, len);
cstr[len-1] = '\0';
if (isCopy) {
--- a/jdk/test/java/lang/Integer/ParsingTest.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/test/java/lang/Integer/ParsingTest.java Mon Jul 21 09:04:24 2014 -0700
@@ -23,29 +23,37 @@
/*
* @test
- * @bug 5017980 6576055
+ * @bug 5017980 6576055 8041972
* @summary Test parsing methods
* @author Joseph D. Darcy
*/
+import java.lang.IllegalArgumentException;
+import java.lang.IndexOutOfBoundsException;
+import java.lang.NullPointerException;
+import java.lang.RuntimeException;
/**
- * There are six methods in java.lang.Integer which transform strings
+ * There are eight methods in java.lang.Integer which transform strings
* into an int or Integer value:
*
* public Integer(String s)
* public static Integer decode(String nm)
+ * public static int parseInt(CharSequence s, int radix, int beginIndex, int endIndex)
+ * public static int parseInt(CharSequence s, int radix, int beginIndex)
* public static int parseInt(String s, int radix)
* public static int parseInt(String s)
* public static Integer valueOf(String s, int radix)
* public static Integer valueOf(String s)
*
* Besides decode, all the methods and constructor call down into
- * parseInt(String, int) to do the actual work. Therefore, the
- * behavior of parseInt(String, int) will be tested here.
+ * parseInt(CharSequence, int, int, int) to do the actual work. Therefore, the
+ * behavior of parseInt(CharSequence, int, int, int) will be tested here.
+ *
*/
public class ParsingTest {
+
public static void main(String... argv) {
check("+100", +100);
check("-100", -100);
@@ -55,10 +63,14 @@
check("+00000", 0);
check("-00000", 0);
+ check("+00000", 0, 0, 6);
+ check("-00000", 0, 0, 6);
+
check("0", 0);
check("1", 1);
check("9", 9);
+ checkFailure("");
checkFailure("\u0000");
checkFailure("\u002f");
checkFailure("+");
@@ -72,12 +84,45 @@
checkFailure("+-6");
checkFailure("-+6");
checkFailure("*100");
+
+ check("test-00000", 0, 4, 10);
+ check("test-12345", -12345, 4, 10);
+ check("xx12345yy", 12345, 2, 7);
+
+ checkNumberFormatException("", 10, 0);
+ checkNumberFormatException("100", 10, 3);
+ checkNumberFormatException("+1000000", 10, 8);
+ checkNumberFormatException("-1000000", 10, 8);
+
+ checkNumberFormatException("", 10, 0, 0);
+ checkNumberFormatException("+-6", 10, 0, 3);
+ checkNumberFormatException("1000000", 10, 7);
+ checkNumberFormatException("1000000", 10, 7, 7);
+ checkNumberFormatException("1000000", Character.MAX_RADIX + 1, 0, 2);
+ checkNumberFormatException("1000000", Character.MIN_RADIX - 1, 0, 2);
+
+ checkIndexOutOfBoundsException("1000000", 10, 8);
+ checkIndexOutOfBoundsException("1000000", 10, -1);
+ checkIndexOutOfBoundsException("1000000", 10, 10, 4);
+ checkIndexOutOfBoundsException("1000000", Character.MAX_RADIX + 1, -1, 2);
+ checkIndexOutOfBoundsException("1000000", Character.MIN_RADIX - 1, -1, 2);
+ checkIndexOutOfBoundsException("1000000", Character.MAX_RADIX + 1, 10, 2);
+ checkIndexOutOfBoundsException("1000000", Character.MIN_RADIX - 1, 10, 2);
+ checkIndexOutOfBoundsException("-1", 10, 0, 3);
+ checkIndexOutOfBoundsException("-1", 10, 2, 3);
+ checkIndexOutOfBoundsException("-1", 10, -1, 2);
+
+ checkNull(10, 0, 1);
+ checkNull(10, -1, 0);
+ checkNull(10, 0, 0);
+ checkNull(10, 0, -1);
+ checkNull(-1, -1, -1);
}
private static void check(String val, int expected) {
int n = Integer.parseInt(val);
if (n != expected)
- throw new RuntimeException("Integer.parsedInt failed. String:" +
+ throw new RuntimeException("Integer.parseInt failed. String:" +
val + " Result:" + n);
}
@@ -91,4 +136,71 @@
; // Expected
}
}
+
+ private static void checkNumberFormatException(String val, int radix, int start) {
+ int n = 0;
+ try {
+ n = Integer.parseInt(val, radix, start);
+ System.err.println("parseInt(" + val + ", " + radix + ", " + start +
+ ") incorrectly returned " + n);
+ throw new RuntimeException();
+ } catch (NumberFormatException nfe) {
+ ; // Expected
+ }
+ }
+
+ private static void checkNumberFormatException(String val, int radix, int start, int end) {
+ int n = 0;
+ try {
+ n = Integer.parseInt(val, radix, start, end);
+ System.err.println("parseInt(" + val + ", " + radix + ", " + start + ", " + end +
+ ") incorrectly returned " + n);
+ throw new RuntimeException();
+ } catch (NumberFormatException nfe) {
+ ; // Expected
+ }
+ }
+
+ private static void checkIndexOutOfBoundsException(String val, int radix, int start) {
+ int n = 0;
+ try {
+ n = Integer.parseInt(val, radix, start);
+ System.err.println("parseInt(" + val + ", " + radix + ", " + start +
+ ") incorrectly returned " + n);
+ throw new RuntimeException();
+ } catch (IndexOutOfBoundsException ioob) {
+ ; // Expected
+ }
+ }
+
+ private static void checkIndexOutOfBoundsException(String val, int radix, int start, int end) {
+ int n = 0;
+ try {
+ n = Integer.parseInt(val, radix, start, end);
+ System.err.println("parseInt(" + val + ", " + radix + ", " + start + ", " + end +
+ ") incorrectly returned " + n);
+ throw new RuntimeException();
+ } catch (IndexOutOfBoundsException ioob) {
+ ; // Expected
+ }
+ }
+
+ private static void checkNull(int radix, int start, int end) {
+ int n = 0;
+ try {
+ n = Integer.parseInt(null, 10, start, end);
+ System.err.println("parseInt(null, " + radix + ", " + start + ", " + end +
+ ") incorrectly returned " + n);
+ throw new RuntimeException();
+ } catch (NullPointerException npe) {
+ ; // Expected
+ }
+ }
+
+ private static void check(String val, int expected, int start, int end) {
+ int n = Integer.parseInt(val, 10, start, end);
+ if (n != expected)
+ throw new RuntimeException("Integer.parsedInt failed. String:" +
+ val + ", start: " + start + ", end: " + end + " Result:" + n);
+ }
}
--- a/jdk/test/java/lang/Long/ParsingTest.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/test/java/lang/Long/ParsingTest.java Mon Jul 21 09:04:24 2014 -0700
@@ -23,29 +23,31 @@
/*
* @test
- * @bug 5017980 6576055
+ * @bug 5017980 6576055 8041972
* @summary Test parsing methods
* @author Joseph D. Darcy
*/
-
/**
- * There are six methods in java.lang.Long which transform strings
+ * There are eight methods in java.lang.Long which transform strings
* into a long or Long value:
*
* public Long(String s)
* public static Long decode(String nm)
+ * public static long parseLong(CharSequence s, int radix, int beginIndex, int endIndex)
+ * public static long parseLong(CharSequence s, int radix, int beginIndex)
* public static long parseLong(String s, int radix)
* public static long parseLong(String s)
* public static Long valueOf(String s, int radix)
* public static Long valueOf(String s)
*
* Besides decode, all the methods and constructor call down into
- * parseLong(String, int) to do the actual work. Therefore, the
- * behavior of parseLong(String, int) will be tested here.
+ * parseLong(CharSequence, int, int, int) to do the actual work. Therefore, the
+ * behavior of parseLong(CharSequence, int, int, int) will be tested here.
*/
public class ParsingTest {
+
public static void main(String... argv) {
check("+100", +100L);
check("-100", -100L);
@@ -59,6 +61,7 @@
check("1", 1L);
check("9", 9L);
+ checkFailure("");
checkFailure("\u0000");
checkFailure("\u002f");
checkFailure("+");
@@ -72,12 +75,44 @@
checkFailure("+-6");
checkFailure("-+6");
checkFailure("*100");
+
+ check("test-00000", 0L, 4, 10);
+ check("test-12345", -12345L, 4, 10);
+ check("xx12345yy", 12345L, 2, 7);
+ check("xx123456789012345yy", 123456789012345L, 2, 17);
+
+ checkNumberFormatException("100", 10, 3);
+ checkNumberFormatException("", 10, 0);
+ checkNumberFormatException("+1000000", 10, 8);
+ checkNumberFormatException("-1000000", 10, 8);
+
+ checkNumberFormatException("", 10, 0, 0);
+ checkNumberFormatException("+-6", 10, 0, 3);
+ checkNumberFormatException("1000000", 10, 7, 7);
+ checkNumberFormatException("1000000", Character.MAX_RADIX + 1, 0, 2);
+ checkNumberFormatException("1000000", Character.MIN_RADIX - 1, 0, 2);
+
+ checkIndexOutOfBoundsException("", 10, 1, 1);
+ checkIndexOutOfBoundsException("1000000", 10, 10, 4);
+ checkIndexOutOfBoundsException("1000000", Character.MAX_RADIX + 1, 10, 2);
+ checkIndexOutOfBoundsException("1000000", Character.MIN_RADIX - 1, 10, 2);
+ checkIndexOutOfBoundsException("1000000", Character.MAX_RADIX + 1, -1, 2);
+ checkIndexOutOfBoundsException("1000000", Character.MIN_RADIX - 1, -1, 2);
+ checkIndexOutOfBoundsException("-1", 10, 0, 3);
+ checkIndexOutOfBoundsException("-1", 10, 2, 3);
+ checkIndexOutOfBoundsException("-1", 10, -1, 2);
+
+ checkNull(10, 0, 1);
+ checkNull(10, -1, 0);
+ checkNull(10, 0, 0);
+ checkNull(10, 0, -1);
+ checkNull(-1, -1, -1);
}
private static void check(String val, long expected) {
long n = Long.parseLong(val);
if (n != expected)
- throw new RuntimeException("Long.parsedLong failed. String:" +
+ throw new RuntimeException("Long.parseLong failed. String:" +
val + " Result:" + n);
}
@@ -91,4 +126,71 @@
; // Expected
}
}
+
+ private static void checkNumberFormatException(String val, int radix, int start) {
+ int n = 0;
+ try {
+ n = Integer.parseInt(val, radix, start);
+ System.err.println("parseInt(" + val + ", " + radix + ", " + start +
+ ") incorrectly returned " + n);
+ throw new RuntimeException();
+ } catch (NumberFormatException nfe) {
+ ; // Expected
+ }
+ }
+
+ private static void checkNumberFormatException(String val, int radix, int start, int end) {
+ long n = 0;
+ try {
+ n = Long.parseLong(val, radix, start, end);
+ System.err.println("parseInt(" + val + ", " + radix + ", " + start + ", " + end +
+ ") incorrectly returned " + n);
+ throw new RuntimeException();
+ } catch (NumberFormatException nfe) {
+ ; // Expected
+ }
+ }
+
+ private static void checkIndexOutOfBoundsException(String val, int radix, int start) {
+ int n = 0;
+ try {
+ n = Integer.parseInt(val, radix, start);
+ System.err.println("parseInt(" + val + ", " + radix + ", " + start +
+ ") incorrectly returned " + n);
+ throw new RuntimeException();
+ } catch (IndexOutOfBoundsException ioob) {
+ ; // Expected
+ }
+ }
+
+ private static void checkIndexOutOfBoundsException(String val, int radix, int start, int end) {
+ long n = 0;
+ try {
+ n = Long.parseLong(val, radix, start, end);
+ System.err.println("parseInt(" + val + ", " + radix + ", " + start + ", " + end +
+ ") incorrectly returned " + n);
+ throw new RuntimeException();
+ } catch (IndexOutOfBoundsException ioob) {
+ ; // Expected
+ }
+ }
+
+ private static void checkNull(int radix, int start, int end) {
+ long n = 0;
+ try {
+ n = Long.parseLong(null, 10, start, end);
+ System.err.println("parseInt(null, " + radix + ", " + start + ", " + end +
+ ") incorrectly returned " + n);
+ throw new RuntimeException();
+ } catch (NullPointerException npe) {
+ ; // Expected
+ }
+ }
+
+ private static void check(String val, long expected, int start, int end) {
+ long n = Long.parseLong(val, 10, start, end);
+ if (n != expected)
+ throw new RuntimeException("Long.parseLong failed. String:" +
+ val + ", start: " + start + ", end: " + end + " Result:" + n);
+ }
}
--- a/jdk/test/java/lang/String/ToLowerCase.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/test/java/lang/String/ToLowerCase.java Mon Jul 21 09:04:24 2014 -0700
@@ -23,7 +23,7 @@
/*
@test
- @bug 4217441 4533872 4900935 8020037 8032012 8041791
+ @bug 4217441 4533872 4900935 8020037 8032012 8041791 8042589
@summary toLowerCase should lower-case Greek Sigma correctly depending
on the context (final/non-final). Also it should handle
Locale specific (lt, tr, and az) lowercasings and supplementary
@@ -106,6 +106,12 @@
// invalid code point tests:
test("\uD800\uD800\uD801A\uDC00\uDC00\uDC00B", Locale.US, "\uD800\uD800\uD801a\uDC00\uDC00\uDC00b");
+ // lower/uppercase + surrogates
+ test("a\uD801\uDC1c", Locale.ROOT, "a\uD801\uDC44");
+ test("A\uD801\uDC1c", Locale.ROOT, "a\uD801\uDC44");
+ test("a\uD801\uDC00\uD801\uDC01\uD801\uDC02", Locale.US, "a\uD801\uDC28\uD801\uDC29\uD801\uDC2A");
+ test("A\uD801\uDC00\uD801\uDC01\uD801\uDC02", Locale.US, "a\uD801\uDC28\uD801\uDC29\uD801\uDC2A");
+
// test bmp + supp1
StringBuilder src = new StringBuilder(0x20000);
StringBuilder exp = new StringBuilder(0x20000);
--- a/jdk/test/java/lang/String/ToUpperCase.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/test/java/lang/String/ToUpperCase.java Mon Jul 21 09:04:24 2014 -0700
@@ -23,7 +23,7 @@
/*
@test
- @bug 4219630 4304573 4533872 4900935
+ @bug 4219630 4304573 4533872 4900935 8042589
@summary toUpperCase should upper-case German sharp s correctly even if
it's the only character in the string. should also uppercase
all of the 1:M char mappings correctly. Also it should handle
@@ -91,6 +91,12 @@
test("\uD801\uDC28a\uD801\uDC29b\uD801\uDC2Ac", Locale.US, "\uD801\uDC00A\uD801\uDC01B\uD801\uDC02C");
// invalid code point tests:
test("\uD800\uD800\uD801a\uDC00\uDC00\uDC00b", Locale.US, "\uD800\uD800\uD801A\uDC00\uDC00\uDC00B");
+
+ // lower/uppercase + surrogates
+ test("a\uD801\uDC44", Locale.ROOT, "A\uD801\uDC1c");
+ test("A\uD801\uDC44", Locale.ROOT, "A\uD801\uDC1c");
+ test("a\uD801\uDC28\uD801\uDC29\uD801\uDC2A", Locale.US, "A\uD801\uDC00\uD801\uDC01\uD801\uDC02");
+ test("A\uD801\uDC28a\uD801\uDC29b\uD801\uDC2Ac", Locale.US, "A\uD801\uDC00A\uD801\uDC01B\uD801\uDC02C");
}
static void test(String in, Locale locale, String expected) {
--- a/jdk/test/java/net/MulticastSocket/TestInterfaces.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/test/java/net/MulticastSocket/TestInterfaces.java Mon Jul 21 09:04:24 2014 -0700
@@ -28,6 +28,8 @@
* same InetAddress set by MulticastSocket.setInterface
*/
import java.net.*;
+import java.util.Arrays;
+import java.util.Collections;
import java.util.Enumeration;
import java.io.IOException;
@@ -47,6 +49,7 @@
/*
* Test MulticastSocket.getInterface
*/
+ System.out.println("Testing network interface " + ni);
Enumeration addrs = ni.getInetAddresses();
while (addrs.hasMoreElements()) {
InetAddress ia = (InetAddress)addrs.nextElement();
@@ -64,6 +67,8 @@
InetAddress curr = soc.getInterface();
if (!curr.equals(ia)) {
+ System.err.println("NetworkInterface under test " + ni);
+ displayInterfaceInformation(ni);
System.err.println("MulticastSocket.getInterface returned: " + curr);
System.err.println("Failed! Expected: " + ia);
failures++;
@@ -96,6 +101,10 @@
if (!curr.equals(ni)) {
System.err.println("MulticastSocket.getNetworkInterface returned: " + curr);
System.err.println("Failed! Expected: " + ni);
+ System.err.println("NetworkInterface details for curr variable ");
+ displayInterfaceInformation(curr);
+ System.err.println("NetworkInterface details for ni variable ");
+ displayInterfaceInformation(ni) ;
failures++;
} else {
System.out.println("Passed.");
@@ -110,4 +119,23 @@
}
+ static void displayInterfaceInformation(NetworkInterface netint) throws SocketException {
+ System.err.println("Display name: " + netint.getDisplayName());
+ System.err.println("Name: " + netint.getName());
+ Enumeration<InetAddress> inetAddresses = netint.getInetAddresses();
+
+ for (InetAddress inetAddress : Collections.list(inetAddresses))
+ System.err.println("InetAddress: " + inetAddress);
+
+ System.err.println("Up? " + netint.isUp());
+ System.err.println("Loopback? " + netint.isLoopback());
+ System.err.println("PointToPoint? " + netint.isPointToPoint());
+ System.err.println("Supports multicast? " + netint.supportsMulticast());
+ System.err.println("Virtual? " + netint.isVirtual());
+ System.err.println("Hardware address: " +
+ Arrays.toString(netint.getHardwareAddress()));
+ System.err.println("MTU: " + netint.getMTU());
+ System.err.println("Index: " + netint.getIndex());
+ System.err.println();
+ }
}
--- a/jdk/test/javax/security/auth/kerberos/KerberosHashEqualsTest.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/test/javax/security/auth/kerberos/KerberosHashEqualsTest.java Mon Jul 21 09:04:24 2014 -0700
@@ -33,9 +33,7 @@
import java.net.InetAddress;
import java.util.Date;
-import javax.security.auth.kerberos.KerberosKey;
-import javax.security.auth.kerberos.KerberosPrincipal;
-import javax.security.auth.kerberos.KerberosTicket;
+import javax.security.auth.kerberos.*;
public class KerberosHashEqualsTest {
public static void main(String[] args) throws Exception {
@@ -66,28 +64,67 @@
k2.destroy();
checkNotSame(k1, k2);
-
- // destroyed keys doesn't equal to each other
checkNotSame(k2, k1);
checkSame(k2, k2);
+ k1.destroy();
+ checkNotSame(k1, k2);
+
+ // Destroyed key has string and hashCode
+ k1.toString(); k1.hashCode();
+
// a little different
+ k1 = new KerberosKey(newKP("A"), "pass".getBytes(), 1, 1);
k2 = new KerberosKey(newKP("B"), "pass".getBytes(), 1, 1);
checkNotSame(k1, k2);
+
k2 = new KerberosKey(newKP("A"), "ssap".getBytes(), 1, 1);
checkNotSame(k1, k2);
+
k2 = new KerberosKey(newKP("A"), "pass".getBytes(), 2, 1);
checkNotSame(k1, k2);
+
k2 = new KerberosKey(newKP("A"), "pass".getBytes(), 1, 2);
checkNotSame(k1, k2);
+ // Null
k1 = new KerberosKey(null, "pass".getBytes(), 1, 2);
checkNotSame(k1, k2); // null to non-null
k2 = new KerberosKey(null, "pass".getBytes(), 1, 2);
checkSame(k1, k2); // null to null
+ // Even key with null principal has a string and hashCode
+ k1.toString(); k1.hashCode();
+
checkNotSame(k1, "Another Object");
+ EncryptionKey e1, e2;
+ e1 = new EncryptionKey("pass".getBytes(), 1);
+ e2 = new EncryptionKey("pass".getBytes(), 1);
+ checkSame(e1, e1); // me to me
+ checkSame(e1, e2); // same
+
+ e2.destroy();
+ checkNotSame(e1, e2);
+ checkNotSame(e2, e1);
+ checkSame(e2, e2);
+
+ e1.destroy();
+ checkNotSame(e1, e2);
+
+ // Destroyed key has string and hashCode
+ e1.toString(); e1.hashCode();
+
+ // a little different
+ e1 = new EncryptionKey("pass".getBytes(), 1);
+ e2 = new EncryptionKey("ssap".getBytes(), 1);
+ checkNotSame(e1, e2);
+
+ e2 = new EncryptionKey("pass".getBytes(), 2);
+ checkNotSame(e1, e2);
+
+ checkNotSame(e1, "Another Object");
+
KerberosTicket t1, t2;
t1 = new KerberosTicket("asn1".getBytes(), newKP("client"), newKP("server"), "pass".getBytes(), 1, new boolean[] {true, true}, new Date(0), new Date(0), new Date(0), new Date(0), null);
t2 = new KerberosTicket("asn1".getBytes(), newKP("client"), newKP("server"), "pass".getBytes(), 1, new boolean[] {true, true}, new Date(0), new Date(0), new Date(0), new Date(0), null);
@@ -120,6 +157,7 @@
t2.destroy();
checkNotSame(t1, t2);
+ t2.hashCode(); t2.toString();
// destroyed tickets doesn't equal to each other
checkNotSame(t2, t1);
@@ -130,6 +168,37 @@
checkNotSame(t1, t2); // renewtill is useful
checkNotSame(t1, "Another Object");
+
+ KerberosCredMessage m1, m2;
+ m1 = new KerberosCredMessage(newKP("C"), newKP("S"), "message".getBytes());
+ m2 = new KerberosCredMessage(newKP("C"), newKP("S"), "message".getBytes());
+ checkSame(m1, m1); // me to me
+ checkSame(m1, m2); // same
+
+ m2.destroy();
+ checkNotSame(m1, m2);
+ checkNotSame(m2, m1);
+ checkSame(m2, m2);
+
+ m1.destroy();
+ checkNotSame(m1, m2);
+
+ // Destroyed message has string and hashCode
+ m1.toString(); m1.hashCode();
+
+ // a little different
+ m1 = new KerberosCredMessage(newKP("C"), newKP("S"), "message".getBytes());
+ m2 = new KerberosCredMessage(newKP("A"), newKP("S"), "message".getBytes());
+ checkNotSame(m1, m2);
+
+ m2 = new KerberosCredMessage(newKP("C"), newKP("B"), "message".getBytes());
+ checkNotSame(m1, m2);
+
+ m1 = new KerberosCredMessage(newKP("C"), newKP("S"), "hello".getBytes());
+ checkNotSame(m1, m2);
+
+ checkNotSame(m1, "Another Object");
+
System.out.println("Good!");
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/security/auth/kerberos/KerberosNullsAndDestroyTest.java Mon Jul 21 09:04:24 2014 -0700
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2014, 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 8043071
+ * @summary Expose session key and KRB_CRED through extended GSS-API
+ */
+
+import javax.security.auth.kerberos.*;
+import java.util.function.Supplier;
+
+public class KerberosNullsAndDestroyTest {
+
+ public static void main(String[] args) throws Exception {
+
+ KerberosPrincipal c = new KerberosPrincipal("me@HERE");
+ KerberosPrincipal s = new KerberosPrincipal("you@THERE");
+
+ // These object constructions should throw NullPointerException
+ checkNPE(() -> new KerberosKey(c, null, 17, 1));
+ checkNPE(() -> new EncryptionKey(null, 17));
+ checkNPE(() -> new KerberosCredMessage(null, s, new byte[1]));
+ checkNPE(() -> new KerberosCredMessage(c, null, new byte[1]));
+ checkNPE(() -> new KerberosCredMessage(c, s, null));
+
+ KerberosKey k1 = new KerberosKey(c, new byte[16], 17, 1);
+ EncryptionKey k2 = new EncryptionKey(new byte[16], 17);
+ KerberosCredMessage m = new KerberosCredMessage(c, s, new byte[1]);
+
+ // These get calls should throw IllegalStateException
+ k1.destroy();
+ checkISE(() -> k1.getAlgorithm());
+ checkISE(() -> k1.getEncoded());
+ checkISE(() -> k1.getFormat());
+ checkISE(() -> k1.getKeyType());
+ checkISE(() -> k1.getPrincipal());
+ checkISE(() -> k1.getVersionNumber());
+
+ k2.destroy();
+ checkISE(() -> k2.getAlgorithm());
+ checkISE(() -> k2.getEncoded());
+ checkISE(() -> k2.getFormat());
+ checkISE(() -> k2.getKeyType());
+
+ m.destroy();
+ checkISE(() -> m.getSender());
+ checkISE(() -> m.getRecipient());
+ checkISE(() -> m.getEncoded());
+ }
+
+ static void checkNPE(Supplier<?> f) throws Exception {
+ check(f, NullPointerException.class);
+ }
+
+ static void checkISE(Supplier<?> f) throws Exception {
+ check(f, IllegalStateException.class);
+ }
+
+ static void check(Supplier<?> f, Class<? extends Exception> type) throws Exception {
+ try {
+ f.get();
+ } catch (Exception e) {
+ if (e.getClass() != type) {
+ throw e;
+ } else {
+ return;
+ }
+ }
+ throw new Exception("Should fail");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/validation/8049514/FeaturePropagationTest.java Mon Jul 21 09:04:24 2014 -0700
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 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
+ * 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 8049514
+ * @summary verifies that feature set on the factory is propagated properly
+ * to the validator
+ * @run main/othervm FeaturePropagationTest
+ */
+
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStreamReader;
+import javax.xml.XMLConstants;
+import javax.xml.transform.stream.StreamSource;
+import javax.xml.validation.*;
+
+/**
+ * JDK-8049514
+ *
+ * FEATURE_SECURE_PROCESSING can not be turned off on a validator through
+ * SchemaFactory
+ */
+public class FeaturePropagationTest {
+
+ static String xsd = "<?xml version='1.0'?>\n" + "<schema xmlns='http://www.w3.org/2001/XMLSchema'\n"
+ + " xmlns:test='jaxp13_test'\n"
+ + " targetNamespace='jaxp13_test'\n"
+ + " elementFormDefault='qualified'>\n"
+ + " <element name='test' type='string'/>\n"
+ + "</schema>\n";
+
+ public static void main(String[] args) throws Exception {
+ InputStreamReader reader = new InputStreamReader(new ByteArrayInputStream(xsd.getBytes()));
+ StreamSource xsdSource = new StreamSource(reader);
+
+ SchemaFactory schemaFactory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
+ schemaFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, false);
+ Schema schema = null;
+ schema = schemaFactory.newSchema(xsdSource);
+
+ Validator validator = schema.newValidator();
+
+ if (validator.getFeature(XMLConstants.FEATURE_SECURE_PROCESSING)) {
+ throw new RuntimeException("Feature set on the factory is not inherited!");
+ }
+
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/misc/JavaLangAccess/FormatUnsigned.java Mon Jul 21 09:04:24 2014 -0700
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2012, 2014, 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.
+ */
+
+import sun.misc.JavaLangAccess;
+import sun.misc.SharedSecrets;
+
+/*
+ * @test
+ * @summary Test JavaLangAccess.formatUnsignedInt/-Long
+ * @bug 8050114
+ */
+public class FormatUnsigned {
+
+ static final JavaLangAccess jla = SharedSecrets.getJavaLangAccess();
+
+ public static void testFormatUnsignedInt() {
+ testFormatUnsignedInt("7fffffff", Integer.MAX_VALUE, 8, 4, 0, 8);
+ testFormatUnsignedInt("80000000", Integer.MIN_VALUE, 8, 4, 0, 8);
+ testFormatUnsignedInt("4711", 04711, 4, 3, 0, 4);
+ testFormatUnsignedInt("4711", 0x4711, 4, 4, 0, 4);
+ testFormatUnsignedInt("1010", 0b1010, 4, 1, 0, 4);
+ testFormatUnsignedInt("00001010", 0b1010, 8, 1, 0, 8);
+ testFormatUnsignedInt("\u0000\u000000001010", 0b1010, 10, 1, 2, 8);
+ }
+
+ public static void testFormatUnsignedLong() {
+ testFormatUnsignedLong("7fffffffffffffff", Long.MAX_VALUE, 16, 4, 0, 16);
+ testFormatUnsignedLong("8000000000000000", Long.MIN_VALUE, 16, 4, 0, 16);
+ testFormatUnsignedLong("4711", 04711L, 4, 3, 0, 4);
+ testFormatUnsignedLong("4711", 0x4711L, 4, 4, 0, 4);
+ testFormatUnsignedLong("1010", 0b1010L, 4, 1, 0, 4);
+ testFormatUnsignedLong("00001010", 0b1010L, 8, 1, 0, 8);
+ testFormatUnsignedLong("\u0000\u000000001010", 0b1010L, 10, 1, 2, 8);
+ }
+
+ public static void testFormatUnsignedInt(String expected, int value, int arraySize, int shift, int offset, int length) {
+ char[] chars = new char[arraySize];
+ jla.formatUnsignedInt(value, shift, chars, offset, length);
+ String s = new String(chars);
+ if (!expected.equals(s)) {
+ throw new Error(s + " should be equal to expected " + expected);
+ }
+ }
+
+ public static void testFormatUnsignedLong(String expected, long value, int arraySize, int shift, int offset, int length) {
+ char[] chars = new char[arraySize];
+ jla.formatUnsignedLong(value, shift, chars, offset, length);
+ String s = new String(chars);
+ if (!expected.equals(s)) {
+ throw new Error(s + " should be equal to expected " + expected);
+ }
+ }
+
+ public static void main(String[] args) {
+ testFormatUnsignedInt();
+ testFormatUnsignedLong();
+ }
+}
--- a/jdk/test/sun/security/krb5/auto/Context.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/test/sun/security/krb5/auto/Context.java Mon Jul 21 09:04:24 2014 -0700
@@ -26,9 +26,11 @@
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
import java.util.Arrays;
+import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import javax.security.auth.Subject;
+import javax.security.auth.kerberos.KerberosCredMessage;
import javax.security.auth.kerberos.KerberosKey;
import javax.security.auth.kerberos.KerberosTicket;
import javax.security.auth.login.LoginContext;
@@ -86,7 +88,6 @@
/**
* Using the delegated credentials from a previous acceptor
- * @param c
*/
public Context delegated() throws Exception {
Context out = new Context();
@@ -177,7 +178,6 @@
/**
* Logins with username/keytab as an existing Subject. The
* same subject can be used multiple times to simulate multiple logins.
- * @param s existing subject
*/
public static Context fromUserKtab(
String user, String ktab, boolean storeKey) throws Exception {
@@ -411,6 +411,12 @@
Key k = (Key)ex.inquireSecContext(
InquireType.KRB5_GET_SESSION_KEY);
if (k == null) {
+ throw new Exception("(Old) Session key cannot be null");
+ }
+ System.out.println("(Old) Session key is: " + k);
+ Key k2 = (Key)ex.inquireSecContext(
+ InquireType.KRB5_GET_SESSION_KEY_EX);
+ if (k2 == null) {
throw new Exception("Session key cannot be null");
}
System.out.println("Session key is: " + k);
@@ -431,6 +437,19 @@
InquireType.KRB5_GET_AUTHZ_DATA);
System.out.println("AuthzData is: " + Arrays.toString(ad));
}
+ try {
+ KerberosCredMessage tok = (KerberosCredMessage)ex.inquireSecContext(
+ InquireType.KRB5_GET_KRB_CRED);
+ System.out.println("KRB_CRED is " +
+ (tok == null?"not ":"") + "available");
+ if (tok != null) {
+ System.out.println("From " + tok.getSender() + " to "
+ + tok.getRecipient());
+ System.out.println(Base64.getEncoder().encodeToString(tok.getEncoded()));
+ }
+ } catch (Exception e) {
+ System.out.println("KRB_CRED is not available: " + e);
+ }
}
}
}
--- a/jdk/test/sun/security/krb5/auto/KerberosHashEqualsTest.java Mon Jul 21 18:10:13 2014 +0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,174 +0,0 @@
-/*
- * Copyright (c) 2005, 2011, 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 4641821
- * @run main/othervm KerberosHashEqualsTest
- * @summary hashCode() and equals() for KerberosKey and KerberosTicket
- */
-
-import java.net.InetAddress;
-import java.util.Date;
-import javax.security.auth.kerberos.KerberosKey;
-import javax.security.auth.kerberos.KerberosPrincipal;
-import javax.security.auth.kerberos.KerberosTicket;
-
-public class KerberosHashEqualsTest {
- public static void main(String[] args) throws Exception {
- new OneKDC(null);
- new KerberosHashEqualsTest().check();
- }
-
- void checkSame(Object o1, Object o2) {
- if(!o1.equals(o2)) {
- throw new RuntimeException("equals() fails");
- }
- if(o1.hashCode() != o2.hashCode()) {
- throw new RuntimeException("hashCode() not same");
- }
- }
-
- void checkNotSame(Object o1, Object o2) {
- if(o1.equals(o2)) {
- throw new RuntimeException("equals() succeeds");
- }
- }
-
- void check() throws Exception {
-
- // The key part:
- // new KerberosKey(principal, bytes, keyType, version)
-
- KerberosKey k1, k2;
- KerberosPrincipal CLIENT = new KerberosPrincipal("client");
- KerberosPrincipal SERVER = new KerberosPrincipal("server");
- byte[] PASS = "pass".getBytes();
-
- k1 = new KerberosKey(CLIENT, PASS, 1, 1);
- k2 = new KerberosKey(CLIENT, PASS, 1, 1);
- checkSame(k1, k1); // me is me
- checkSame(k1, k2); // same
-
- // A destroyed key doesn't equal to any key
- k2.destroy();
- checkNotSame(k1, k2);
- checkNotSame(k2, k1);
- k1.destroy();
- checkNotSame(k1, k2); // even if they are both destroyed
- checkNotSame(k2, k1);
- checkSame(k2, k2);
-
- // a little difference means not equal
- k1 = new KerberosKey(CLIENT, PASS, 1, 1);
- k2 = new KerberosKey(SERVER, PASS, 1, 1);
- checkNotSame(k1, k2); // Different principal name
-
- k2 = new KerberosKey(CLIENT, "ssap".getBytes(), 1, 1);
- checkNotSame(k1, k2); // Different password
-
- k2 = new KerberosKey(CLIENT, PASS, 2, 1);
- checkNotSame(k1, k2); // Different keytype
-
- k2 = new KerberosKey(CLIENT, PASS, 1, 2);
- checkNotSame(k1, k2); // Different version
-
- k2 = new KerberosKey(null, PASS, 1, 2);
- checkNotSame(k1, k2); // null is not non-null
-
- k1 = new KerberosKey(null, PASS, 1, 2);
- checkSame(k1, k2); // null is null
-
- checkNotSame(k1, "Another Object");
-
- // The ticket part:
- // new KerberosTicket(asn1 bytes, client, server, session key, type, flags,
- // auth, start, end, renewUntil times, address)
-
- KerberosTicket t1, t2;
-
- byte[] ASN1 = "asn1".getBytes();
- boolean[] FORWARDABLE = new boolean[] {true, true};
- boolean[] ALLTRUE = new boolean[] {true, true, true, true, true, true, true, true, true, true};
- Date D0 = new Date(0);
-
- t1 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, FORWARDABLE, D0, D0, D0, D0, null);
- t2 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, FORWARDABLE, D0, D0, D0, D0, null);
- checkSame(t1, t1);
- checkSame(t1, t2);
-
- // destroyed tickets doesn't equal to each other
- t1.destroy();
- checkNotSame(t1, t2);
- checkNotSame(t2, t1);
-
- t2.destroy();
- checkNotSame(t1, t2); // even if they are both destroyed
- checkNotSame(t2, t1);
-
- checkSame(t2, t2); // unless they are the same object
-
- // a little difference means not equal
- t1 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, FORWARDABLE, D0, D0, D0, D0, null);
- t2 = new KerberosTicket("asn11".getBytes(), CLIENT, SERVER, PASS, 1, FORWARDABLE, D0, D0, D0, D0, null);
- checkNotSame(t1, t2); // Different ASN1 encoding
-
- t2 = new KerberosTicket(ASN1, new KerberosPrincipal("client1"), SERVER, PASS, 1, FORWARDABLE, D0, D0, D0, D0, null);
- checkNotSame(t1, t2); // Different client
-
- t2 = new KerberosTicket(ASN1, CLIENT, new KerberosPrincipal("server1"), PASS, 1, FORWARDABLE, D0, D0, D0, D0, null);
- checkNotSame(t1, t2); // Different server
-
- t2 = new KerberosTicket(ASN1, CLIENT, SERVER, "pass1".getBytes(), 1, FORWARDABLE, D0, D0, D0, D0, null);
- checkNotSame(t1, t2); // Different session key
-
- t2 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 2, FORWARDABLE, D0, D0, D0, D0, null);
- checkNotSame(t1, t2); // Different key type
-
- t2 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, new boolean[] {true, false}, D0, D0, D0, D0, null);
- checkNotSame(t1, t2); // Different flags, not FORWARDABLE
-
- t2 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, FORWARDABLE, new Date(1), D0, D0, D0, null);
- checkNotSame(t1, t2); // Different authtime
-
- t2 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, FORWARDABLE, D0, new Date(1), D0, D0, null);
- checkNotSame(t1, t2); // Different starttime
-
- t2 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, FORWARDABLE, D0, D0, new Date(1), D0, null);
- checkNotSame(t1, t2); // Different endtime
-
- t2 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, FORWARDABLE, D0, D0, D0, D0, new InetAddress[2]);
- checkNotSame(t1, t2); // Different client addresses
-
- t2 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, FORWARDABLE, D0, D0, D0, new Date(1), null);
- t1 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, FORWARDABLE, D0, D0, D0, new Date(2), null);
- checkSame(t1, t2); // renewtill is ignored when RENEWABLE ticket flag is not set.
-
- t2 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, ALLTRUE, D0, D0, D0, new Date(1), null);
- t1 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, ALLTRUE, D0, D0, D0, new Date(2), null);
- checkNotSame(t1, t2); // renewtill is used when RENEWABLE is set.
-
- checkNotSame(t1, "Another Object");
- System.out.println("Good!");
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/krb5/auto/NewInquireTypes.java Mon Jul 21 09:04:24 2014 -0700
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2014, 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 8043071
+ * @summary Expose session key and KRB_CRED through extended GSS-API
+ * @compile -XDignore.symbol.file NewInquireTypes.java
+ * @run main/othervm NewInquireTypes
+ */
+
+import com.sun.security.jgss.InquireType;
+import sun.security.jgss.GSSUtil;
+import sun.security.krb5.internal.KRBCred;
+import sun.security.krb5.internal.crypto.KeyUsage;
+
+import javax.security.auth.kerberos.KerberosCredMessage;
+import javax.security.auth.kerberos.EncryptionKey;
+
+public class NewInquireTypes {
+
+ public static void main(String[] args) throws Exception {
+
+ new OneKDC(null).writeJAASConf();
+
+ Context c, s;
+ c = Context.fromJAAS("client");
+ s = Context.fromJAAS("server");
+
+ c.startAsClient(OneKDC.SERVER, GSSUtil.GSS_KRB5_MECH_OID);
+ s.startAsServer(GSSUtil.GSS_KRB5_MECH_OID);
+
+ Context.handshake(c, s);
+
+ EncryptionKey key = (EncryptionKey)
+ c.x().inquireSecContext(InquireType.KRB5_GET_SESSION_KEY_EX);
+ KerberosCredMessage cred = (KerberosCredMessage)
+ c.x().inquireSecContext(InquireType.KRB5_GET_KRB_CRED);
+
+ // Confirm the KRB_CRED message is encrypted with the session key.
+ new KRBCred(cred.getEncoded()).encPart.decrypt(
+ new sun.security.krb5.EncryptionKey(key.getKeyType(), key.getEncoded()),
+ KeyUsage.KU_ENC_KRB_CRED_PART);
+ }
+}
--- a/jdk/test/sun/security/smartcardio/TestAll.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/test/sun/security/smartcardio/TestAll.java Mon Jul 21 09:04:24 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, 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
@@ -26,7 +26,7 @@
// Because all the tests are marked @ignore as they require special hardware,
// we cannot use jtreg to do this.
-import java.lang.reflect.*;
+import java.lang.reflect.Method;
public class TestAll {
--- a/jdk/test/sun/security/smartcardio/TestChannel.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/test/sun/security/smartcardio/TestChannel.java Mon Jul 21 09:04:24 2014 -0700
@@ -31,10 +31,10 @@
// This test requires special hardware.
-import java.io.*;
-import java.util.*;
-
-import javax.smartcardio.*;
+import javax.smartcardio.Card;
+import javax.smartcardio.CardChannel;
+import javax.smartcardio.CardTerminal;
+import javax.smartcardio.CommandAPDU;
public class TestChannel extends Utils {
@@ -95,7 +95,7 @@
}
// disconnect
- card.disconnect(false);
+ card.disconnect(true);
System.out.println("OK.");
}
--- a/jdk/test/sun/security/smartcardio/TestConnect.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/test/sun/security/smartcardio/TestConnect.java Mon Jul 21 09:04:24 2014 -0700
@@ -31,10 +31,11 @@
// This test requires special hardware.
-import java.io.*;
-import java.util.*;
-
-import javax.smartcardio.*;
+import java.util.List;
+import javax.smartcardio.TerminalFactory;
+import javax.smartcardio.Card;
+import javax.smartcardio.CardChannel;
+import javax.smartcardio.CardTerminal;
public class TestConnect extends Utils {
@@ -63,7 +64,7 @@
throw new Exception("Not T=0 protocol");
}
transmit(card);
- card.disconnect(false);
+ card.disconnect(true);
try {
transmit(card);
@@ -96,7 +97,7 @@
throw new Exception("Not T=0 protocol");
}
transmit(card);
- card.disconnect(true);
+ card.disconnect(false);
card = terminal.connect("*");
System.out.println("card: " + card);
@@ -105,7 +106,6 @@
}
transmit(card);
card.disconnect(true);
- card.disconnect(true);
System.out.println("OK.");
}
--- a/jdk/test/sun/security/smartcardio/TestConnectAgain.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/test/sun/security/smartcardio/TestConnectAgain.java Mon Jul 21 09:04:24 2014 -0700
@@ -31,10 +31,10 @@
// This test requires special hardware.
-import java.io.*;
-import java.util.*;
-
-import javax.smartcardio.*;
+import javax.smartcardio.Card;
+import javax.smartcardio.CardException;
+import javax.smartcardio.CardChannel;
+import javax.smartcardio.CardTerminal;
public class TestConnectAgain extends Utils {
@@ -95,7 +95,7 @@
}
// disconnect
- card.disconnect(false);
+ card.disconnect(true);
System.out.println("OK.");
}
--- a/jdk/test/sun/security/smartcardio/TestControl.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/test/sun/security/smartcardio/TestControl.java Mon Jul 21 09:04:24 2014 -0700
@@ -31,10 +31,9 @@
// This test requires special hardware.
-import java.io.*;
-import java.util.*;
-
-import javax.smartcardio.*;
+import javax.smartcardio.Card;
+import javax.smartcardio.CardException;
+import javax.smartcardio.CardTerminal;
public class TestControl extends Utils {
@@ -68,7 +67,7 @@
}
// disconnect
- card.disconnect(false);
+ card.disconnect(true);
System.out.println("OK.");
}
--- a/jdk/test/sun/security/smartcardio/TestDefault.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/test/sun/security/smartcardio/TestDefault.java Mon Jul 21 09:04:24 2014 -0700
@@ -31,10 +31,9 @@
// This test requires special hardware.
-import java.io.*;
-import java.util.*;
-
-import javax.smartcardio.*;
+import java.util.List;
+import javax.smartcardio.CardTerminal;
+import javax.smartcardio.TerminalFactory;
public class TestDefault {
--- a/jdk/test/sun/security/smartcardio/TestExclusive.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/test/sun/security/smartcardio/TestExclusive.java Mon Jul 21 09:04:24 2014 -0700
@@ -31,10 +31,11 @@
// This test requires special hardware.
-import java.io.*;
-import java.util.*;
-
-import javax.smartcardio.*;
+import javax.smartcardio.Card;
+import javax.smartcardio.CardChannel;
+import javax.smartcardio.CardException;
+import javax.smartcardio.CardTerminal;
+import javax.smartcardio.CommandAPDU;
public class TestExclusive extends Utils {
@@ -84,9 +85,9 @@
Thread.sleep(1000);
// disconnect
- card.disconnect(false);
+ card.disconnect(true);
- if (otherOK == false) {
+ if (! otherOK) {
throw new Exception("Secondary thread failed");
}
--- a/jdk/test/sun/security/smartcardio/TestMultiplePresent.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/test/sun/security/smartcardio/TestMultiplePresent.java Mon Jul 21 09:04:24 2014 -0700
@@ -31,10 +31,10 @@
// This test requires special hardware.
-import java.io.*;
-import java.util.*;
-
-import javax.smartcardio.*;
+import java.util.List;
+import javax.smartcardio.CardTerminal;
+import javax.smartcardio.CardTerminals;
+import javax.smartcardio.TerminalFactory;
import static javax.smartcardio.CardTerminals.State.*;
public class TestMultiplePresent {
--- a/jdk/test/sun/security/smartcardio/TestPresent.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/test/sun/security/smartcardio/TestPresent.java Mon Jul 21 09:04:24 2014 -0700
@@ -31,10 +31,9 @@
// This test requires special hardware.
-import java.io.*;
-import java.util.*;
-
-import javax.smartcardio.*;
+import java.util.List;
+import javax.smartcardio.CardTerminal;
+import javax.smartcardio.TerminalFactory;
public class TestPresent {
--- a/jdk/test/sun/security/smartcardio/TestTransmit.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/test/sun/security/smartcardio/TestTransmit.java Mon Jul 21 09:04:24 2014 -0700
@@ -31,10 +31,16 @@
// This test requires special hardware.
-import java.io.*;
-import java.util.*;
-
-import javax.smartcardio.*;
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.StringReader;
+import javax.smartcardio.Card;
+import javax.smartcardio.CardChannel;
+import javax.smartcardio.CardTerminal;
+import javax.smartcardio.CommandAPDU;
+import javax.smartcardio.ResponseAPDU;
public class TestTransmit extends Utils {
@@ -79,7 +85,7 @@
}
// disconnect
- card.disconnect(false);
+ card.disconnect(true);
System.out.println("OK.");
}
--- a/jdk/test/sun/security/smartcardio/Utils.java Mon Jul 21 18:10:13 2014 +0400
+++ b/jdk/test/sun/security/smartcardio/Utils.java Mon Jul 21 09:04:24 2014 -0700
@@ -24,10 +24,16 @@
// common utility functions for the PC/SC tests
-import javax.smartcardio.*;
-
-import java.io.*;
-import java.util.*;
+import java.io.StringReader;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import javax.smartcardio.CardTerminal;
+import javax.smartcardio.CardChannel;
+import javax.smartcardio.ResponseAPDU;
+import javax.smartcardio.CommandAPDU;
+import javax.smartcardio.TerminalFactory;
public class Utils {