提交 7a9bd002 编写于 作者: T tbell

Merge

......@@ -92,9 +92,9 @@ ABS_TEMP_DIR = $(ABS_OUTPUTDIR)/tmp
dummy := $(shell $(MKDIR) -p $(TEMP_DIR))
# The language version we want for this jdk build
SOURCE_LANGUAGE_VERSION=5
SOURCE_LANGUAGE_VERSION=7
# The class version we want for this jdk build
TARGET_CLASS_VERSION=5
TARGET_CLASS_VERSION=7
# The MESSAGE, WARNING and ERROR files are used to store sanity check and
# source check messages, warnings and errors.
......
......@@ -122,13 +122,13 @@ ifeq ($(JAVAC_WARNINGS_FATAL), true)
JAVACFLAGS += -Werror
endif
# Add the source level (currently all source is 1.5, should this be 1.6?)
SOURCE_LANGUAGE_VERSION = 5
# Add the source level
SOURCE_LANGUAGE_VERSION = 7
LANGUAGE_VERSION = -source $(SOURCE_LANGUAGE_VERSION)
JAVACFLAGS += $(LANGUAGE_VERSION)
# Add the class version we want (currently this is 5, should it be 6 or even 7?)
TARGET_CLASS_VERSION = 5
# Add the class version we want
TARGET_CLASS_VERSION = 7
CLASS_VERSION = -target $(TARGET_CLASS_VERSION)
JAVACFLAGS += $(CLASS_VERSION)
JAVACFLAGS += -encoding ascii
......
......@@ -33,8 +33,8 @@ AUTO_FILES_JAVA_DIRS = java/dyn sun/dyn
# The sources built here use new language syntax to generate
# method handle calls. Let's be sure we are using that format.
#LANGUAGE_VERSION = -source 7
#CLASS_VERSION = -target 7
LANGUAGE_VERSION = -source 7
CLASS_VERSION = -target 7
# Actually, it will be less disruptive to compile with the same
# -target option as the rest of the system, and just turn on
......
......@@ -93,9 +93,7 @@ final class Filter {
int filtOffset[] = new int[1];
for (filtOffset[0] = filterStart;
filtOffset[0] < filterEnd;
filtOffset[0]++) {
for (filtOffset[0] = filterStart; filtOffset[0] < filterEnd;) {
switch (filter[filtOffset[0]]) {
case '(':
filtOffset[0]++;
......@@ -104,18 +102,21 @@ final class Filter {
case '&':
encodeComplexFilter(ber, filter,
LDAP_FILTER_AND, filtOffset, filterEnd);
// filtOffset[0] has pointed to char after right paren
parens--;
break;
case '|':
encodeComplexFilter(ber, filter,
LDAP_FILTER_OR, filtOffset, filterEnd);
// filtOffset[0] has pointed to char after right paren
parens--;
break;
case '!':
encodeComplexFilter(ber, filter,
LDAP_FILTER_NOT, filtOffset, filterEnd);
// filtOffset[0] has pointed to char after right paren
parens--;
break;
......@@ -143,8 +144,8 @@ final class Filter {
encodeSimpleFilter(ber, filter, filtOffset[0], nextOffset);
// points to right parens; for loop will increment beyond parens
filtOffset[0] = nextOffset;
// points to the char after right paren.
filtOffset[0] = nextOffset + 1;
parens--;
break;
......@@ -170,9 +171,14 @@ final class Filter {
filtOffset[0] = filterEnd; // force break from outer
break;
}
if (parens < 0) {
throw new InvalidSearchFilterException(
"Unbalanced parenthesis");
}
}
if (parens > 0) {
if (parens != 0) {
throw new InvalidSearchFilterException("Unbalanced parenthesis");
}
......
......@@ -2784,8 +2784,13 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara
* @since 1.5
*/
public static int toCodePoint(char high, char low) {
return ((high - MIN_HIGH_SURROGATE) << 10)
+ (low - MIN_LOW_SURROGATE) + MIN_SUPPLEMENTARY_CODE_POINT;
// Optimized form of:
// return ((high - MIN_HIGH_SURROGATE) << 10)
// + (low - MIN_LOW_SURROGATE)
// + MIN_SUPPLEMENTARY_CODE_POINT;
return ((high << 10) + low) + (MIN_SUPPLEMENTARY_CODE_POINT
- (MIN_HIGH_SURROGATE << 10)
- MIN_LOW_SURROGATE);
}
/**
......@@ -3071,9 +3076,10 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara
}
static void toSurrogates(int codePoint, char[] dst, int index) {
int offset = codePoint - MIN_SUPPLEMENTARY_CODE_POINT;
dst[index+1] = (char)((offset & 0x3ff) + MIN_LOW_SURROGATE);
dst[index] = (char)((offset >>> 10) + MIN_HIGH_SURROGATE);
// We write elements "backwards" to guarantee all-or-nothing
dst[index+1] = (char)((codePoint & 0x3ff) + MIN_LOW_SURROGATE);
dst[index] = (char)((codePoint >>> 10)
+ (MIN_HIGH_SURROGATE - (MIN_SUPPLEMENTARY_CODE_POINT >>> 10)));
}
/**
......
......@@ -50,7 +50,7 @@ package java.lang;
* @see java.lang.ClassLoader#loadClass(java.lang.String, boolean)
* @since JDK1.0
*/
public class ClassNotFoundException extends Exception {
public class ClassNotFoundException extends ReflectiveOperationException {
/**
* use serialVersionUID from JDK 1.1.X for interoperability
*/
......
......@@ -529,6 +529,7 @@ public final class Double extends Number implements Comparable<Double> {
* @param s the string to be parsed.
* @return the {@code double} value represented by the string
* argument.
* @throws NullPointerException if the string is null
* @throws NumberFormatException if the string does not contain
* a parsable {@code double}.
* @see java.lang.Double#valueOf(String)
......
......@@ -438,12 +438,13 @@ public final class Float extends Number implements Comparable<Float> {
* represented by the specified {@code String}, as performed
* by the {@code valueOf} method of class {@code Float}.
*
* @param s the string to be parsed.
* @param s the string to be parsed.
* @return the {@code float} value represented by the string
* argument.
* @throws NumberFormatException if the string does not contain a
* @throws NullPointerException if the string is null
* @throws NumberFormatException if the string does not contain a
* parsable {@code float}.
* @see java.lang.Float#valueOf(String)
* @see java.lang.Float#valueOf(String)
* @since 1.2
*/
public static float parseFloat(String s) throws NumberFormatException {
......
......@@ -56,7 +56,7 @@ package java.lang;
* @see java.lang.reflect.Constructor#newInstance(Object[])
* @since JDK1.0
*/
public class IllegalAccessException extends Exception {
public class IllegalAccessException extends ReflectiveOperationException {
private static final long serialVersionUID = 6616958222490762034L;
/**
......
......@@ -43,7 +43,7 @@ package java.lang;
* @since JDK1.0
*/
public
class InstantiationException extends Exception {
class InstantiationException extends ReflectiveOperationException {
private static final long serialVersionUID = -8441929162975509110L;
/**
......
......@@ -31,7 +31,7 @@ package java.lang;
* @author unascribed
* @since JDK1.1
*/
public class NoSuchFieldException extends Exception {
public class NoSuchFieldException extends ReflectiveOperationException {
private static final long serialVersionUID = -6143714805279938260L;
/**
......
......@@ -32,7 +32,7 @@ package java.lang;
* @since JDK1.0
*/
public
class NoSuchMethodException extends Exception {
class NoSuchMethodException extends ReflectiveOperationException {
private static final long serialVersionUID = 5034388446362600923L;
/**
......
/*
* Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package java.lang;
/**
* Common superclass of exceptions thrown by reflective operations in
* core reflection.
*
* @see LinkageError
* @since 1.7
*/
public class ReflectiveOperationException extends Exception {
static final long serialVersionUID = 123456789L;
/**
* Constructs a new exception with {@code null} as its detail
* message. The cause is not initialized, and may subsequently be
* initialized by a call to {@link #initCause}.
*/
public ReflectiveOperationException() {
super();
}
/**
* Constructs a new exception with the specified detail message.
* The cause is not initialized, and may subsequently be
* initialized by a call to {@link #initCause}.
*
* @param message the detail message. The detail message is saved for
* later retrieval by the {@link #getMessage()} method.
*/
public ReflectiveOperationException(String message) {
super(message);
}
/**
* Constructs a new exception with the specified detail message
* and cause.
*
* <p>Note that the detail message associated with
* {@code cause} is <em>not</em> automatically incorporated in
* this exception's detail message.
*
* @param message the detail message (which is saved for later retrieval
* by the {@link #getMessage()} method).
* @param cause the cause (which is saved for later retrieval by the
* {@link #getCause()} method). (A {@code null} value is
* permitted, and indicates that the cause is nonexistent or
* unknown.)
*/
public ReflectiveOperationException(String message, Throwable cause) {
super(message, cause);
}
/**
* Constructs a new exception with the specified cause and a detail
* message of {@code (cause==null ? null : cause.toString())} (which
* typically contains the class and detail message of {@code cause}).
*
* @param cause the cause (which is saved for later retrieval by the
* {@link #getCause()} method). (A {@code null} value is
* permitted, and indicates that the cause is nonexistent or
* unknown.)
*/
public ReflectiveOperationException(Throwable cause) {
super(cause);
}
}
......@@ -39,7 +39,7 @@ package java.lang.reflect;
* @see Method
* @see Constructor
*/
public class InvocationTargetException extends Exception {
public class InvocationTargetException extends ReflectiveOperationException {
/**
* Use serialVersionUID from JDK 1.1.X for interoperability
*/
......
/*
* Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2002-2009 Sun Microsystems, Inc. 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
......@@ -46,7 +46,7 @@ class CertPathHelperImpl extends CertPathHelper {
/**
* Initialize the helper framework. This method must be called from
* the static initializer of each class that is the target of one of
* the methods in this class. This ensures that the helper if initialized
* the methods in this class. This ensures that the helper is initialized
* prior to a tunneled call from the Sun provider.
*/
synchronized static void initialize() {
......@@ -59,4 +59,8 @@ class CertPathHelperImpl extends CertPathHelper {
Set<GeneralNameInterface> names) {
sel.setPathToNamesInternal(names);
}
protected void implSetDateAndTime(X509CRLSelector sel, Date date, long skew) {
sel.setDateAndTime(date, skew);
}
}
/*
* Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2000-2009 Sun Microsystems, Inc. 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
......@@ -72,6 +72,10 @@ import sun.security.x509.X500Name;
*/
public class X509CRLSelector implements CRLSelector {
static {
CertPathHelperImpl.initialize();
}
private static final Debug debug = Debug.getInstance("certpath");
private HashSet<Object> issuerNames;
private HashSet<X500Principal> issuerX500Principals;
......@@ -79,6 +83,7 @@ public class X509CRLSelector implements CRLSelector {
private BigInteger maxCRL;
private Date dateAndTime;
private X509Certificate certChecking;
private long skew = 0;
/**
* Creates an <code>X509CRLSelector</code>. Initially, no criteria are set
......@@ -417,7 +422,18 @@ public class X509CRLSelector implements CRLSelector {
if (dateAndTime == null)
this.dateAndTime = null;
else
this.dateAndTime = (Date) dateAndTime.clone();
this.dateAndTime = new Date(dateAndTime.getTime());
this.skew = 0;
}
/**
* Sets the dateAndTime criterion and allows for the specified clock skew
* (in milliseconds) when checking against the validity period of the CRL.
*/
void setDateAndTime(Date dateAndTime, long skew) {
this.dateAndTime =
(dateAndTime == null ? null : new Date(dateAndTime.getTime()));
this.skew = skew;
}
/**
......@@ -657,8 +673,14 @@ public class X509CRLSelector implements CRLSelector {
}
return false;
}
if (crlThisUpdate.after(dateAndTime)
|| nextUpdate.before(dateAndTime)) {
Date nowPlusSkew = dateAndTime;
Date nowMinusSkew = dateAndTime;
if (skew > 0) {
nowPlusSkew = new Date(dateAndTime.getTime() + skew);
nowMinusSkew = new Date(dateAndTime.getTime() - skew);
}
if (nowMinusSkew.after(nextUpdate)
|| nowPlusSkew.before(crlThisUpdate)) {
if (debug != null) {
debug.println("X509CRLSelector.match: update out of range");
}
......
......@@ -338,7 +338,7 @@ public class LogManager {
// already been created with the given name it is returned.
// Otherwise a new logger instance is created and registered
// in the LogManager global namespace.
synchronized Logger demandLogger(String name) {
Logger demandLogger(String name) {
Logger result = getLogger(name);
if (result == null) {
result = new Logger(name, null);
......
......@@ -30,7 +30,6 @@ import java.nio.charset.CoderResult;
import java.nio.charset.MalformedInputException;
import java.nio.charset.UnmappableCharacterException;
/**
* Utility class for dealing with surrogates.
*
......@@ -41,19 +40,15 @@ public class Surrogate {
private Surrogate() { }
// UTF-16 surrogate-character ranges
//
public static final char MIN_HIGH = '\uD800';
public static final char MAX_HIGH = '\uDBFF';
public static final char MIN_LOW = '\uDC00';
public static final char MAX_LOW = '\uDFFF';
public static final char MIN = MIN_HIGH;
public static final char MAX = MAX_LOW;
// Range of UCS-4 values that need surrogates in UTF-16
//
public static final int UCS4_MIN = 0x10000;
public static final int UCS4_MAX = (1 << 20) + UCS4_MIN - 1;
// TODO: Deprecate/remove the following redundant definitions
public static final char MIN_HIGH = Character.MIN_HIGH_SURROGATE;
public static final char MAX_HIGH = Character.MAX_HIGH_SURROGATE;
public static final char MIN_LOW = Character.MIN_LOW_SURROGATE;
public static final char MAX_LOW = Character.MAX_LOW_SURROGATE;
public static final char MIN = Character.MIN_SURROGATE;
public static final char MAX = Character.MAX_SURROGATE;
public static final int UCS4_MIN = Character.MIN_SUPPLEMENTARY_CODE_POINT;
public static final int UCS4_MAX = Character.MAX_CODE_POINT;
/**
* Tells whether or not the given UTF-16 value is a high surrogate.
......@@ -76,36 +71,46 @@ public class Surrogate {
return (MIN <= c) && (c <= MAX);
}
/**
* Tells whether or not the given UCS-4 character is in the Basic
* Multilingual Plane, and can be represented using a single char.
*/
public static boolean isBMP(int uc) {
return (int) (char) uc == uc;
}
/**
* Tells whether or not the given UCS-4 character must be represented as a
* surrogate pair in UTF-16.
*/
public static boolean neededFor(int uc) {
return (uc >= UCS4_MIN) && (uc <= UCS4_MAX);
return Character.isSupplementaryCodePoint(uc);
}
/**
* Returns the high UTF-16 surrogate for the given UCS-4 character.
*/
public static char high(int uc) {
assert neededFor(uc);
return (char)(0xd800 | (((uc - UCS4_MIN) >> 10) & 0x3ff));
assert Character.isSupplementaryCodePoint(uc);
return (char)((uc >> 10)
+ (Character.MIN_HIGH_SURROGATE
- (Character.MIN_SUPPLEMENTARY_CODE_POINT >> 10)));
}
/**
* Returns the low UTF-16 surrogate for the given UCS-4 character.
*/
public static char low(int uc) {
assert neededFor(uc);
return (char)(0xdc00 | ((uc - UCS4_MIN) & 0x3ff));
assert Character.isSupplementaryCodePoint(uc);
return (char)((uc & 0x3ff) + Character.MIN_LOW_SURROGATE);
}
/**
* Converts the given surrogate pair into a 32-bit UCS-4 character.
*/
public static int toUCS4(char c, char d) {
assert isHigh(c) && isLow(d);
return (((c & 0x3ff) << 10) | (d & 0x3ff)) + 0x10000;
assert Character.isHighSurrogate(c) && Character.isLowSurrogate(d);
return Character.toCodePoint(c, d);
}
/**
......@@ -178,14 +183,14 @@ public class Surrogate {
* object
*/
public int parse(char c, CharBuffer in) {
if (Surrogate.isHigh(c)) {
if (Character.isHighSurrogate(c)) {
if (!in.hasRemaining()) {
error = CoderResult.UNDERFLOW;
return -1;
}
char d = in.get();
if (Surrogate.isLow(d)) {
character = toUCS4(c, d);
if (Character.isLowSurrogate(d)) {
character = Character.toCodePoint(c, d);
isPair = true;
error = null;
return character;
......@@ -193,7 +198,7 @@ public class Surrogate {
error = CoderResult.malformedForLength(1);
return -1;
}
if (Surrogate.isLow(c)) {
if (Character.isLowSurrogate(c)) {
error = CoderResult.malformedForLength(1);
return -1;
}
......@@ -220,14 +225,14 @@ public class Surrogate {
*/
public int parse(char c, char[] ia, int ip, int il) {
assert (ia[ip] == c);
if (Surrogate.isHigh(c)) {
if (Character.isHighSurrogate(c)) {
if (il - ip < 2) {
error = CoderResult.UNDERFLOW;
return -1;
}
char d = ia[ip + 1];
if (Surrogate.isLow(d)) {
character = toUCS4(c, d);
if (Character.isLowSurrogate(d)) {
character = Character.toCodePoint(c, d);
isPair = true;
error = null;
return character;
......@@ -235,7 +240,7 @@ public class Surrogate {
error = CoderResult.malformedForLength(1);
return -1;
}
if (Surrogate.isLow(c)) {
if (Character.isLowSurrogate(c)) {
error = CoderResult.malformedForLength(1);
return -1;
}
......@@ -282,7 +287,7 @@ public class Surrogate {
* error() will return a descriptive result object
*/
public int generate(int uc, int len, CharBuffer dst) {
if (uc <= 0xffff) {
if (Surrogate.isBMP(uc)) {
if (Surrogate.is(uc)) {
error = CoderResult.malformedForLength(len);
return -1;
......@@ -294,12 +299,7 @@ public class Surrogate {
dst.put((char)uc);
error = null;
return 1;
}
if (uc < Surrogate.UCS4_MIN) {
error = CoderResult.malformedForLength(len);
return -1;
}
if (uc <= Surrogate.UCS4_MAX) {
} else if (Character.isSupplementaryCodePoint(uc)) {
if (dst.remaining() < 2) {
error = CoderResult.OVERFLOW;
return -1;
......@@ -308,9 +308,10 @@ public class Surrogate {
dst.put(Surrogate.low(uc));
error = null;
return 2;
} else {
error = CoderResult.unmappableForLength(len);
return -1;
}
error = CoderResult.unmappableForLength(len);
return -1;
}
/**
......@@ -330,7 +331,7 @@ public class Surrogate {
* error() will return a descriptive result object
*/
public int generate(int uc, int len, char[] da, int dp, int dl) {
if (uc <= 0xffff) {
if (Surrogate.isBMP(uc)) {
if (Surrogate.is(uc)) {
error = CoderResult.malformedForLength(len);
return -1;
......@@ -342,12 +343,7 @@ public class Surrogate {
da[dp] = (char)uc;
error = null;
return 1;
}
if (uc < Surrogate.UCS4_MIN) {
error = CoderResult.malformedForLength(len);
return -1;
}
if (uc <= Surrogate.UCS4_MAX) {
} else if (Character.isSupplementaryCodePoint(uc)) {
if (dl - dp < 2) {
error = CoderResult.OVERFLOW;
return -1;
......@@ -356,11 +352,11 @@ public class Surrogate {
da[dp + 1] = Surrogate.low(uc);
error = null;
return 2;
} else {
error = CoderResult.unmappableForLength(len);
return -1;
}
error = CoderResult.unmappableForLength(len);
return -1;
}
}
}
......@@ -70,7 +70,12 @@ public class Config {
private static final int BASE16_1 = 16;
private static final int BASE16_2 = 16 * 16;
private static final int BASE16_3 = 16 * 16 * 16;
private String defaultRealm; // default kdc realm.
/**
* Specified by system properties. Must be both null or non-null.
*/
private final String defaultRealm;
private final String defaultKDC;
// used for native interface
private static native String getWindowsDirectory(boolean isSystem);
......@@ -81,9 +86,8 @@ public class Config {
* singleton) is returned.
*
* @exception KrbException if error occurs when constructing a Config
* instance. Possible causes would be configuration file not
* found, either of java.security.krb5.realm or java.security.krb5.kdc
* not specified, error reading configuration file.
* instance. Possible causes would be either of java.security.krb5.realm or
* java.security.krb5.kdc not specified, error reading configuration file.
*/
public static synchronized Config getInstance() throws KrbException {
if (singleton == null) {
......@@ -98,9 +102,8 @@ public class Config {
* the java.security.krb5.* system properties again.
*
* @exception KrbException if error occurs when constructing a Config
* instance. Possible causes would be configuration file not
* found, either of java.security.krb5.realm or java.security.krb5.kdc
* not specified, error reading configuration file.
* instance. Possible causes would be either of java.security.krb5.realm or
* java.security.krb5.kdc not specified, error reading configuration file.
*/
public static synchronized void refresh() throws KrbException {
......@@ -114,56 +117,37 @@ public class Config {
*/
private Config() throws KrbException {
/*
* If these two system properties are being specified by the user,
* we ignore configuration file. If either one system property is
* specified, we throw exception. If neither of them are specified,
* we load the information from configuration file.
* If either one system property is specified, we throw exception.
*/
String kdchost =
String tmp =
java.security.AccessController.doPrivileged(
new sun.security.action.GetPropertyAction
("java.security.krb5.kdc"));
if (tmp != null) {
// The user can specify a list of kdc hosts separated by ":"
defaultKDC = tmp.replace(':', ' ');
} else {
defaultKDC = null;
}
defaultRealm =
java.security.AccessController.doPrivileged(
new sun.security.action.GetPropertyAction
("java.security.krb5.realm"));
if ((kdchost == null && defaultRealm != null) ||
(defaultRealm == null && kdchost != null)) {
if ((defaultKDC == null && defaultRealm != null) ||
(defaultRealm == null && defaultKDC != null)) {
throw new KrbException
("System property java.security.krb5.kdc and " +
"java.security.krb5.realm both must be set or " +
"neither must be set.");
}
// Read the Kerberos configuration file
// Always read the Kerberos configuration file
try {
Vector<String> configFile;
configFile = loadConfigFile();
stanzaTable = parseStanzaTable(configFile);
} catch (IOException ioe) {
// No krb5.conf, no problem. We'll use DNS etc.
}
if (kdchost != null) {
/*
* If configuration information is only specified by
* properties java.security.krb5.kdc and
* java.security.krb5.realm, we put both in the hashtable
* under [libdefaults].
*/
if (stanzaTable == null) {
stanzaTable = new Hashtable<String,Object> ();
}
Hashtable<String,String> kdcs =
(Hashtable<String,String>)stanzaTable.get("libdefaults");
if (kdcs == null) {
kdcs = new Hashtable<String,String> ();
stanzaTable.put("libdefaults", kdcs);
}
kdcs.put("default_realm", defaultRealm);
// The user can specify a list of kdc hosts separated by ":"
kdchost = kdchost.replace(':', ' ');
kdcs.put("kdc", kdchost);
// No krb5.conf, no problem. We'll use DNS or system property etc.
}
}
......@@ -295,19 +279,6 @@ public class Config {
String result = null;
Hashtable subTable;
/*
* In the situation when kdc is specified by
* java.security.krb5.kdc, we get the kdc from [libdefaults] in
* hashtable.
*/
if (name.equalsIgnoreCase("kdc") &&
(section.equalsIgnoreCase(getDefault("default_realm", "libdefaults"))) &&
(java.security.AccessController.doPrivileged(
new sun.security.action.
GetPropertyAction("java.security.krb5.kdc")) != null)) {
result = getDefault("kdc", "libdefaults");
return result;
}
if (stanzaTable != null) {
for (Enumeration e = stanzaTable.keys(); e.hasMoreElements(); ) {
stanzaName = (String)e.nextElement();
......@@ -1035,13 +1006,13 @@ public class Config {
/**
* Resets the default kdc realm.
* We do not need to synchronize these methods since assignments are atomic
*
* This method was useless. Kept here in case some class still calls it.
*/
public void resetDefaultRealm(String realm) {
defaultRealm = realm;
if (DEBUG) {
System.out.println(">>> Config reset default kdc " + defaultRealm);
System.out.println(">>> Config try resetting default kdc " + realm);
}
}
/**
......@@ -1098,6 +1069,9 @@ public class Config {
* @return the default realm, always non null
*/
public String getDefaultRealm() throws KrbException {
if (defaultRealm != null) {
return defaultRealm;
}
Exception cause = null;
String realm = getDefault("default_realm", "libdefaults");
if ((realm == null) && useDNS_Realm()) {
......@@ -1142,6 +1116,9 @@ public class Config {
if (realm == null) {
realm = getDefaultRealm();
}
if (realm.equalsIgnoreCase(defaultRealm)) {
return defaultKDC;
}
Exception cause = null;
String kdcs = getDefault("kdc", realm);
if ((kdcs == null) && useDNS_KDC()) {
......@@ -1171,6 +1148,9 @@ public class Config {
});
}
if (kdcs == null) {
if (defaultKDC != null) {
return defaultKDC;
}
KrbException ke = new KrbException("Cannot locate KDC");
if (cause != null) {
ke.initCause(cause);
......
......@@ -294,8 +294,6 @@ public class KrbApReq {
apReqMessg.ticket.sname.setRealm(apReqMessg.ticket.realm);
enc_ticketPart.cname.setRealm(enc_ticketPart.crealm);
Config.getInstance().resetDefaultRealm(apReqMessg.ticket.realm.toString());
if (!authenticator.cname.equals(enc_ticketPart.cname))
throw new KrbApErrException(Krb5.KRB_AP_ERR_BADMATCH);
......
/*
* Portions Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved.
* Portions Copyright 2000-2009 Sun Microsystems, Inc. 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
......@@ -403,11 +403,11 @@ public class KeyTab implements KeyTabConstants {
/**
* Retrieves the key table entry with the specified service name.
* @param service the service which may have an entry in the key table.
* @param keyType the etype to match, returns the 1st one if -1 provided
* @return -1 if the entry is not found, else return the entry index
* in the list.
*/
private int retrieveEntry(PrincipalName service, int keyType) {
int found = -1;
KeyTabEntry e;
if (entries != null) {
for (int i = 0; i < entries.size(); i++) {
......@@ -418,7 +418,7 @@ public class KeyTab implements KeyTabConstants {
}
}
}
return found;
return -1;
}
/**
......@@ -476,12 +476,29 @@ public class KeyTab implements KeyTabConstants {
/**
* Removes an entry from the key table.
* @param service the service <code>PrincipalName</code>.
* @param etype the etype to match, first one if -1 provided
* @return 1 if removed successfully, 0 otherwise
*/
public void deleteEntry(PrincipalName service) {
int result = retrieveEntry(service, -1);
public int deleteEntry(PrincipalName service, int etype) {
int result = retrieveEntry(service, etype);
if (result != -1) {
entries.removeElementAt(result);
return 1;
}
return 0;
}
/**
* Removes an entry from the key table.
* @param service the service <code>PrincipalName</code>.
* @return number of entries removed
*/
public int deleteEntry(PrincipalName service) {
int count = 0;
while (deleteEntry(service, -1) > 0) {
count++;
}
return count;
}
/**
......
/*
* Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2002-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -25,9 +25,11 @@
package sun.security.provider.certpath;
import java.util.Date;
import java.util.Set;
import java.security.cert.X509CertSelector;
import java.security.cert.X509CRLSelector;
import sun.security.x509.GeneralNameInterface;
......@@ -55,8 +57,14 @@ public abstract class CertPathHelper {
protected abstract void implSetPathToNames(X509CertSelector sel,
Set<GeneralNameInterface> names);
protected abstract void implSetDateAndTime(X509CRLSelector sel, Date date, long skew);
static void setPathToNames(X509CertSelector sel,
Set<GeneralNameInterface> names) {
instance.implSetPathToNames(sel, names);
}
static void setDateAndTime(X509CRLSelector sel, Date date, long skew) {
instance.implSetDateAndTime(sel, date, skew);
}
}
/*
* Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2000-2009 Sun Microsystems, Inc. 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
......@@ -81,6 +81,10 @@ class CrlRevocationChecker extends PKIXCertPathChecker {
private static final boolean[] ALL_REASONS =
{true, true, true, true, true, true, true, true, true};
// Maximum clock skew in milliseconds (15 minutes) allowed when checking
// validity of CRLs
private static final long MAX_CLOCK_SKEW = 900000;
/**
* Creates a <code>CrlRevocationChecker</code>.
*
......@@ -281,7 +285,7 @@ class CrlRevocationChecker extends PKIXCertPathChecker {
try {
X509CRLSelector sel = new X509CRLSelector();
sel.setCertificateChecking(currCert);
sel.setDateAndTime(mCurrentTime);
CertPathHelper.setDateAndTime(sel, mCurrentTime, MAX_CLOCK_SKEW);
for (CertStore mStore : mStores) {
for (java.security.cert.CRL crl : mStore.getCRLs(sel)) {
......
......@@ -149,9 +149,9 @@ class OCSPResponse {
private SingleResponse singleResponse;
// Maximum clock skew in milliseconds (10 minutes) allowed when checking
// Maximum clock skew in milliseconds (15 minutes) allowed when checking
// validity of OCSP responses
private static final long MAX_CLOCK_SKEW = 600000;
private static final long MAX_CLOCK_SKEW = 900000;
// an array of all of the CRLReasons (used in SingleResponse)
private static CRLReason[] values = CRLReason.values();
......
......@@ -136,7 +136,7 @@ public class JarSigner {
char[] keypass; // private key password
String sigfile; // name of .SF file
String sigalg; // name of signature algorithm
String digestalg = "SHA1"; // name of digest algorithm
String digestalg = "SHA-256"; // name of digest algorithm
String signedjar; // output filename
String tsaUrl; // location of the Timestamping Authority
String tsaAlias; // alias for the Timestamping Authority's certificate
......@@ -2205,7 +2205,7 @@ class SignatureFile {
if (keyAlgorithm.equalsIgnoreCase("DSA"))
digestAlgorithm = "SHA1";
else if (keyAlgorithm.equalsIgnoreCase("RSA"))
digestAlgorithm = "SHA1";
digestAlgorithm = "SHA256";
else {
throw new RuntimeException("private key is not a DSA or "
+ "RSA key");
......
......@@ -1052,7 +1052,7 @@ public final class KeyTool {
X509CertImpl signerCertImpl = new X509CertImpl(encoded);
X509CertInfo signerCertInfo = (X509CertInfo)signerCertImpl.get(
X509CertImpl.NAME + "." + X509CertImpl.INFO);
X500Name owner = (X500Name)signerCertInfo.get(X509CertInfo.SUBJECT + "." +
X500Name issuer = (X500Name)signerCertInfo.get(X509CertInfo.SUBJECT + "." +
CertificateSubjectName.DN_NAME);
Date firstDate = getStartDate(startDate);
......@@ -1068,7 +1068,7 @@ public final class KeyTool {
Signature signature = Signature.getInstance(sigAlgName);
signature.initSign(privateKey);
X500Signer signer = new X500Signer(signature, owner);
X500Signer signer = new X500Signer(signature, issuer);
X509CertInfo info = new X509CertInfo();
info.set(X509CertInfo.VALIDITY, interval);
......@@ -1102,7 +1102,8 @@ public final class KeyTool {
PKCS10 req = new PKCS10(rawReq);
info.set(X509CertInfo.KEY, new CertificateX509Key(req.getSubjectPublicKeyInfo()));
info.set(X509CertInfo.SUBJECT, new CertificateSubjectName(req.getSubjectName()));
info.set(X509CertInfo.SUBJECT, new CertificateSubjectName(
dname==null?req.getSubjectName():new X500Name(dname)));
CertificateExtensions reqex = null;
Iterator<PKCS10Attribute> attrs = req.getAttributes().getAttributes().iterator();
while (attrs.hasNext()) {
......@@ -1160,8 +1161,9 @@ public final class KeyTool {
Signature signature = Signature.getInstance(sigAlgName);
signature.initSign(privKey);
X500Name subject =
new X500Name(((X509Certificate)cert).getSubjectDN().toString());
X500Name subject = dname == null?
new X500Name(((X509Certificate)cert).getSubjectDN().toString()):
new X500Name(dname);
X500Signer signer = new X500Signer(signature, subject);
// Sign the request and base-64 encode it
......@@ -1316,7 +1318,7 @@ public final class KeyTool {
if ("DSA".equalsIgnoreCase(keyAlgName)) {
return "SHA1WithDSA";
} else if ("RSA".equalsIgnoreCase(keyAlgName)) {
return "SHA1WithRSA";
return "SHA256WithRSA";
} else if ("EC".equalsIgnoreCase(keyAlgName)) {
return "SHA1withECDSA";
} else {
......@@ -1334,6 +1336,8 @@ public final class KeyTool {
if (keysize == -1) {
if ("EC".equalsIgnoreCase(keyAlgName)) {
keysize = 256;
} else if ("RSA".equalsIgnoreCase(keyAlgName)) {
keysize = 2048;
} else {
keysize = 1024;
}
......@@ -2497,6 +2501,7 @@ public final class KeyTool {
cert.getNotAfter().toString(),
getCertFingerPrint("MD5", cert),
getCertFingerPrint("SHA1", cert),
getCertFingerPrint("SHA-256", cert),
cert.getSigAlgName(),
cert.getVersion()
};
......@@ -3428,7 +3433,7 @@ public final class KeyTool {
int colonpos = name.indexOf(':');
if (colonpos >= 0) {
if (name.substring(colonpos+1).equalsIgnoreCase("critical")) {
if (oneOf(name.substring(colonpos+1), "critical") == 0) {
isCritical = true;
}
name = name.substring(0, colonpos);
......@@ -3688,6 +3693,8 @@ public final class KeyTool {
("-certreq [-v] [-protected]"));
System.err.println(rb.getString
("\t [-alias <alias>] [-sigalg <sigalg>]"));
System.err.println(rb.getString
("\t [-dname <dname>]"));
System.err.println(rb.getString
("\t [-file <csr_file>] [-keypass <keypass>]"));
System.err.println(rb.getString
......@@ -3770,6 +3777,8 @@ public final class KeyTool {
("\t [-infile <infile>] [-outfile <outfile>]"));
System.err.println(rb.getString
("\t [-alias <alias>]"));
System.err.println(rb.getString
("\t [-dname <dname>]"));
System.err.println(rb.getString
("\t [-sigalg <sigalg>]"));
System.err.println(rb.getString
......
......@@ -215,7 +215,7 @@ public class Resources extends java.util.ListResourceBundle {
{"\t(RETURN if same as for <otherAlias>)",
"\t(RETURN if same as for <{0}>)"},
{"*PATTERN* printX509Cert",
"Owner: {0}\nIssuer: {1}\nSerial number: {2}\nValid from: {3} until: {4}\nCertificate fingerprints:\n\t MD5: {5}\n\t SHA1: {6}\n\t Signature algorithm name: {7}\n\t Version: {8}"},
"Owner: {0}\nIssuer: {1}\nSerial number: {2}\nValid from: {3} until: {4}\nCertificate fingerprints:\n\t MD5: {5}\n\t SHA1: {6}\n\t SHA256: {7}\n\t Signature algorithm name: {8}\n\t Version: {9}"},
{"What is your first and last name?",
"What is your first and last name?"},
{"What is the name of your organizational unit?",
......@@ -301,6 +301,7 @@ public class Resources extends java.util.ListResourceBundle {
"-certreq [-v] [-protected]"},
{"\t [-alias <alias>] [-sigalg <sigalg>]",
"\t [-alias <alias>] [-sigalg <sigalg>]"},
{"\t [-dname <dname>]", "\t [-dname <dname>]"},
{"\t [-file <csr_file>] [-keypass <keypass>]",
"\t [-file <csr_file>] [-keypass <keypass>]"},
{"\t [-keystore <keystore>] [-storepass <storepass>]",
......
......@@ -337,7 +337,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetSlotList
CK_ULONG ckTokenNumber;
CK_SLOT_ID_PTR ckpSlotList;
CK_BBOOL ckTokenPresent;
jlongArray jSlotList;
jlongArray jSlotList = NULL;
CK_RV rv;
CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
......@@ -637,7 +637,7 @@ Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetMechanismList
CK_SLOT_ID ckSlotID;
CK_ULONG ckMechanismNumber;
CK_MECHANISM_TYPE_PTR ckpMechanismList;
jlongArray jMechanismList;
jlongArray jMechanismList = NULL;
CK_RV rv;
CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
......
......@@ -73,9 +73,8 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1GenerateKey
CK_MECHANISM ckMechanism;
CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
CK_ULONG ckAttributesLength;
CK_OBJECT_HANDLE ckKeyHandle;
CK_OBJECT_HANDLE ckKeyHandle = 0;
jlong jKeyHandle = 0L;
CK_ULONG i;
CK_RV rv;
CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
......@@ -151,8 +150,7 @@ JNIEXPORT jlongArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1Generate
CK_OBJECT_HANDLE_PTR ckpPublicKeyHandle; /* pointer to Public Key */
CK_OBJECT_HANDLE_PTR ckpPrivateKeyHandle; /* pointer to Private Key */
CK_OBJECT_HANDLE_PTR ckpKeyHandles; /* pointer to array with Public and Private Key */
jlongArray jKeyHandles;
CK_ULONG i;
jlongArray jKeyHandles = NULL;
CK_RV rv;
CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
......@@ -299,9 +297,8 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1UnwrapKey
CK_ULONG ckWrappedKeyLength;
CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
CK_ULONG ckAttributesLength;
CK_OBJECT_HANDLE ckKeyHandle;
CK_OBJECT_HANDLE ckKeyHandle = 0;
jlong jKeyHandle = 0L;
CK_ULONG i;
CK_RV rv;
CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
......@@ -478,8 +475,7 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DeriveKey
CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
CK_ULONG ckAttributesLength;
CK_OBJECT_HANDLE ckKeyHandle = 0;
jlong jKeyHandle;
CK_ULONG i;
jlong jKeyHandle = 0L;
CK_RV rv;
CK_OBJECT_HANDLE_PTR phKey = &ckKeyHandle;
......
......@@ -72,8 +72,7 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1CreateObject
CK_OBJECT_HANDLE ckObjectHandle;
CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
CK_ULONG ckAttributesLength;
jlong jObjectHandle;
CK_ULONG i;
jlong jObjectHandle = 0L;
CK_RV rv;
CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
......@@ -114,8 +113,7 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1CopyObject
CK_OBJECT_HANDLE ckNewObjectHandle;
CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
CK_ULONG ckAttributesLength;
jlong jNewObjectHandle;
CK_ULONG i;
jlong jNewObjectHandle = 0L;
CK_RV rv;
CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
......@@ -180,7 +178,7 @@ JNIEXPORT jlong JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetObjectSize
CK_SESSION_HANDLE ckSessionHandle;
CK_OBJECT_HANDLE ckObjectHandle;
CK_ULONG ckObjectSize;
jlong jObjectSize;
jlong jObjectSize = 0L;
CK_RV rv;
CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
......@@ -217,7 +215,7 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetAttributeVa
CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
CK_ULONG ckAttributesLength;
CK_ULONG ckBufferLength;
CK_ULONG i, j;
CK_ULONG i;
jobject jAttribute;
CK_RV rv;
......@@ -307,7 +305,6 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SetAttributeVa
CK_OBJECT_HANDLE ckObjectHandle;
CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
CK_ULONG ckAttributesLength;
CK_ULONG i;
CK_RV rv;
CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
......@@ -342,7 +339,6 @@ JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1FindObjectsIni
CK_SESSION_HANDLE ckSessionHandle;
CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
CK_ULONG ckAttributesLength;
CK_ULONG i;
CK_RV rv;
CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
......@@ -385,7 +381,7 @@ JNIEXPORT jlongArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1FindObje
CK_ULONG ckMaxObjectLength;
CK_OBJECT_HANDLE_PTR ckpObjectHandleArray;
CK_ULONG ckActualObjectCount;
jlongArray jObjectHandleArray;
jlongArray jObjectHandleArray = NULL;
CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
if (ckpFunctions == NULL) { return NULL; }
......
......@@ -110,7 +110,7 @@ JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1Sign
CK_BYTE_PTR ckpSignature;
CK_ULONG ckDataLength;
CK_ULONG ckSignatureLength = 0;
jbyteArray jSignature;
jbyteArray jSignature = NULL;
CK_RV rv;
CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
......
......@@ -194,16 +194,14 @@ jlong ckAssertReturnValueOK(JNIEnv *env, CK_RV returnValue)
jclass jPKCS11ExceptionClass;
jmethodID jConstructor;
jthrowable jPKCS11Exception;
jlong jErrorCode;
jlong jErrorCode = 0L;
if (returnValue == CKR_OK) {
return 0L ;
} else {
if (returnValue != CKR_OK) {
jErrorCode = ckULongToJLong(returnValue);
jPKCS11ExceptionClass = (*env)->FindClass(env, CLASS_PKCS11EXCEPTION);
if (jPKCS11ExceptionClass != NULL) {
jConstructor = (*env)->GetMethodID(env, jPKCS11ExceptionClass, "<init>", "(J)V");
if (jConstructor != NULL) {
jErrorCode = ckULongToJLong(returnValue);
jPKCS11Exception = (jthrowable) (*env)->NewObject(env, jPKCS11ExceptionClass, jConstructor, jErrorCode);
if (jPKCS11Exception != NULL) {
(*env)->Throw(env, jPKCS11Exception);
......@@ -211,8 +209,8 @@ jlong ckAssertReturnValueOK(JNIEnv *env, CK_RV returnValue)
}
}
(*env)->DeleteLocalRef(env, jPKCS11ExceptionClass);
return jErrorCode ;
}
return jErrorCode ;
}
/*
......
......@@ -300,7 +300,7 @@ void jAttributeArrayToCKAttributeArray(JNIEnv *env, jobjectArray jAArray, CK_ATT
/* funktions to convert a CK-type array and the array length to a Java array */
jcharArray ckByteArrayToJByteArray(JNIEnv *env, const CK_BYTE_PTR ckpArray, CK_ULONG ckLength);
jbyteArray ckByteArrayToJByteArray(JNIEnv *env, const CK_BYTE_PTR ckpArray, CK_ULONG ckLength);
jlongArray ckULongArrayToJLongArray(JNIEnv *env, const CK_ULONG_PTR ckpArray, CK_ULONG ckLength);
jcharArray ckCharArrayToJCharArray(JNIEnv *env, const CK_CHAR_PTR ckpArray, CK_ULONG length);
jcharArray ckUTF8CharArrayToJCharArray(JNIEnv *env, const CK_UTF8CHAR_PTR ckpArray, CK_ULONG ckLength);
......
......@@ -127,8 +127,6 @@ public class SctpChannelImpl extends SctpChannel
/* -- End of fields protected by stateLock -- */
private SctpResultContainer commUpResultContainer; /* null */
/**
* Constructor for normal connecting sockets
*/
......@@ -761,12 +759,6 @@ public class SctpChannelImpl extends SctpChannel
if (!ensureReceiveOpen())
return null;
if (commUpResultContainer != null) {
resultContainer = commUpResultContainer;
commUpResultContainer = null;
continue;
}
int n = 0;
try {
begin();
......@@ -778,7 +770,7 @@ public class SctpChannelImpl extends SctpChannel
}
do {
n = receive(fdVal, buffer, resultContainer);
n = receive(fdVal, buffer, resultContainer, fromConnect);
} while ((n == IOStatus.INTERRUPTED) && isOpen());
} finally {
receiverCleanup();
......@@ -809,9 +801,9 @@ public class SctpChannelImpl extends SctpChannel
if (fromConnect) {
/* If we reach here, then it was connect that invoked
* receive an received the COMM_UP. Save it and allow
* the user handler to process it upon next receive. */
commUpResultContainer = resultContainer;
* receive and received the COMM_UP. We have already
* handled the COMM_UP with the internal notification
* handler. Simply return. */
return null;
}
} /* receiveLock */
......@@ -827,20 +819,21 @@ public class SctpChannelImpl extends SctpChannel
private int receive(int fd,
ByteBuffer dst,
SctpResultContainer resultContainer)
SctpResultContainer resultContainer,
boolean peek)
throws IOException {
int pos = dst.position();
int lim = dst.limit();
assert (pos <= lim);
int rem = (pos <= lim ? lim - pos : 0);
if (dst instanceof DirectBuffer && rem > 0)
return receiveIntoNativeBuffer(fd, resultContainer, dst, rem, pos);
return receiveIntoNativeBuffer(fd, resultContainer, dst, rem, pos, peek);
/* Substitute a native buffer */
int newSize = Math.max(rem, 1);
ByteBuffer bb = Util.getTemporaryDirectBuffer(newSize);
try {
int n = receiveIntoNativeBuffer(fd, resultContainer, bb, newSize, 0);
int n = receiveIntoNativeBuffer(fd, resultContainer, bb, newSize, 0, peek);
bb.flip();
if (n > 0 && rem > 0)
dst.put(bb);
......@@ -854,10 +847,11 @@ public class SctpChannelImpl extends SctpChannel
SctpResultContainer resultContainer,
ByteBuffer bb,
int rem,
int pos)
int pos,
boolean peek)
throws IOException
{
int n = receive0(fd, resultContainer, ((DirectBuffer)bb).address() + pos, rem);
int n = receive0(fd, resultContainer, ((DirectBuffer)bb).address() + pos, rem, peek);
if (n > 0)
bb.position(pos + n);
......@@ -1089,7 +1083,7 @@ public class SctpChannelImpl extends SctpChannel
private static native void initIDs();
static native int receive0(int fd, SctpResultContainer resultContainer,
long address, int length) throws IOException;
long address, int length, boolean peek) throws IOException;
static native int send0(int fd, long address, int length,
SocketAddress target, int assocId, int streamNumber,
......
......@@ -31,6 +31,8 @@ import java.net.InetSocketAddress;
import java.io.FileDescriptor;
import java.io.IOException;
import java.util.Collections;
import java.util.Map.Entry;
import java.util.Iterator;
import java.util.Set;
import java.util.HashSet;
import java.util.HashMap;
......@@ -702,7 +704,7 @@ public class SctpMultiChannelImpl extends SctpMultiChannel
int assocId = association.associationID();
Set<SocketAddress> addresses = null;
try {
try {
addresses = SctpNet.getRemoteAddresses(fdVal, assocId);
} catch (IOException unused) {
/* OK, determining connected addresses may not be possible
......@@ -723,9 +725,11 @@ public class SctpMultiChannelImpl extends SctpMultiChannel
/* We cannot determine the connected addresses */
Set<java.util.Map.Entry<SocketAddress, Association>> addrAssocs =
addressMap.entrySet();
for (java.util.Map.Entry<SocketAddress, Association> entry : addrAssocs) {
Iterator<Entry<SocketAddress, Association>> iterator = addrAssocs.iterator();
while (iterator.hasNext()) {
Entry<SocketAddress, Association> entry = iterator.next();
if (entry.getValue().equals(association)) {
addressMap.remove(entry.getKey());
iterator.remove();
}
}
}
......@@ -957,7 +961,7 @@ public class SctpMultiChannelImpl extends SctpMultiChannel
int length)
throws IOException{
return SctpChannelImpl.receive0(fd, resultContainer, address,
length);
length, false /*peek */);
}
private static int send0(int fd,
......
......@@ -417,11 +417,11 @@ void handleMessage
/*
* Class: sun_nio_ch_SctpChannelImpl
* Method: receive0
* Signature: (ILsun/nio/ch/SctpResultContainer;JI)I
* Signature: (ILsun/nio/ch/SctpResultContainer;JIZ)I
*/
JNIEXPORT jint JNICALL Java_sun_nio_ch_SctpChannelImpl_receive0
(JNIEnv *env, jclass klass, jint fd, jobject resultContainerObj,
jlong address, jint length) {
jlong address, jint length, jboolean peek) {
SOCKADDR sa;
int sa_len = sizeof(sa);
ssize_t rv = 0;
......@@ -429,6 +429,7 @@ JNIEXPORT jint JNICALL Java_sun_nio_ch_SctpChannelImpl_receive0
struct iovec iov[1];
struct msghdr msg[1];
char cbuf[CMSG_SPACE(sizeof (struct sctp_sndrcvinfo))];
int flags = peek == JNI_TRUE ? MSG_PEEK : 0;
/* Set up the msghdr structure for receiving */
memset(msg, 0, sizeof (*msg));
......@@ -443,7 +444,7 @@ JNIEXPORT jint JNICALL Java_sun_nio_ch_SctpChannelImpl_receive0
msg->msg_flags = 0;
do {
if ((rv = recvmsg(fd, msg, 0)) < 0) {
if ((rv = recvmsg(fd, msg, flags)) < 0) {
if (errno == EWOULDBLOCK) {
return IOS_UNAVAILABLE;
} else if (errno == EINTR) {
......@@ -473,7 +474,7 @@ JNIEXPORT jint JNICALL Java_sun_nio_ch_SctpChannelImpl_receive0
memcpy(buf, addr, rv);
iov->iov_base = buf + rv;
iov->iov_len = NOTIFICATION_BUFFER_SIZE - rv;
if ((rv = recvmsg(fd, msg, 0)) < 0) {
if ((rv = recvmsg(fd, msg, flags)) < 0) {
handleSocketError(env, errno);
return 0;
}
......
......@@ -85,19 +85,21 @@ static jfieldID entry_options;
static jfieldID entry_dev;
/**
* System calls that may not be available at build time.
* System calls that may not be available at run time.
*/
typedef int openat64_func(int, const char *, int, ...);
typedef int fstatat64_func(int, const char *, struct stat64 *, int);
typedef int unlinkat_func(int, const char*, int);
typedef int renameat_func(int, const char*, int, const char*);
typedef int futimesat_func(int, const char *, const struct timeval *);
typedef DIR* fdopendir_func(int);
static openat64_func* my_openat64_func = NULL;
static fstatat64_func* my_fstatat64_func = NULL;
static unlinkat_func* my_unlinkat_func = NULL;
static renameat_func* my_renameat_func = NULL;
static futimesat_func* my_futimesat_func = NULL;
static fdopendir_func* my_fdopendir_func = NULL;
/**
* fstatat missing from glibc on Linux. Temporary workaround
......@@ -183,7 +185,7 @@ Java_sun_nio_fs_UnixNativeDispatcher_init(JNIEnv* env, jclass this)
entry_options = (*env)->GetFieldID(env, clazz, "opts", "[B");
entry_dev = (*env)->GetFieldID(env, clazz, "dev", "J");
/* system calls that might not be available at build time */
/* system calls that might not be available at run time */
#if defined(__solaris__) && defined(_LP64)
/* Solaris 64-bit does not have openat64/fstatat64 */
......@@ -196,6 +198,7 @@ Java_sun_nio_fs_UnixNativeDispatcher_init(JNIEnv* env, jclass this)
my_unlinkat_func = (unlinkat_func*) dlsym(RTLD_DEFAULT, "unlinkat");
my_renameat_func = (renameat_func*) dlsym(RTLD_DEFAULT, "renameat");
my_futimesat_func = (futimesat_func*) dlsym(RTLD_DEFAULT, "futimesat");
my_fdopendir_func = (fdopendir_func*) dlsym(RTLD_DEFAULT, "fdopendir");
#if defined(FSTATAT64_SYSCALL_AVAILABLE)
/* fstatat64 missing from glibc */
......@@ -205,7 +208,7 @@ Java_sun_nio_fs_UnixNativeDispatcher_init(JNIEnv* env, jclass this)
if (my_openat64_func != NULL && my_fstatat64_func != NULL &&
my_unlinkat_func != NULL && my_renameat_func != NULL &&
my_futimesat_func != NULL)
my_futimesat_func != NULL && my_fdopendir_func != NULL)
{
flags |= sun_nio_fs_UnixNativeDispatcher_HAS_AT_SYSCALLS;
}
......@@ -565,8 +568,13 @@ JNIEXPORT jlong JNICALL
Java_sun_nio_fs_UnixNativeDispatcher_fdopendir(JNIEnv* env, jclass this, int dfd) {
DIR* dir;
if (my_fdopendir_func == NULL) {
JNU_ThrowInternalError(env, "should not reach here");
return (jlong)-1;
}
/* EINTR not listed as a possible error */
dir = fdopendir((int)dfd);
dir = (*my_fdopendir_func)((int)dfd);
if (dir == NULL) {
throwUnixException(env, errno);
}
......
......@@ -1177,14 +1177,20 @@ class WindowsPath extends AbstractPath {
/*
* Windows treates symbolic links to directories differently than it
* does to other file types. For that reason we check if the exists and
* is a directory.
* does to other file types. For that reason we need to check if the
* target is a directory (or a directory junction).
*/
WindowsPath resolvedTarget;
if (target.type == WindowsPathType.RELATIVE) {
WindowsPath parent = getParent();
resolvedTarget = (parent == null) ? target : parent.resolve(target);
} else {
resolvedTarget = resolve(target);
}
int flags = 0;
WindowsPath resolvedTarget =
WindowsPath.createFromNormalizedPath(getFileSystem(), resolve(target).path);
try {
if (WindowsFileAttributes.get(resolvedTarget, true).isDirectory())
WindowsFileAttributes wattrs = WindowsFileAttributes.get(resolvedTarget, false);
if (wattrs.isDirectory() || wattrs.isDirectoryLink())
flags |= SYMBOLIC_LINK_FLAG_DIRECTORY;
} catch (WindowsException x) {
// unable to access target so assume target is not a directory
......
/*
* Portions Copyright 2003-2009 Sun Microsystems, Inc. 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
......
/*
* Portions Copyright 2003-2009 Sun Microsystems, Inc. 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
......@@ -30,16 +31,15 @@
package sun.security.krb5.internal.tools;
import sun.security.krb5.*;
import sun.security.krb5.internal.*;
import sun.security.krb5.internal.ktab.*;
import sun.security.krb5.KrbCryptoException;
import java.lang.RuntimeException;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.FileOutputStream;
import java.io.File;
import java.text.DateFormat;
import java.util.Arrays;
import java.util.Date;
import sun.security.krb5.internal.crypto.EType;
/**
* This class can execute as a command-line tool to help the user manage
* entires in the key table.
......@@ -55,6 +55,9 @@ public class Ktab {
char action;
String name; // name and directory of key table
String principal;
boolean showEType;
boolean showTime;
int etype = -1;
char[] password = null;
/**
......@@ -62,13 +65,14 @@ public class Ktab {
* <br>Usage: ktab <options>
* <br>available options to Ktab:
* <ul>
* <li><b>-l</b> list the keytab name and entries
* <li><b>-l [-e] [-t]</b> list the keytab name and entries, -e show
* encryption etypes, -t show timestamps.
* <li><b>-a</b> &lt;<i>principal name</i>&gt;
* (&lt;<i>password</i>&gt;) add an entry to the keytab.
* The entry is added only to the keytab. No changes are made to the
* Kerberos database.
* <li><b>-d</b> &lt;<i>principal name</i>&gt;
* delete an entry from the keytab
* <li><b>-d</b> &lt;<i>principal name</i>&gt; [&lt;<i>etype</i>&gt;]
* delete an entry from the keytab.
* The entry is deleted only from the keytab. No changes are made to the
* Kerberos database.
* <li><b>-k</b> &lt;<i>keytab name</i> &gt;
......@@ -182,6 +186,11 @@ public class Ktab {
i++;
if ((i < args.length) && (!args[i].startsWith("-"))) {
principal = args[i];
int j = i + 1;
if ((j < args.length) && (!args[j].startsWith("-"))) {
etype = Integer.parseInt(args[j]);
i = j;
}
} else {
System.out.println("Please specify the principal" +
"name of the entry you want to " +
......@@ -207,6 +216,12 @@ public class Ktab {
System.exit(-1);
}
break;
case 'e':
showEType = true;
break;
case 't':
showTime = true;
break;
default:
printHelp();
System.exit(-1);
......@@ -271,25 +286,54 @@ public class Ktab {
* Lists key table name and entries in it.
*/
void listKt() {
int version;
String principal;
// System.out.println("Keytab name: " + admin.getKeyTabName());
System.out.println("Keytab name: " + table.tabName());
// KeyTabEntry[] entries = admin.getEntries();
System.out.println("Keytab name: " + KeyTab.tabName());
KeyTabEntry[] entries = table.getEntries();
if ((entries != null) && (entries.length > 0)) {
System.out.println("KVNO Principal");
String[][] output = new String[entries.length+1][showTime?3:2];
int column = 0;
output[0][column++] = "KVNO";
if (showTime) output[0][column++] = "Timestamp";
output[0][column++] = "Principal";
for (int i = 0; i < entries.length; i++) {
version = entries[i].getKey().getKeyVersionNumber().intValue();
principal = entries[i].getService().toString();
if (i == 0) {
StringBuffer separator = new StringBuffer();
for (int j = 0; j < 9 + principal.length(); j++) {
separator.append("-");
column = 0;
output[i+1][column++] = entries[i].getKey().
getKeyVersionNumber().toString();
if (showTime) output[i+1][column++] =
DateFormat.getDateTimeInstance(
DateFormat.SHORT, DateFormat.SHORT).format(
new Date(entries[i].getTimeStamp().getTime()));
String princ = entries[i].getService().toString();
if (showEType) {
int e = entries[i].getKey().getEType();
output[i+1][column++] = princ + " (" + e + ":" +
EType.toString(e) + ")";
} else {
output[i+1][column++] = princ;
}
}
int[] width = new int[column];
for (int j=0; j<column; j++) {
for (int i=0; i <= entries.length; i++) {
if (output[i][j].length() > width[j]) {
width[j] = output[i][j].length();
}
System.out.println(separator.toString());
}
System.out.println(" " + version + " " + principal);
if (j != 0) width[j] = -width[j];
}
for (int j=0; j<column; j++) {
System.out.printf("%" + width[j] + "s ", output[0][j]);
}
System.out.println();
for (int j=0; j<column; j++) {
for (int k=0; k<Math.abs(width[j]); k++) System.out.print("-");
System.out.print(" ");
}
System.out.println();
for (int i=0; i<entries.length; i++) {
for (int j=0; j<column; j++) {
System.out.printf("%" + width[j] + "s ", output[i+1][j]);
}
System.out.println();
}
} else {
System.out.println("0 entry.");
......@@ -309,9 +353,10 @@ public class Ktab {
String answer;
BufferedReader cis =
new BufferedReader(new InputStreamReader(System.in));
System.out.print("Are you sure you want to "+
System.out.print("Are you sure you want to"+
" delete service key for " + pname.toString() +
" in " + table.tabName() + "?(Y/N) :");
" (" + (etype==-1?"all etypes":("etype = "+etype)) +
") in " + table.tabName() + "?(Y/N): ");
System.out.flush();
answer = cis.readLine();
......@@ -333,19 +378,26 @@ public class Ktab {
e.printStackTrace();
System.exit(-1);
}
// admin.deleteEntry(pname);
table.deleteEntry(pname);
try {
table.save();
} catch (IOException e) {
System.err.println("Error occurs while saving the keytab." +
int count;
if (etype == -1) count = table.deleteEntry(pname);
else count = table.deleteEntry(pname, etype);
if (count == 0) {
System.err.println("No matched entry in the keytab. " +
"Deletion fails.");
e.printStackTrace();
System.exit(-1);
} else {
try {
table.save();
} catch (IOException e) {
System.err.println("Error occurs while saving the keytab. " +
"Deletion fails.");
e.printStackTrace();
System.exit(-1);
}
System.out.println("Done!");
}
System.out.println("Done!");
}
/**
......@@ -355,12 +407,12 @@ public class Ktab {
System.out.println("\nUsage: ktab " +
"<options>");
System.out.println("available options to Ktab:");
System.out.println("-l\t\t\t\tlist the keytab name and entries");
System.out.println("-l [-e] [-t]\t\t\tlist the keytab name and entries,\n\t\t\t\t-e with etype, -t with timestamp");
System.out.println("-a <principal name> (<password>)add an entry " +
"to the keytab");
System.out.println("-d <principal name>\t\tdelete an entry from "+
"the keytab");
System.out.println("-d <principal name> [<etype>]\tdelete an "+
"entry from the keytab");
System.out.println("-k <keytab name>\t\tspecify keytab name and "+
" path with prefix FILE:");
"path with prefix FILE:");
}
}
/*
* Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
/**
* @test
* @bug 6449574
* @summary Invalid ldap filter is accepted and processed
*/
import java.io.*;
import javax.naming.*;
import javax.naming.directory.*;
import java.util.Properties;
import java.util.Hashtable;
import java.net.Socket;
import java.net.ServerSocket;
public class BalancedParentheses {
// Should we run the client or server in a separate thread?
//
// Both sides can throw exceptions, but do you have a preference
// as to which side should be the main thread.
static boolean separateServerThread = true;
// use any free port by default
volatile int serverPort = 0;
// Is the server ready to serve?
volatile static boolean serverReady = false;
// Define the server side of the test.
//
// If the server prematurely exits, serverReady will be set to true
// to avoid infinite hangs.
void doServerSide() throws Exception {
ServerSocket serverSock = new ServerSocket(serverPort);
// signal client, it's ready to accecpt connection
serverPort = serverSock.getLocalPort();
serverReady = true;
// accept a connection
Socket socket = serverSock.accept();
System.out.println("Server: Connection accepted");
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
// read the bindRequest
while (is.read() != -1) {
// ignore
is.skip(is.available());
break;
}
byte[] bindResponse = {0x30, 0x0C, 0x02, 0x01, 0x01, 0x61, 0x07, 0x0A,
0x01, 0x00, 0x04, 0x00, 0x04, 0x00};
// write bindResponse
os.write(bindResponse);
os.flush();
// ignore any more request.
while (is.read() != -1) {
// ignore
is.skip(is.available());
}
is.close();
os.close();
socket.close();
serverSock.close();
}
// Define the client side of the test.
//
// If the server prematurely exits, serverReady will be set to true
// to avoid infinite hangs.
void doClientSide() throws Exception {
// Wait for server to get started.
while (!serverReady) {
Thread.sleep(50);
}
// set up the environment for creating the initial context
Hashtable<Object, Object> env = new Hashtable<Object, Object>();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://localhost:" + serverPort);
env.put("com.sun.jndi.ldap.read.timeout", "1000");
// env.put(Context.SECURITY_AUTHENTICATION, "simple");
// env.put(Context.SECURITY_PRINCIPAL,"cn=root");
// env.put(Context.SECURITY_CREDENTIALS,"root");
// create initial context
DirContext context = new InitialDirContext(env);
// searching
SearchControls scs = new SearchControls();
scs.setSearchScope(SearchControls.SUBTREE_SCOPE);
try {
NamingEnumeration answer = context.search(
"o=sun,c=us", "(&(cn=Bob)))", scs);
} catch (InvalidSearchFilterException isfe) {
// ignore, it is the expected filter exception.
System.out.println("Expected exception: " + isfe.getMessage());
} catch (NamingException ne) {
// maybe a read timeout exception, as the server does not response.
throw new Exception("Expect a InvalidSearchFilterException", ne);
}
try {
NamingEnumeration answer = context.search(
"o=sun,c=us", ")(&(cn=Bob)", scs);
} catch (InvalidSearchFilterException isfe) {
// ignore, it is the expected filter exception.
System.out.println("Expected exception: " + isfe.getMessage());
} catch (NamingException ne) {
// maybe a read timeout exception, as the server does not response.
throw new Exception("Expect a InvalidSearchFilterException", ne);
}
try {
NamingEnumeration answer = context.search(
"o=sun,c=us", "(&(cn=Bob))", scs);
} catch (InvalidSearchFilterException isfe) {
// ignore, it is the expected filter exception.
throw new Exception("Unexpected ISFE", isfe);
} catch (NamingException ne) {
// maybe a read timeout exception, as the server does not response.
System.out.println("Expected exception: " + ne.getMessage());
}
context.close();
}
/*
* ============================================================
* The remainder is just support stuff
*/
// client and server thread
Thread clientThread = null;
Thread serverThread = null;
// client and server exceptions
volatile Exception serverException = null;
volatile Exception clientException = null;
void startServer(boolean newThread) throws Exception {
if (newThread) {
serverThread = new Thread() {
public void run() {
try {
doServerSide();
} catch (Exception e) {
/*
* Our server thread just died.
*
* Release the client, if not active already...
*/
System.err.println("Server died...");
System.err.println(e);
serverReady = true;
serverException = e;
}
}
};
serverThread.start();
} else {
doServerSide();
}
}
void startClient(boolean newThread) throws Exception {
if (newThread) {
clientThread = new Thread() {
public void run() {
try {
doClientSide();
} catch (Exception e) {
/*
* Our client thread just died.
*/
System.err.println("Client died...");
clientException = e;
}
}
};
clientThread.start();
} else {
doClientSide();
}
}
// Primary constructor, used to drive remainder of the test.
BalancedParentheses() throws Exception {
if (separateServerThread) {
startServer(true);
startClient(false);
} else {
startClient(true);
startServer(false);
}
/*
* Wait for other side to close down.
*/
if (separateServerThread) {
serverThread.join();
} else {
clientThread.join();
}
/*
* When we get here, the test is pretty much over.
*
* If the main thread excepted, that propagates back
* immediately. If the other thread threw an exception, we
* should report back.
*/
if (serverException != null) {
System.out.print("Server Exception:");
throw serverException;
}
if (clientException != null) {
System.out.print("Client Exception:");
throw clientException;
}
}
public static void main(String[] args) throws Exception {
// start the test
new BalancedParentheses();
}
}
/*
* Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
/* @test
* @bug 6863110
* @summary Newly connected/accepted SctpChannel should fire OP_READ if registered with a Selector
* @author chegar
*/
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.io.IOException;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.nio.ByteBuffer;
import java.nio.channels.Selector;
import java.nio.channels.SelectionKey;
import com.sun.nio.sctp.AbstractNotificationHandler;
import com.sun.nio.sctp.AssociationChangeNotification;
import com.sun.nio.sctp.AssociationChangeNotification.AssocChangeEvent;
import com.sun.nio.sctp.HandlerResult;
import com.sun.nio.sctp.Notification;
import com.sun.nio.sctp.SctpChannel;
import com.sun.nio.sctp.SctpServerChannel;
import com.sun.nio.sctp.ShutdownNotification;
import static java.lang.System.out;
import static java.lang.System.err;
import static java.nio.channels.SelectionKey.OP_CONNECT;
import static java.nio.channels.SelectionKey.OP_READ;
public class CommUp {
static CountDownLatch acceptLatch = new CountDownLatch(1);
static final int TIMEOUT = 10000;
CommUpNotificationHandler clientHandler = new CommUpNotificationHandler();
CommUpNotificationHandler serverHandler = new CommUpNotificationHandler();
CommUpServer server;
Thread clientThread;
void test(String[] args) {
SocketAddress address = null;
if (!Util.isSCTPSupported()) {
out.println("SCTP protocol is not supported");
out.println("Test cannot be run");
return;
}
if (args.length == 2) {
/* requested to connecct to a specific address */
try {
int port = Integer.valueOf(args[1]);
address = new InetSocketAddress(args[0], port);
} catch (NumberFormatException nfe) {
err.println(nfe);
}
} else {
/* start server on local machine, default */
try {
server = new CommUpServer();
server.start();
address = server.address();
debug("Server started and listening on " + address);
} catch (IOException ioe) {
ioe.printStackTrace();
return;
}
}
/* store the main thread so that the server can interrupt it, if necessary */
clientThread = Thread.currentThread();
doClient(address);
}
void doClient(SocketAddress peerAddress) {
SctpChannel sc = null;
try {
debug("connecting to " + peerAddress);
sc = SctpChannel.open();
sc.configureBlocking(false);
check(sc.isBlocking() == false, "Should be in non-blocking mode");
sc.connect(peerAddress);
Selector selector = Selector.open();
SelectionKey selectiontKey = sc.register(selector, OP_CONNECT);
/* Expect two interest Ops */
boolean opConnectReceived = false;
boolean opReadReceived = false;
for (int z=0; z<2; z++) {
debug("select " + z);
int keysAdded = selector.select(TIMEOUT);
debug("returned " + keysAdded + " keys");
if (keysAdded > 0) {
Set<SelectionKey> keys = selector.selectedKeys();
Iterator<SelectionKey> i = keys.iterator();
while(i.hasNext()) {
SelectionKey sk = i.next();
i.remove();
SctpChannel readyChannel =
(SctpChannel)sk.channel();
/* OP_CONNECT */
if (sk.isConnectable()) {
/* some trivial checks */
check(opConnectReceived == false,
"should only received one OP_CONNECT");
check(opReadReceived == false,
"should not receive OP_READ before OP_CONNECT");
check(readyChannel.equals(sc),
"channels should be equal");
check(!sk.isAcceptable(),
"key should not be acceptable");
check(!sk.isReadable(),
"key should not be readable");
check(!sk.isWritable(),
"key should not be writable");
/* now process the OP_CONNECT */
opConnectReceived = true;
check((sk.interestOps() & OP_CONNECT) == OP_CONNECT,
"selection key interest ops should contain OP_CONNECT");
sk.interestOps(OP_READ);
check((sk.interestOps() & OP_CONNECT) != OP_CONNECT,
"selection key interest ops should not contain OP_CONNECT");
check(sc.finishConnect(),
"finishConnect should return true");
} /* OP_READ */
else if (sk.isReadable()) {
/* some trivial checks */
check(opConnectReceived == true,
"should receive one OP_CONNECT before OP_READ");
check(opReadReceived == false,
"should not receive OP_READ before OP_CONNECT");
check(readyChannel.equals(sc),
"channels should be equal");
check(!sk.isAcceptable(),
"key should not be acceptable");
check(sk.isReadable(),
"key should be readable");
check(!sk.isWritable(),
"key should not be writable");
check(!sk.isConnectable(),
"key should not be connectable");
/* now process the OP_READ */
opReadReceived = true;
selectiontKey.cancel();
/* try with small buffer to see if native
* implementation can handle this */
ByteBuffer buffer = ByteBuffer.allocateDirect(1);
readyChannel.receive(buffer, null, clientHandler);
check(clientHandler.receivedCommUp(),
"Client should have received COMM_UP");
/* dont close (or put anything on) the channel until
* we check that the server's accepted channel also
* received COMM_UP */
serverHandler.waitForCommUp();
} else {
fail("Unexpected selection key");
}
}
} else {
fail("Client selector returned 0 ready keys");
/* stop the server */
server.thread().interrupt();
}
} //for
} catch (IOException ioe) {
unexpected(ioe);
} catch (InterruptedException ie) {
unexpected(ie);
}
}
class CommUpServer implements Runnable
{
final InetSocketAddress serverAddr;
private SctpServerChannel ssc;
private Thread serverThread;
public CommUpServer() throws IOException {
ssc = SctpServerChannel.open().bind(null);
java.util.Set<SocketAddress> addrs = ssc.getAllLocalAddresses();
if (addrs.isEmpty())
debug("addrs should not be empty");
serverAddr = (InetSocketAddress) addrs.iterator().next();
}
void start() {
serverThread = new Thread(this, "CommUpServer-" +
serverAddr.getPort());
serverThread.start();
}
InetSocketAddress address () {
return serverAddr;
}
Thread thread() {
return serverThread;
}
@Override
public void run() {
Selector selector = null;
SctpChannel sc = null;
SelectionKey readKey = null;
try {
sc = ssc.accept();
debug("accepted " + sc);
selector = Selector.open();
sc.configureBlocking(false);
check(sc.isBlocking() == false, "Should be in non-blocking mode");
readKey = sc.register(selector, SelectionKey.OP_READ);
debug("select");
int keysAdded = selector.select(TIMEOUT);
debug("returned " + keysAdded + " keys");
if (keysAdded > 0) {
Set<SelectionKey> keys = selector.selectedKeys();
Iterator<SelectionKey> i = keys.iterator();
while(i.hasNext()) {
SelectionKey sk = i.next();
i.remove();
SctpChannel readyChannel =
(SctpChannel)sk.channel();
check(readyChannel.equals(sc),
"channels should be equal");
check(!sk.isAcceptable(),
"key should not be acceptable");
check(sk.isReadable(),
"key should be readable");
check(!sk.isWritable(),
"key should not be writable");
check(!sk.isConnectable(),
"key should not be connectable");
/* block until we check if the client has received its COMM_UP*/
clientHandler.waitForCommUp();
ByteBuffer buffer = ByteBuffer.allocateDirect(1);
sc.receive(buffer, null, serverHandler);
check(serverHandler.receivedCommUp(),
"Accepted channel should have received COMM_UP");
}
} else {
fail("Server selector returned 0 ready keys");
/* stop the client */
clientThread.interrupt();
}
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (InterruptedException unused) {
} finally {
if (readKey != null) readKey.cancel();
try { if (selector != null) selector.close(); }
catch (IOException ioe) { unexpected(ioe); }
try { if (ssc != null) ssc.close(); }
catch (IOException ioe) { unexpected(ioe); }
try { if (sc != null) sc.close(); }
catch (IOException ioe) { unexpected(ioe); }
}
}
}
class CommUpNotificationHandler extends AbstractNotificationHandler<Object>
{
private boolean receivedCommUp; // false
public synchronized boolean receivedCommUp() {
return receivedCommUp;
}
public synchronized boolean waitForCommUp() throws InterruptedException {
while (receivedCommUp == false) {
wait();
}
return false;
}
@Override
public HandlerResult handleNotification(
Notification notification, Object attachment) {
fail("Unknown notification type");
return HandlerResult.CONTINUE;
}
@Override
public synchronized HandlerResult handleNotification(
AssociationChangeNotification notification, Object attachment) {
AssocChangeEvent event = notification.event();
debug("AssociationChangeNotification");
debug(" Association: " + notification.association());
debug(" Event: " + event);
if (event.equals(AssocChangeEvent.COMM_UP)) {
receivedCommUp = true;
notifyAll();
}
return HandlerResult.RETURN;
}
@Override
public HandlerResult handleNotification(
ShutdownNotification notification, Object attachment) {
debug("ShutdownNotification");
debug(" Association: " + notification.association());
return HandlerResult.RETURN;
}
}
//--------------------- Infrastructure ---------------------------
boolean debug = true;
volatile int passed = 0, failed = 0;
void pass() {passed++;}
void fail() {failed++; Thread.dumpStack();}
void fail(String msg) {err.println(msg); fail();}
void unexpected(Throwable t) {failed++; t.printStackTrace();}
void check(boolean cond) {if (cond) pass(); else fail();}
void check(boolean cond, String failMessage) {if (cond) pass(); else fail(failMessage);}
void debug(String message) {if(debug) { out.println(Thread.currentThread().getName() + ": " + message); } }
void sleep(long millis) { try { Thread.currentThread().sleep(millis); }
catch(InterruptedException ie) { unexpected(ie); }}
public static void main(String[] args) throws Throwable {
Class<?> k = new Object(){}.getClass().getEnclosingClass();
try {k.getMethod("instanceMain",String[].class)
.invoke( k.newInstance(), (Object) args);}
catch (Throwable e) {throw e.getCause();}}
public void instanceMain(String[] args) throws Throwable {
try {test(args);} catch (Throwable t) {unexpected(t);}
out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
if (failed > 0) throw new AssertionError("Some tests failed");}
}
......@@ -115,7 +115,6 @@ public class Branch {
/* Receive the COMM_UP */
buffer.clear();
BranchNotificationHandler handler = new BranchNotificationHandler();
channel.configureBlocking(false);
info = channel.receive(buffer, null, handler);
check(handler.receivedCommUp(), "COMM_UP no received");
Set<Association> associations = channel.associations();
......
......@@ -181,7 +181,6 @@ public class SocketOptionTests {
/* Receive the COMM_UP */
buffer.clear();
SOTNotificationHandler handler = new SOTNotificationHandler();
smc.configureBlocking(false);
info = smc.receive(buffer, null, handler);
check(handler.receivedCommUp(), "COMM_UP no received");
Set<Association> associations = smc.associations();
......@@ -220,6 +219,7 @@ public class SocketOptionTests {
}
check(found, "SCTP_PRIMARY_ADDR returned bogus address!");
System.out.println("Try SCTP_PRIMARY_ADDR set to: " + addrToSet);
smc.setOption(SCTP_PRIMARY_ADDR, addrToSet, assoc);
System.out.println("SCTP_PRIMARY_ADDR set to: " + addrToSet);
primaryAddr = smc.getOption(SCTP_PRIMARY_ADDR, assoc);
......
......@@ -44,9 +44,9 @@ public class GroupOfOne {
final AsynchronousServerSocketChannel listener =
AsynchronousServerSocketChannel.open()
.bind(new InetSocketAddress(0));
listener.accept(null, new CompletionHandler<AsynchronousSocketChannel,Void>() {
listener.accept((Void)null, new CompletionHandler<AsynchronousSocketChannel,Void>() {
public void completed(AsynchronousSocketChannel ch, Void att) {
listener.accept(null, this);
listener.accept((Void)null, this);
}
public void failed(Throwable exc, Void att) {
}
......@@ -81,13 +81,13 @@ public class GroupOfOne {
// 2. the close/shutdown completes
final CountDownLatch latch = new CountDownLatch(2);
ch.connect(sa, null, new CompletionHandler<Void,Void>() {
ch.connect(sa, (Void)null, new CompletionHandler<Void,Void>() {
public void completed(Void result, Void att) {
System.out.println("Connected");
// initiate I/O operation that does not complete (successfully)
ByteBuffer buf = ByteBuffer.allocate(100);
ch.read(buf, null, new CompletionHandler<Integer,Void>() {
ch.read(buf, (Void)null, new CompletionHandler<Integer,Void>() {
public void completed(Integer bytesRead, Void att) {
throw new RuntimeException();
}
......
......@@ -78,15 +78,15 @@ public class Identity {
final AsynchronousServerSocketChannel listener =
AsynchronousServerSocketChannel.open()
.bind(new InetSocketAddress(0));
listener.accept(null, new CompletionHandler<AsynchronousSocketChannel,Void>() {
listener.accept((Void)null, new CompletionHandler<AsynchronousSocketChannel,Void>() {
public void completed(final AsynchronousSocketChannel ch, Void att) {
listener.accept(null, this);
listener.accept((Void)null, this);
final ByteBuffer buf = ByteBuffer.allocate(100);
ch.read(buf, null, new CompletionHandler<Integer,Void>() {
ch.read(buf, (Void)null, new CompletionHandler<Integer,Void>() {
public void completed(Integer bytesRead, Void att) {
buf.clear();
ch.read(buf, null, this);
ch.read(buf, (Void)null, this);
}
public void failed(Throwable exc, Void att) {
}
......
......@@ -94,7 +94,7 @@ public class Restart {
for (int i=0; i<count; i++) {
final CountDownLatch latch = new CountDownLatch(1);
listener.accept(null, new CompletionHandler<AsynchronousSocketChannel,Void>() {
listener.accept((Void)null, new CompletionHandler<AsynchronousSocketChannel,Void>() {
public void completed(AsynchronousSocketChannel ch, Void att) {
try {
ch.close();
......
......@@ -45,10 +45,10 @@ public class Unbounded {
final AsynchronousServerSocketChannel listener =
AsynchronousServerSocketChannel.open()
.bind(new InetSocketAddress(0));
listener.accept(null, new CompletionHandler<AsynchronousSocketChannel,Void>() {
listener.accept((Void)null, new CompletionHandler<AsynchronousSocketChannel,Void>() {
public void completed(AsynchronousSocketChannel ch, Void att) {
queue.add(ch);
listener.accept(null, this);
listener.accept((Void)null, this);
}
public void failed(Throwable exc, Void att) {
}
......
......@@ -66,7 +66,7 @@ public class Basic {
// Test: datagram packet not received immediately
dst.clear();
final CountDownLatch latch = new CountDownLatch(1);
ch.receive(dst, null, new CompletionHandler<SocketAddress,Void>() {
ch.receive(dst, (Void)null, new CompletionHandler<SocketAddress,Void>() {
public void completed(SocketAddress source, Void att) {
latch.countDown();
}
......@@ -82,7 +82,7 @@ public class Basic {
// Test: timeout
dst.clear();
final AtomicReference<Throwable> exception = new AtomicReference<Throwable>();
ch.receive(dst, 2, TimeUnit.SECONDS, null, new CompletionHandler<SocketAddress,Void>() {
ch.receive(dst, 2, TimeUnit.SECONDS, (Void)null, new CompletionHandler<SocketAddress,Void>() {
public void completed(SocketAddress source, Void att) {
}
public void failed (Throwable exc, Void att) {
......@@ -101,7 +101,7 @@ public class Basic {
// AsynchronousCloseException
dst = ByteBuffer.allocateDirect(100);
exception.set(null);
ch.receive(dst, null, new CompletionHandler<SocketAddress,Void>() {
ch.receive(dst, (Void)null, new CompletionHandler<SocketAddress,Void>() {
public void completed(SocketAddress source, Void att) {
}
public void failed (Throwable exc, Void att) {
......@@ -156,7 +156,7 @@ public class Basic {
// Test: datagram packet not received immediately
dst.clear();
final CountDownLatch l1 = new CountDownLatch(1);
ch.read(dst, null, new CompletionHandler<Integer,Void>() {
ch.read(dst, (Void)null, new CompletionHandler<Integer,Void>() {
public void completed(Integer bytesRead, Void att) {
l1.countDown();
}
......@@ -172,7 +172,7 @@ public class Basic {
// Test: timeout
dst.clear();
final AtomicReference<Throwable> exception = new AtomicReference<Throwable>();
ch.read(dst, 2, TimeUnit.SECONDS, null, new CompletionHandler<Integer,Void>() {
ch.read(dst, 2, TimeUnit.SECONDS, (Void)null, new CompletionHandler<Integer,Void>() {
public void completed(Integer bytesRead, Void att) {
}
public void failed (Throwable exc, Void att) {
......@@ -191,7 +191,7 @@ public class Basic {
// AsynchronousCloseException
dst.clear();
exception.set(null);
ch.read(dst, null, new CompletionHandler<Integer,Void>() {
ch.read(dst, (Void)null, new CompletionHandler<Integer,Void>() {
public void completed(Integer bytesRead, Void att) {
}
public void failed (Throwable exc, Void att) {
......@@ -238,7 +238,7 @@ public class Basic {
// Test: send datagram packet to reader and check completion handler
// is invoked
final CountDownLatch l2 = new CountDownLatch(1);
ch.send(ByteBuffer.wrap(msg), sa, null, new CompletionHandler<Integer,Void>() {
ch.send(ByteBuffer.wrap(msg), sa, (Void)null, new CompletionHandler<Integer,Void>() {
public void completed(Integer bytesSent, Void att) {
if (bytesSent != msg.length)
throw new RuntimeException("Unexpected number of bytes received");
......@@ -261,7 +261,7 @@ public class Basic {
// Test: check that failed method is invoked
ch.close();
final CountDownLatch l3 = new CountDownLatch(1);
ch.send(ByteBuffer.wrap(msg), sa, null, new CompletionHandler<Integer,Void>() {
ch.send(ByteBuffer.wrap(msg), sa, (Void)null, new CompletionHandler<Integer,Void>() {
public void completed(Integer bytesSent, Void att) {
throw new RuntimeException("completed method invoked");
}
......@@ -315,7 +315,7 @@ public class Basic {
// Test: write datagram and check completion handler is invoked
final CountDownLatch l2 = new CountDownLatch(1);
ch.write(ByteBuffer.wrap(msg), null, new CompletionHandler<Integer,Void>() {
ch.write(ByteBuffer.wrap(msg), (Void)null, new CompletionHandler<Integer,Void>() {
public void completed(Integer bytesSent, Void att) {
if (bytesSent != msg.length)
throw new RuntimeException("Unexpected number of bytes received");
......@@ -372,7 +372,7 @@ public class Basic {
final CountDownLatch latch = new CountDownLatch(1);
long timeout = (i == 0) ? 0L : 60L;
Future<SocketAddress> remote = ch
.receive(ByteBuffer.allocate(100), timeout, TimeUnit.SECONDS, null,
.receive(ByteBuffer.allocate(100), timeout, TimeUnit.SECONDS, (Void)null,
new CompletionHandler<SocketAddress,Void>() {
public void completed(SocketAddress source, Void att) {
}
......@@ -395,7 +395,7 @@ public class Basic {
final CountDownLatch latch = new CountDownLatch(1);
long timeout = (i == 0) ? 0L : 60L;
Future<Integer> result = ch
.read(ByteBuffer.allocate(100), timeout, TimeUnit.SECONDS, null,
.read(ByteBuffer.allocate(100), timeout, TimeUnit.SECONDS, (Void)null,
new CompletionHandler<Integer,Void>() {
public void completed(Integer bytesRead, Void att) {
}
......
......@@ -190,7 +190,7 @@ public class Basic {
if (fl == null)
throw new RuntimeException("Unable to acquire lock");
try {
ch.lock(null, new CompletionHandler<FileLock,Void> () {
ch.lock((Void)null, new CompletionHandler<FileLock,Void> () {
public void completed(FileLock result, Void att) {
}
public void failed(Throwable exc, Void att) {
......@@ -217,7 +217,7 @@ public class Basic {
ByteBuffer buf = ByteBuffer.allocateDirect(100);
final CountDownLatch latch = new CountDownLatch(1);
ch.read(buf, 0L, null, new CompletionHandler<Integer,Void>() {
ch.read(buf, 0L, (Void)null, new CompletionHandler<Integer,Void>() {
public void completed(Integer result, Void att) {
try {
Thread.currentThread().interrupt();
......@@ -311,7 +311,7 @@ public class Basic {
final AtomicReference<Thread> invoker = new AtomicReference<Thread>();
final CountDownLatch latch = new CountDownLatch(1);
ch.write(genBuffer(), 0L, null, new CompletionHandler<Integer,Void>() {
ch.write(genBuffer(), 0L, (Void)null, new CompletionHandler<Integer,Void>() {
public void completed(Integer result, Void att) {
invoker.set(Thread.currentThread());
latch.countDown();
......@@ -410,7 +410,7 @@ public class Basic {
// start write operation
final CountDownLatch latch = new CountDownLatch(1);
Future<Integer> res = ch.write(genBuffer(), 0L, null,
Future<Integer> res = ch.write(genBuffer(), 0L, (Void)null,
new CompletionHandler<Integer,Void>() {
public void completed(Integer result, Void att) {
}
......
......@@ -95,7 +95,7 @@ public class Basic {
final AtomicReference<Throwable> exception = new AtomicReference<Throwable>();
// start accepting
listener.accept(null, new CompletionHandler<AsynchronousSocketChannel,Void>() {
listener.accept((Void)null, new CompletionHandler<AsynchronousSocketChannel,Void>() {
public void completed(AsynchronousSocketChannel ch, Void att) {
try {
ch.close();
......
......@@ -181,7 +181,7 @@ public class Basic {
}
final AtomicReference<Throwable> connectException =
new AtomicReference<Throwable>();
ch.connect(server.address(), null, new CompletionHandler<Void,Void>() {
ch.connect(server.address(), (Void)null, new CompletionHandler<Void,Void>() {
public void completed(Void result, Void att) {
}
public void failed(Throwable exc, Void att) {
......@@ -332,7 +332,7 @@ public class Basic {
// start read operation
final CountDownLatch latch = new CountDownLatch(1);
ByteBuffer buf = ByteBuffer.allocate(1);
Future<Integer> res = ch.read(buf, null,
Future<Integer> res = ch.read(buf, (Void)null,
new CompletionHandler<Integer,Void>() {
public void completed(Integer result, Void att) {
}
......@@ -397,11 +397,11 @@ public class Basic {
// reads should complete immediately
final ByteBuffer dst = ByteBuffer.allocateDirect(src.capacity() + 100);
final CountDownLatch latch = new CountDownLatch(1);
ch.read(dst, null, new CompletionHandler<Integer,Void>() {
ch.read(dst, (Void)null, new CompletionHandler<Integer,Void>() {
public void completed(Integer result, Void att) {
int n = result;
if (n > 0) {
ch.read(dst, null, this);
ch.read(dst, (Void)null, this);
} else {
latch.countDown();
}
......@@ -450,10 +450,10 @@ public class Basic {
// read until the buffer is full
final ByteBuffer dst = ByteBuffer.allocateDirect(src.capacity());
final CountDownLatch latch = new CountDownLatch(1);
ch.read(dst, null, new CompletionHandler<Integer,Void>() {
ch.read(dst, (Void)null, new CompletionHandler<Integer,Void>() {
public void completed(Integer result, Void att) {
if (dst.hasRemaining()) {
ch.read(dst, null, this);
ch.read(dst, (Void)null, this);
} else {
latch.countDown();
}
......@@ -508,7 +508,7 @@ public class Basic {
// scattering read that completes ascynhronously
final CountDownLatch latch = new CountDownLatch(1);
ch.read(dsts, 0, dsts.length, 0L, TimeUnit.SECONDS, null,
ch.read(dsts, 0, dsts.length, 0L, TimeUnit.SECONDS, (Void)null,
new CompletionHandler<Long,Void>() {
public void completed(Long result, Void att) {
long n = result;
......@@ -536,7 +536,7 @@ public class Basic {
dsts[i].rewind();
}
long n = ch
.read(dsts, 0, dsts.length, 0L, TimeUnit.SECONDS, null, null).get();
.read(dsts, 0, dsts.length, 0L, TimeUnit.SECONDS, (Void)null, null).get();
if (n <= 0)
throw new RuntimeException("No bytes read");
......@@ -562,10 +562,10 @@ public class Basic {
// write all bytes and close connection when done
final ByteBuffer src = genBuffer();
ch.write(src, null, new CompletionHandler<Integer,Void>() {
ch.write(src, (Void)null, new CompletionHandler<Integer,Void>() {
public void completed(Integer result, Void att) {
if (src.hasRemaining()) {
ch.write(src, null, this);
ch.write(src, (Void)null, this);
} else {
try {
ch.close();
......@@ -616,7 +616,7 @@ public class Basic {
// write buffers (should complete immediately)
ByteBuffer[] srcs = genBuffers(1);
long n = ch
.write(srcs, 0, srcs.length, 0L, TimeUnit.SECONDS, null, null).get();
.write(srcs, 0, srcs.length, 0L, TimeUnit.SECONDS, (Void)null, null).get();
if (n <= 0)
throw new RuntimeException("No bytes written");
......@@ -629,7 +629,7 @@ public class Basic {
// write until socket buffer is full so as to create the conditions
// for when a write does not complete immediately
srcs = genBuffers(1);
ch.write(srcs, 0, srcs.length, 0L, TimeUnit.SECONDS, null,
ch.write(srcs, 0, srcs.length, 0L, TimeUnit.SECONDS, (Void)null,
new CompletionHandler<Long,Void>() {
public void completed(Long result, Void att) {
long n = result;
......@@ -639,7 +639,7 @@ public class Basic {
if (continueWriting.get()) {
ByteBuffer[] srcs = genBuffers(8);
ch.write(srcs, 0, srcs.length, 0L, TimeUnit.SECONDS,
null, this);
(Void)null, this);
}
}
public void failed(Throwable exc, Void att) {
......@@ -717,7 +717,7 @@ public class Basic {
// this read should timeout
ByteBuffer dst = ByteBuffer.allocate(512);
try {
ch.read(dst, 3, TimeUnit.SECONDS, null, null).get();
ch.read(dst, 3, TimeUnit.SECONDS, (Void)null, null).get();
throw new RuntimeException("Read did not timeout");
} catch (ExecutionException x) {
if (!(x.getCause() instanceof InterruptedByTimeoutException))
......
......@@ -99,7 +99,7 @@ public class StressLoopback {
void start() {
sentBuffer.position(0);
sentBuffer.limit(sentBuffer.capacity());
channel.write(sentBuffer, null, new CompletionHandler<Integer,Void> () {
channel.write(sentBuffer, (Void)null, new CompletionHandler<Integer,Void> () {
public void completed(Integer nwrote, Void att) {
bytesSent += nwrote;
if (finished) {
......@@ -107,7 +107,7 @@ public class StressLoopback {
} else {
sentBuffer.position(0);
sentBuffer.limit(sentBuffer.capacity());
channel.write(sentBuffer, null, this);
channel.write(sentBuffer, (Void)null, this);
}
}
public void failed(Throwable exc, Void att) {
......@@ -142,14 +142,14 @@ public class StressLoopback {
}
void start() {
channel.read(readBuffer, null, new CompletionHandler<Integer,Void> () {
channel.read(readBuffer, (Void)null, new CompletionHandler<Integer,Void> () {
public void completed(Integer nread, Void att) {
if (nread < 0) {
closeUnchecked(channel);
} else {
bytesRead += nread;
readBuffer.clear();
channel.read(readBuffer, null, this);
channel.read(readBuffer, (Void)null, this);
}
}
public void failed(Throwable exc, Void att) {
......
......@@ -22,7 +22,7 @@
*/
/* @test
* @bug 4313887 6838333
* @bug 4313887 6838333 6863864
* @summary Unit test for java.nio.file.Path createSymbolicLink,
* readSymbolicLink, and createLink methods
* @library ..
......@@ -31,7 +31,6 @@
import java.nio.file.*;
import java.nio.file.attribute.*;
import java.io.*;
import java.util.*;
public class Links {
......@@ -47,7 +46,7 @@ public class Links {
* Exercise createSymbolicLink and readLink methods
*/
static void testSymLinks(Path dir) throws IOException {
Path link = dir.resolve("link");
final Path link = dir.resolve("link");
// Check if sym links are supported
try {
......@@ -76,6 +75,63 @@ public class Links {
link.delete();
}
}
// Test links to directory
Path mydir = dir.resolve("mydir");
Path myfile = mydir.resolve("myfile");
try {
mydir.createDirectory();
myfile.createFile();
// link -> "mydir"
link.createSymbolicLink(mydir.getName());
assertTrue(link.readSymbolicLink().equals(mydir.getName()));
// Test access to directory via link
DirectoryStream<Path> stream = link.newDirectoryStream();
try {
boolean found = false;
for (Path entry: stream) {
if (entry.getName().equals(myfile.getName())) {
found = true;
break;
}
}
assertTrue(found);
} finally {
stream.close();
}
// Test link2 -> link -> mydir
final Path link2 = dir.resolve("link2");
Path target2 = link.getName();
link2.createSymbolicLink(target2);
try {
assertTrue(link2.readSymbolicLink().equals(target2));
link2.newDirectoryStream().close();
} finally {
link2.delete();
}
// Remove mydir and re-create link2 before re-creating mydir
// (This is a useful test on Windows to ensure that creating a
// sym link to a directory sym link creates the right type of link).
myfile.delete();
mydir.delete();
link2.createSymbolicLink(target2);
try {
assertTrue(link2.readSymbolicLink().equals(target2));
mydir.createDirectory();
link2.newDirectoryStream().close();
} finally {
link2.delete();
}
} finally {
myfile.deleteIfExists();
mydir.deleteIfExists();
link.deleteIfExists();
}
}
/**
......
......@@ -23,31 +23,56 @@
/*
* @test
* @bug 6857795
* @buf 6858589
* @summary krb5.conf ignored if system properties on realm and kdc are provided
*/
import sun.security.krb5.Config;
import sun.security.krb5.KrbException;
public class ConfPlusProp {
Config config;
public static void main(String[] args) throws Exception {
System.setProperty("java.security.krb5.realm", "R2");
System.setProperty("java.security.krb5.kdc", "k2");
new ConfPlusProp().run();
}
void refresh() throws Exception {
Config.refresh();
config = Config.getInstance();
}
void checkDefaultRealm(String r) throws Exception {
try {
if (!config.getDefaultRealm().equals(r)) {
throw new AssertionError("Default realm error");
}
} catch (Exception e) {
if (r != null) throw e;
}
}
void check(String r, String k) throws Exception {
try {
if (!config.getKDCList(r).equals(k)) {
throw new AssertionError(r + " kdc not " + k);
}
} catch (Exception e) {
if (k != null) throw e;
}
}
void run() throws Exception {
// No prop, only conf
// Point to a file with existing default_realm
System.setProperty("java.security.krb5.conf",
System.getProperty("test.src", ".") +"/confplusprop.conf");
Config config = Config.getInstance();
refresh();
if (!config.getDefaultRealm().equals("R2")) {
throw new Exception("Default realm error");
}
if (!config.getKDCList("R1").equals("k1")) {
throw new Exception("R1 kdc error");
}
if (!config.getKDCList("R2").equals("k2")) {
throw new Exception("R2 kdc error");
}
checkDefaultRealm("R1");
check("R1", "k1");
check("R2", "old");
check("R3", null);
if (!config.getDefault("forwardable", "libdefaults").equals("well")) {
throw new Exception("Extra config error");
}
......@@ -55,38 +80,66 @@ public class ConfPlusProp {
// Point to a file with no libdefaults
System.setProperty("java.security.krb5.conf",
System.getProperty("test.src", ".") +"/confplusprop2.conf");
Config.refresh();
refresh();
config = Config.getInstance();
checkDefaultRealm(null);
check("R1", "k12");
check("R2", "old");
check("R3", null);
if (!config.getDefaultRealm().equals("R2")) {
throw new Exception("Default realm error again");
}
if (!config.getKDCList("R1").equals("k12")) {
throw new Exception("R1 kdc error");
int version = System.getProperty("java.version").charAt(2) - '0';
System.out.println("JDK version is " + version);
// Zero-config is supported since 1.7
if (version >= 7) {
// Point to a non-existing file
System.setProperty("java.security.krb5.conf", "i-am-not-a file");
refresh();
checkDefaultRealm(null);
check("R1", null);
check("R2", null);
check("R3", null);
if (config.getDefault("forwardable", "libdefaults") != null) {
throw new Exception("Extra config error");
}
}
if (!config.getKDCList("R2").equals("k2")) {
throw new Exception("R2 kdc error");
// Add prop
System.setProperty("java.security.krb5.realm", "R2");
System.setProperty("java.security.krb5.kdc", "k2");
// Point to a file with existing default_realm
System.setProperty("java.security.krb5.conf",
System.getProperty("test.src", ".") +"/confplusprop.conf");
refresh();
checkDefaultRealm("R2");
check("R1", "k1");
check("R2", "k2");
check("R3", "k2");
if (!config.getDefault("forwardable", "libdefaults").equals("well")) {
throw new Exception("Extra config error");
}
// Point to a file with no libdefaults
System.setProperty("java.security.krb5.conf",
System.getProperty("test.src", ".") +"/confplusprop2.conf");
refresh();
checkDefaultRealm("R2");
check("R1", "k12");
check("R2", "k2");
check("R3", "k2");
// Point to a non-existing file
System.setProperty("java.security.krb5.conf", "i-am-not-a file");
Config.refresh();
refresh();
config = Config.getInstance();
if (!config.getDefaultRealm().equals("R2")) {
throw new Exception("Default realm error");
}
try {
config.getKDCList("R1");
throw new Exception("R1 is nowhere");
} catch (KrbException ke) {
// OK
}
if (!config.getKDCList("R2").equals("k2")) {
throw new Exception("R2 kdc error");
}
checkDefaultRealm("R2");
check("R1", "k2");
check("R2", "k2");
check("R3", "k2");
if (config.getDefault("forwardable", "libdefaults") != null) {
throw new Exception("Extra config error");
}
......
#
# Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
# CA 95054 USA or visit www.sun.com if you need additional information or
# have any questions.
#
# @test
# @bug 6561126
# @summary keytool should use larger default keysize for keypairs
#
# @run shell newsize7.sh
# set a few environment variables so that the shell-script can run stand-alone
# in the source directory
if [ "${TESTSRC}" = "" ] ; then
TESTSRC="."
fi
if [ "${TESTJAVA}" = "" ] ; then
JAVA_CMD=`which java`
TESTJAVA=`dirname $JAVA_CMD`/..
fi
# set platform-dependent variables
OS=`uname -s`
case "$OS" in
Windows_* )
FS="\\"
;;
* )
FS="/"
;;
esac
KSFILE=ns7.jks
KT="${TESTJAVA}${FS}bin${FS}keytool -keystore ns7.jks -storepass changeit -keypass changeit"
JAR="${TESTJAVA}${FS}bin${FS}jar"
JS="${TESTJAVA}${FS}bin${FS}jarsigner -keystore ns7.jks -storepass changeit"
rm ns7.*
$KT -genkeypair -alias me -dname CN=Me
touch ns7.txt
$JAR cvf ns7.jar ns7.txt
$JS ns7.jar me
$JAR xvf ns7.jar
grep SHA-256 META-INF/MANIFEST.MF || exit 1
grep SHA-256 META-INF/ME.SF || exit 2
#rm -rf META-INF
exit 0
/*
* Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
/*
* @test
* @bug 6561126
* @summary keytool should use larger default keysize for keypairs
*/
import java.io.File;
import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.cert.X509Certificate;
import java.security.interfaces.RSAPublicKey;
import sun.security.tools.KeyTool;
public class NewSize7 {
public static void main(String[] args) throws Exception {
String FILE = "newsize7-ks";
new File(FILE).delete();
KeyTool.main(("-debug -genkeypair -keystore " + FILE +
" -alias a -dname cn=c -storepass changeit" +
" -keypass changeit -keyalg rsa").split(" "));
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(FILE), null);
new File(FILE).delete();
RSAPublicKey r = (RSAPublicKey)ks.getCertificate("a").getPublicKey();
if (r.getModulus().bitLength() != 2048) {
throw new Exception("Bad keysize");
}
X509Certificate x = (X509Certificate)ks.getCertificate("a");
if (!x.getSigAlgName().equals("SHA256withRSA")) {
throw new Exception("Bad sigalg");
}
}
}
#
# Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
# CA 95054 USA or visit www.sun.com if you need additional information or
# have any questions.
#
# @test
# @bug 6847026
# @summary keytool should be able to generate certreq and cert without subject name
#
# @run shell emptysubject.sh
#
if [ "${TESTJAVA}" = "" ] ; then
JAVAC_CMD=`which javac`
TESTJAVA=`dirname $JAVAC_CMD`/..
fi
# set platform-dependent variables
OS=`uname -s`
case "$OS" in
Windows_* )
FS="\\"
;;
* )
FS="/"
;;
esac
KS=emptysubject.jks
KT="$TESTJAVA${FS}bin${FS}keytool -storepass changeit -keypass changeit -keystore $KS"
rm $KS
$KT -alias ca -dname CN=CA -genkeypair
$KT -alias me -dname CN=Me -genkeypair
# When -dname is recognized, SAN must be specfied, otherwise, -printcert fails.
$KT -alias me -certreq -dname "" | \
$KT -alias ca -gencert | $KT -printcert && exit 1
$KT -alias me -certreq | \
$KT -alias ca -gencert -dname "" | $KT -printcert && exit 2
$KT -alias me -certreq -dname "" | \
$KT -alias ca -gencert -ext san:c=email:me@me.com | \
$KT -printcert || exit 3
$KT -alias me -certreq | \
$KT -alias ca -gencert -dname "" -ext san:c=email:me@me.com | \
$KT -printcert || exit 4
exit 0
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册