diff --git a/make/java/java/Makefile b/make/java/java/Makefile index 8755a4c3a6ecdf523c51f6a64548589e09d95f32..b0e40530f4ee70a098dba62ef0a0acc8049fdb25 100644 --- a/make/java/java/Makefile +++ b/make/java/java/Makefile @@ -390,7 +390,7 @@ clean:: LOCALES_GEN_SH = localelist.sh $(GENSRCDIR)/sun/util/CoreResourceBundleControl.java: \ - $(SHARE_SRC)/classes/sun/util/CoreResourceBundleControl-XLocales.java $(LOCALES_GEN_SH) + $(SHARE_SRC)/classes/sun/util/CoreResourceBundleControl-XLocales.java.template $(LOCALES_GEN_SH) @$(prep-target) NAWK="$(NAWK)" SED="$(SED)" $(SH) $(LOCALES_GEN_SH) "$(JRE_NONEXIST_LOCALES)" \ $< $@ diff --git a/make/java/java/genlocales.gmk b/make/java/java/genlocales.gmk index bda003b9ce16aeb0eed4822192d4d536f3a6e045..3adb769490d8ceda025d52b537e475e994a64bf5 100644 --- a/make/java/java/genlocales.gmk +++ b/make/java/java/genlocales.gmk @@ -68,7 +68,7 @@ NonEuro_Resources_properties := $(FILES_compiled_properties) FILES_java := $(FILES_java_orig) FILES_compiled_properties := $(FILES_compiled_properties_orig) -LocaleDataMetaInfo_Src=$(SHARE_SRC)/classes/sun/util/LocaleDataMetaInfo-XLocales.java +LocaleDataMetaInfo_Src=$(SHARE_SRC)/classes/sun/util/LocaleDataMetaInfo-XLocales.java.template LocaleDataMetaInfo_Dest=$(GENSRCDIR)/sun/util/LocaleDataMetaInfo.java LOCALEGEN_SH=localegen.sh RESOURCE_NAMES="FormatData CollationData TimeZoneNames LocaleNames CurrencyNames CalendarData" diff --git a/make/java/java/localegen.sh b/make/java/java/localegen.sh index 8f79eaebb88c81c356cca7026bf413d3053474bc..a21c515dc1a661eb6074f5b6f744cdd989d3a2a7 100644 --- a/make/java/java/localegen.sh +++ b/make/java/java/localegen.sh @@ -27,7 +27,7 @@ # # This script is to generate the supported locale list string and replace the -# LocaleDataMetaInfo-XLocales.java in /src/share/classes/sun/util +# LocaleDataMetaInfo-XLocales.java.template in /src/share/classes/sun/util # # SORT, NAWK & SED is passed in as environment variables. # diff --git a/make/java/jli/Makefile b/make/java/jli/Makefile index 861d5375e921dfe62f626397ee4bb609cab2c9ff..eeb64ca6e3413cc1c3d450feca0ea7a0dec084d5 100644 --- a/make/java/jli/Makefile +++ b/make/java/jli/Makefile @@ -96,6 +96,7 @@ OTHER_CPPFLAGS += $(LIBARCH_DEFINES) ifneq ($(PLATFORM), windows) # UNIX systems + LD_RUNPATH_EXTRAS += .. LIB_LOCATION = $(LIBDIR)/$(LIBARCH)/jli # Note: its important to keep this order meaning -lc is the # last library otherwise it could cause compatibility issues diff --git a/make/java/main/java/Makefile b/make/java/main/java/Makefile index ae9ce618cdd7a4f90697332a20accdcfc04f8169..37fdf2bdd0f038350b40a9aa92b3538d5dbf8240 100644 --- a/make/java/main/java/Makefile +++ b/make/java/main/java/Makefile @@ -61,8 +61,5 @@ OTHER_CPPFLAGS += -DLAUNCHER_NAME='"$(LAUNCHER_NAME)"' ifeq ($(PLATFORM), solaris) LDFLAGS += -R$(OPENWIN_LIB) -endif - -ifeq ($(PLATFORM), solaris) LDFLAGS += -M mapfile-$(ARCH) endif diff --git a/make/java/nio/Makefile b/make/java/nio/Makefile index e0cb40839e8c318fccc9964f8bb10582899bc50e..455d7529f67767282d4a71a59fb3463e97685fef 100644 --- a/make/java/nio/Makefile +++ b/make/java/nio/Makefile @@ -834,7 +834,7 @@ $(SCH_GEN)/SocketOptionRegistry.java: $(GENSOR_EXE) GENCSSRC = $(BUILDDIR)/tools/CharsetMapping CHARSETMAPPING_JARFILE = $(BUILDTOOLJARDIR)/charsetmapping.jar -$(FILES_gensbcs_out): $(GENCSSRC)/SingleByte-X.java $(GENCSSRC)/sbcs +$(FILES_gensbcs_out): $(GENCSSRC)/SingleByte-X.java.template $(GENCSSRC)/sbcs @$(prep-target) $(BOOT_JAVA_CMD) -jar $(CHARSETMAPPING_JARFILE) $(GENCSSRC) $(SCS_GEN) sbcs diff --git a/make/java/redist/Makefile b/make/java/redist/Makefile index b4ca64e5c14f80017cfe53f260cb5ed4dcc581df..69d95a605777c7f126e9be8d3a38df6788d34a63 100644 --- a/make/java/redist/Makefile +++ b/make/java/redist/Makefile @@ -194,10 +194,8 @@ endif # For backwards compatability, make a link of the 32-bit client JVM to $(LIBDIR) IMPORT_LIST += $(LIB_LOCATION)/$(JVM_NAME) -# create a link from lib/libjvm.so to client/libjvm.so $(LIB_LOCATION)/$(JVM_NAME): $(LIB_LOCATION)/$(CLIENT_LOCATION)/$(JVM_NAME) @$(prep-target) - $(LN) -s $(CLIENT_LOCATION)/$(JVM_NAME) $@ # solaris ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ solaris endif # 32bit solaris diff --git a/make/netbeans/README b/make/netbeans/README index 9c713190034be8b58e9c2b60b8d0de8bb256b0ed..8f68dce0ee5c4604466988923480c796c1191307 100644 --- a/make/netbeans/README +++ b/make/netbeans/README @@ -411,7 +411,7 @@ Creating your own NetBeans project java/util/regex/,\ java/util/spi/,\ java/util/zip/,\ - **/*-XLocales.java + **/*-XLocales.java.template jtreg.tests=\ java/util/**/*Collection/ \ java/util/**/*Map/ \ diff --git a/make/sun/nio/Makefile b/make/sun/nio/Makefile index e83c6f1f36d80a83c0fdde9a6dc496627baf813f..4b46a1fb76d0b82c58e2c762943ed70909ba8c77 100644 --- a/make/sun/nio/Makefile +++ b/make/sun/nio/Makefile @@ -82,7 +82,9 @@ $(FILES_DAT): $(FILES_MAP) $(FILES_MAP) $(FILES_DAT) sjis0213 -$(FILES_genout_extcs): $(GENCSDATASRC)/SingleByte-X.java $(GENCSDATASRC)/DoubleByte-X.java \ +$(FILES_genout_extcs): \ + $(GENCSDATASRC)/SingleByte-X.java.template \ + $(GENCSDATASRC)/DoubleByte-X.java.template \ $(GENCSDATASRC)/extsbcs $(GENCSDATASRC)/dbcs @$(prep-target) $(RM) -r $(GENCSEXT) diff --git a/make/tools/CharsetMapping/DoubleByte-X.java b/make/tools/CharsetMapping/DoubleByte-X.java.template similarity index 100% rename from make/tools/CharsetMapping/DoubleByte-X.java rename to make/tools/CharsetMapping/DoubleByte-X.java.template diff --git a/make/tools/CharsetMapping/SingleByte-X.java b/make/tools/CharsetMapping/SingleByte-X.java.template similarity index 100% rename from make/tools/CharsetMapping/SingleByte-X.java rename to make/tools/CharsetMapping/SingleByte-X.java.template diff --git a/make/tools/src/build/tools/charsetmapping/GenerateDBCS.java b/make/tools/src/build/tools/charsetmapping/GenerateDBCS.java index f38e759c45699a2a734bcf6942a84de6e81257e9..27dc8719b950c38c996fe713b572758a390094e7 100644 --- a/make/tools/src/build/tools/charsetmapping/GenerateDBCS.java +++ b/make/tools/src/build/tools/charsetmapping/GenerateDBCS.java @@ -63,7 +63,7 @@ public class GenerateDBCS { int b2Min = toInteger(fields[8]); int b2Max = toInteger(fields[9]); System.out.printf("%s,%s,%s,%b,%s%n", clzName, csName, hisName, isASCII, pkgName); - genClass(args[0], args[1], "DoubleByte-X.java", + genClass(args[0], args[1], "DoubleByte-X.java.template", clzName, csName, hisName, pkgName, isASCII, type, b1Min, b1Max, b2Min, b2Max); diff --git a/make/tools/src/build/tools/charsetmapping/GenerateSBCS.java b/make/tools/src/build/tools/charsetmapping/GenerateSBCS.java index 8a57a6521bce9a439e7ef3729fe5f01b787f2f6a..cb6496e0a9965c537203d33210a2e11ecf574fc5 100644 --- a/make/tools/src/build/tools/charsetmapping/GenerateSBCS.java +++ b/make/tools/src/build/tools/charsetmapping/GenerateSBCS.java @@ -55,7 +55,7 @@ public class GenerateSBCS { String pkgName = fields[4]; System.out.printf("%s,%s,%s,%b,%s%n", clzName, csName, hisName, isASCII, pkgName); - genClass(args[0], args[1], "SingleByte-X.java", + genClass(args[0], args[1], "SingleByte-X.java.template", clzName, csName, hisName, pkgName, isASCII); } } diff --git a/src/share/bin/java.c b/src/share/bin/java.c index b8c0382b1d18c76ef98baaa7fac82e07c0b739b5..2494ce1ea2e5a1d4e246d296d53c1e81c585933a 100644 --- a/src/share/bin/java.c +++ b/src/share/bin/java.c @@ -1,5 +1,5 @@ /* - * Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1995-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 @@ -41,15 +41,13 @@ * options are turned into "-foo" options to the vm. This option * filtering is handled in a number of places in the launcher, some of * it in machine-dependent code. In this file, the function - * CheckJVMType removes vm style options and TranslateApplicationArgs - * removes "-J" prefixes. On unix platforms, the - * CreateExecutionEnvironment function from the unix java_md.c file - * processes and removes -d options. However, in case - * CreateExecutionEnvironment does not need to exec because - * LD_LIBRARY_PATH is set acceptably and the data model does not need - * to be changed, ParseArguments will screen out the redundant -d - * options and prevent them from being passed to the vm; this is done - * by RemovableOption. + * CheckJvmType removes vm style options and TranslateApplicationArgs + * removes "-J" prefixes. The CreateExecutionEnvironment function processes + * and removes -d options. On unix, there is a possibility that the running + * data model may not match to the desired data model, in this case an exec is + * required to start the desired model. If the data models match, then + * ParseArguments will remove the -d flags. If the data models do not match + * the CreateExecutionEnviroment will remove the -d flags. */ @@ -1891,11 +1889,11 @@ DumpState() * Return JNI_TRUE for an option string that has no effect but should * _not_ be passed on to the vm; return JNI_FALSE otherwise. On * Solaris SPARC, this screening needs to be done if: - * 1) LD_LIBRARY_PATH does _not_ need to be reset and - * 2) -d32 or -d64 is passed to a binary with a matching data model - * (the exec in SetLibraryPath removes -d options and points the - * exec to the proper binary). When this exec is not done, these options - * would end up getting passed onto the vm. + * -d32 or -d64 is passed to a binary with an unmatched data model + * (the exec in CreateExecutionEnvironment removes -d options and points the + * exec to the proper binary). In the case of when the data model and the + * requested version is matched, an exec would not occur, and these options + * were erroneously passed to the vm. */ jboolean RemovableOption(char * option) diff --git a/src/share/classes/com/sun/crypto/provider/HmacCore.java b/src/share/classes/com/sun/crypto/provider/HmacCore.java index 87d9e04bc0e315ed74ef2cacf9afbbd99dc4785c..5592a3e2a556669978b6e029b8c07d2ee2dd82ba 100644 --- a/src/share/classes/com/sun/crypto/provider/HmacCore.java +++ b/src/share/classes/com/sun/crypto/provider/HmacCore.java @@ -36,7 +36,7 @@ import java.security.spec.*; /** * This class constitutes the core of HMAC- algorithms, where - * can be SHA1 or MD5, etc. + * can be SHA1 or MD5, etc. See RFC 2104 for spec. * * It also contains the implementation classes for the SHA-256, * SHA-384, and SHA-512 HMACs. @@ -116,7 +116,7 @@ final class HmacCore implements Cloneable { } byte[] secret = key.getEncoded(); - if (secret == null || secret.length == 0) { + if (secret == null) { throw new InvalidKeyException("Missing key data"); } diff --git a/src/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java b/src/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java index 2613a025e403cc10f8350b98dad2c5853ebb38c8..90ed410b8311bf1c1f9c246d877b05833b7a1beb 100644 --- a/src/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java +++ b/src/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-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,21 +25,19 @@ package com.sun.crypto.provider; -import java.io.*; +import java.io.ObjectStreamException; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; import java.util.Arrays; import java.security.KeyRep; import java.security.GeneralSecurityException; -import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.spec.InvalidKeySpecException; import javax.crypto.Mac; import javax.crypto.SecretKey; import javax.crypto.spec.PBEKeySpec; -import javax.crypto.spec.SecretKeySpec; /** * This class represents a PBE key derived using PBKDF2 defined @@ -123,7 +121,7 @@ final class PBKDF2KeyImpl implements javax.crypto.interfaces.PBEKey { this.key = deriveKey(prf, passwdBytes, salt, iterCount, keyLength); } - private static byte[] deriveKey(Mac prf, byte[] password, byte[] salt, + private static byte[] deriveKey(final Mac prf, final byte[] password, byte[] salt, int iterCount, int keyLengthInBit) { int keyLength = keyLengthInBit/8; byte[] key = new byte[keyLength]; @@ -133,7 +131,34 @@ final class PBKDF2KeyImpl implements javax.crypto.interfaces.PBEKey { int intR = keyLength - (intL - 1)*hlen; // residue byte[] ui = new byte[hlen]; byte[] ti = new byte[hlen]; - SecretKey macKey = new SecretKeySpec(password, prf.getAlgorithm()); + // SecretKeySpec cannot be used, since password can be empty here. + SecretKey macKey = new SecretKey() { + @Override + public String getAlgorithm() { + return prf.getAlgorithm(); + } + @Override + public String getFormat() { + return "RAW"; + } + @Override + public byte[] getEncoded() { + return password; + } + @Override + public int hashCode() { + return Arrays.hashCode(password) * 41 + + prf.getAlgorithm().toLowerCase().hashCode(); + } + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (this.getClass() != obj.getClass()) return false; + SecretKey sk = (SecretKey)obj; + return prf.getAlgorithm().equalsIgnoreCase(sk.getAlgorithm()) && + Arrays.equals(password, sk.getEncoded()); + } + }; prf.init(macKey); byte[] ibytes = new byte[4]; @@ -230,7 +255,7 @@ final class PBKDF2KeyImpl implements javax.crypto.interfaces.PBEKey { * @throws ObjectStreamException if a new object representing * this PBE key could not be created */ - private Object writeReplace() throws java.io.ObjectStreamException { + private Object writeReplace() throws ObjectStreamException { return new KeyRep(KeyRep.Type.SECRET, getAlgorithm(), getFormat(), getEncoded()); } diff --git a/src/share/classes/com/sun/jmx/mbeanserver/Introspector.java b/src/share/classes/com/sun/jmx/mbeanserver/Introspector.java index 09b5701a95e2c86b9841421881e38a2c4d143453..a841e992b4a200dee0625d0c39cf04b4c8473f8e 100644 --- a/src/share/classes/com/sun/jmx/mbeanserver/Introspector.java +++ b/src/share/classes/com/sun/jmx/mbeanserver/Introspector.java @@ -26,6 +26,7 @@ package com.sun.jmx.mbeanserver; import java.lang.annotation.Annotation; +import java.lang.ref.SoftReference; import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Constructor; import java.lang.reflect.Method; @@ -33,8 +34,13 @@ import java.lang.reflect.Modifier; import java.lang.reflect.Proxy; import java.lang.reflect.UndeclaredThrowableException; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; +import java.util.List; +import java.util.LinkedList; +import java.util.Locale; import java.util.Map; +import java.util.WeakHashMap; import javax.management.Descriptor; import javax.management.DescriptorKey; @@ -506,11 +512,25 @@ public class Introspector { } else { // Java Beans introspection // - BeanInfo bi = java.beans.Introspector.getBeanInfo(complex.getClass()); - PropertyDescriptor[] pds = bi.getPropertyDescriptors(); - for (PropertyDescriptor pd : pds) - if (pd.getName().equals(element)) - return pd.getReadMethod().invoke(complex); + Class clazz = complex.getClass(); + Method readMethod = null; + if (BeansHelper.isAvailable()) { + Object bi = BeansHelper.getBeanInfo(clazz); + Object[] pds = BeansHelper.getPropertyDescriptors(bi); + for (Object pd: pds) { + if (BeansHelper.getPropertyName(pd).equals(element)) { + readMethod = BeansHelper.getReadMethod(pd); + break; + } + } + } else { + // Java Beans not available so use simple introspection + // to locate method + readMethod = SimpleIntrospector.getReadMethod(clazz, element); + } + if (readMethod != null) + return readMethod.invoke(complex); + throw new AttributeNotFoundException( "Could not find the getter method for the property " + element + " using the Java Beans introspector"); @@ -524,4 +544,235 @@ public class Introspector { new AttributeNotFoundException(e.getMessage()), e); } } + + /** + * A simple introspector that uses reflection to analyze a class and + * identify its "getter" methods. This class is intended for use only when + * Java Beans is not present (which implies that there isn't explicit + * information about the bean available). + */ + private static class SimpleIntrospector { + private SimpleIntrospector() { } + + private static final String GET_METHOD_PREFIX = "get"; + private static final String IS_METHOD_PREFIX = "is"; + + // cache to avoid repeated lookups + private static final Map,SoftReference>> cache = + Collections.synchronizedMap( + new WeakHashMap,SoftReference>> ()); + + /** + * Returns the list of methods cached for the given class, or {@code null} + * if not cached. + */ + private static List getCachedMethods(Class clazz) { + // return cached methods if possible + SoftReference> ref = cache.get(clazz); + if (ref != null) { + List cached = ref.get(); + if (cached != null) + return cached; + } + return null; + } + + /** + * Returns {@code true} if the given method is a "getter" method (where + * "getter" method is a public method of the form getXXX or "boolean + * isXXX") + */ + static boolean isReadMethod(Method method) { + // ignore static methods + int modifiers = method.getModifiers(); + if (Modifier.isStatic(modifiers)) + return false; + + String name = method.getName(); + Class[] paramTypes = method.getParameterTypes(); + int paramCount = paramTypes.length; + + if (paramCount == 0 && name.length() > 2) { + // boolean isXXX() + if (name.startsWith(IS_METHOD_PREFIX)) + return (method.getReturnType() == boolean.class); + // getXXX() + if (name.length() > 3 && name.startsWith(GET_METHOD_PREFIX)) + return (method.getReturnType() != void.class); + } + return false; + } + + /** + * Returns the list of "getter" methods for the given class. The list + * is ordered so that isXXX methods appear before getXXX methods - this + * is for compatability with the JavaBeans Introspector. + */ + static List getReadMethods(Class clazz) { + // return cached result if available + List cachedResult = getCachedMethods(clazz); + if (cachedResult != null) + return cachedResult; + + // get list of public methods, filtering out methods that have + // been overridden to return a more specific type. + List methods = + StandardMBeanIntrospector.getInstance().getMethods(clazz); + methods = MBeanAnalyzer.eliminateCovariantMethods(methods); + + // filter out the non-getter methods + List result = new LinkedList(); + for (Method m: methods) { + if (isReadMethod(m)) { + // favor isXXX over getXXX + if (m.getName().startsWith(IS_METHOD_PREFIX)) { + result.add(0, m); + } else { + result.add(m); + } + } + } + + // add result to cache + cache.put(clazz, new SoftReference>(result)); + + return result; + } + + /** + * Returns the "getter" to read the given property from the given class or + * {@code null} if no method is found. + */ + static Method getReadMethod(Class clazz, String property) { + // first character in uppercase (compatability with JavaBeans) + property = property.substring(0, 1).toUpperCase(Locale.ENGLISH) + + property.substring(1); + String getMethod = GET_METHOD_PREFIX + property; + String isMethod = IS_METHOD_PREFIX + property; + for (Method m: getReadMethods(clazz)) { + String name = m.getName(); + if (name.equals(isMethod) || name.equals(getMethod)) { + return m; + } + } + return null; + } + } + + /** + * A class that provides access to the JavaBeans Introspector and + * PropertyDescriptors without creating a static dependency on java.beans. + */ + private static class BeansHelper { + private static final Class introspectorClass = + getClass("java.beans.Introspector"); + private static final Class beanInfoClass = + (introspectorClass == null) ? null : getClass("java.beans.BeanInfo"); + private static final Class getPropertyDescriptorClass = + (beanInfoClass == null) ? null : getClass("java.beans.PropertyDescriptor"); + + private static final Method getBeanInfo = + getMethod(introspectorClass, "getBeanInfo", Class.class); + private static final Method getPropertyDescriptors = + getMethod(beanInfoClass, "getPropertyDescriptors"); + private static final Method getPropertyName = + getMethod(getPropertyDescriptorClass, "getName"); + private static final Method getReadMethod = + getMethod(getPropertyDescriptorClass, "getReadMethod"); + + private static Class getClass(String name) { + try { + return Class.forName(name, true, null); + } catch (ClassNotFoundException e) { + return null; + } + } + private static Method getMethod(Class clazz, + String name, + Class... paramTypes) + { + if (clazz != null) { + try { + return clazz.getMethod(name, paramTypes); + } catch (NoSuchMethodException e) { + throw new AssertionError(e); + } + } else { + return null; + } + } + + private BeansHelper() { } + + /** + * Returns {@code true} if java.beans is available. + */ + static boolean isAvailable() { + return introspectorClass != null; + } + + /** + * Invokes java.beans.Introspector.getBeanInfo(Class) + */ + static Object getBeanInfo(Class clazz) throws Exception { + try { + return getBeanInfo.invoke(null, clazz); + } catch (InvocationTargetException e) { + Throwable cause = e.getCause(); + if (cause instanceof Exception) + throw (Exception)cause; + throw new AssertionError(e); + } catch (IllegalAccessException iae) { + throw new AssertionError(iae); + } + } + + /** + * Invokes java.beans.BeanInfo.getPropertyDescriptors() + */ + static Object[] getPropertyDescriptors(Object bi) { + try { + return (Object[])getPropertyDescriptors.invoke(bi); + } catch (InvocationTargetException e) { + Throwable cause = e.getCause(); + if (cause instanceof RuntimeException) + throw (RuntimeException)cause; + throw new AssertionError(e); + } catch (IllegalAccessException iae) { + throw new AssertionError(iae); + } + } + + /** + * Invokes java.beans.PropertyDescriptor.getName() + */ + static String getPropertyName(Object pd) { + try { + return (String)getPropertyName.invoke(pd); + } catch (InvocationTargetException e) { + Throwable cause = e.getCause(); + if (cause instanceof RuntimeException) + throw (RuntimeException)cause; + throw new AssertionError(e); + } catch (IllegalAccessException iae) { + throw new AssertionError(iae); + } + } + + /** + * Invokes java.beans.PropertyDescriptor.getReadMethod() + */ + static Method getReadMethod(Object pd) { + try { + return (Method)getReadMethod.invoke(pd); + } catch (InvocationTargetException e) { + Throwable cause = e.getCause(); + if (cause instanceof RuntimeException) + throw (RuntimeException)cause; + throw new AssertionError(e); + } catch (IllegalAccessException iae) { + throw new AssertionError(iae); + } + } + } } diff --git a/src/share/classes/com/sun/jmx/mbeanserver/MBeanIntrospector.java b/src/share/classes/com/sun/jmx/mbeanserver/MBeanIntrospector.java index 9edde66faf2216b0d3f6a75341a63dc1a6f8588e..17f31d16a9e80f25188e5b57e7424dc7f5fd72a9 100644 --- a/src/share/classes/com/sun/jmx/mbeanserver/MBeanIntrospector.java +++ b/src/share/classes/com/sun/jmx/mbeanserver/MBeanIntrospector.java @@ -175,7 +175,7 @@ abstract class MBeanIntrospector { /** * Get the methods to be analyzed to build the MBean interface. */ - List getMethods(final Class mbeanType) throws Exception { + List getMethods(final Class mbeanType) { return Arrays.asList(mbeanType.getMethods()); } diff --git a/src/share/classes/com/sun/security/auth/PolicyFile.java b/src/share/classes/com/sun/security/auth/PolicyFile.java index a4075ba0974d0f466a9f519c1de50675e236210b..9d3e676513461e2e6bc468c31d4f4c569946e901 100644 --- a/src/share/classes/com/sun/security/auth/PolicyFile.java +++ b/src/share/classes/com/sun/security/auth/PolicyFile.java @@ -34,8 +34,6 @@ import java.util.*; import java.security.AccessController; import java.security.CodeSource; -import java.security.Identity; -import java.security.IdentityScope; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.Permission; @@ -267,7 +265,7 @@ public class PolicyFile extends javax.security.auth.Policy { private boolean initialized = false; private boolean expandProperties = true; - private boolean ignoreIdentityScope = false; + private boolean ignoreIdentityScope = true; // for use with the reflection API @@ -459,9 +457,6 @@ public class PolicyFile extends javax.security.auth.Policy { } } - /** the scope to check */ - private static IdentityScope scope = null; - /** * Checks public key. If it is marked as trusted in * the identity database, add it to the policy diff --git a/src/share/classes/com/sun/security/jgss/ExtendedGSSContext.java b/src/share/classes/com/sun/security/jgss/ExtendedGSSContext.java index dc7a3556d7d82154a84cdaeee55cc1f0dce1cd81..1ac610d8880dd209190fdee16527470d640decf2 100644 --- a/src/share/classes/com/sun/security/jgss/ExtendedGSSContext.java +++ b/src/share/classes/com/sun/security/jgss/ExtendedGSSContext.java @@ -99,4 +99,58 @@ public interface ExtendedGSSContext extends GSSContext { */ public Object inquireSecContext(InquireType type) throws GSSException; + + /** + * Requests that the delegation policy be respected. When a true value is + * requested, the underlying context would use the delegation policy + * defined by the environment as a hint to determine whether credentials + * delegation should be performed. This request can only be made on the + * context initiator's side and it has to be done prior to the first + * call to initSecContext. + *

+ * When this flag is false, delegation will only be tried when the + * {@link GSSContext#requestCredDeleg(boolean) credentials delegation flag} + * is true. + *

+ * When this flag is true but the + * {@link GSSContext#requestCredDeleg(boolean) credentials delegation flag} + * is false, delegation will be only tried if the delegation policy permits + * delegation. + *

+ * When both this flag and the + * {@link GSSContext#requestCredDeleg(boolean) credentials delegation flag} + * are true, delegation will be always tried. However, if the delegation + * policy does not permit delegation, the value of + * {@link #getDelegPolicyState} will be false, even + * if delegation is performed successfully. + *

+ * In any case, if the delegation is not successful, the value returned + * by {@link GSSContext#getCredDelegState()} is false, and the value + * returned by {@link #getDelegPolicyState()} is also false. + *

+ * Not all mechanisms support delegation policy. Therefore, the + * application should check to see if the request was honored with the + * {@link #getDelegPolicyState() getDelegPolicyState} method. When + * delegation policy is not supported, requestDelegPolicy + * should return silently without throwing an exception. + *

+ * Note: for the Kerberos 5 mechanism, the delegation policy is expressed + * through the OK-AS-DELEGATE flag in the service ticket. When it's true, + * the KDC permits delegation to the target server. In a cross-realm + * environment, in order for delegation be permitted, all cross-realm TGTs + * on the authentication path must also have the OK-AS-DELAGATE flags set. + * @param state true if the policy should be respected + * @throws GSSException containing the following + * major error codes: + * {@link GSSException#FAILURE GSSException.FAILURE} + */ + public void requestDelegPolicy(boolean state) throws GSSException; + + /** + * Returns the delegation policy response. Called after a security context + * is established. This method can be only called on the initiator's side. + * See {@link ExtendedGSSContext#requestDelegPolicy}. + * @return the delegation policy response + */ + public boolean getDelegPolicyState(); } diff --git a/src/share/classes/com/sun/tools/hat/internal/model/JavaStatic.java b/src/share/classes/com/sun/tools/hat/internal/model/JavaStatic.java index 36f4e0e228dd31d29097246ec14edc2760ca5442..86064914ea64d71cc295b039567ed089694bac43 100644 --- a/src/share/classes/com/sun/tools/hat/internal/model/JavaStatic.java +++ b/src/share/classes/com/sun/tools/hat/internal/model/JavaStatic.java @@ -57,7 +57,10 @@ public class JavaStatic { id = ((JavaObjectRef)value).getId(); } value = value.dereference(snapshot, field); - if (value.isHeapAllocated()) { + if (value.isHeapAllocated() && + clazz.getLoader() == snapshot.getNullThing()) { + // static fields are only roots if they are in classes + // loaded by the root classloader. JavaHeapObject ho = (JavaHeapObject) value; String s = "Static reference from " + clazz.getName() + "." + field.getName(); diff --git a/src/share/classes/com/sun/tracing/ProviderFactory.java b/src/share/classes/com/sun/tracing/ProviderFactory.java index 768a6bebb8df931f8aa34da6463f5c3336c8ea30..1a4f064ff51528f4d0ba5a14bd50f32640719d7c 100644 --- a/src/share/classes/com/sun/tracing/ProviderFactory.java +++ b/src/share/classes/com/sun/tracing/ProviderFactory.java @@ -4,7 +4,10 @@ package com.sun.tracing; import java.util.HashSet; import java.io.PrintStream; import java.lang.reflect.Field; -import java.util.logging.Logger; +import java.security.AccessController; +import java.security.PrivilegedActionException; +import java.security.PrivilegedExceptionAction; +import sun.security.action.GetPropertyAction; import sun.tracing.NullProviderFactory; import sun.tracing.PrintStreamProviderFactory; @@ -52,23 +55,17 @@ public abstract class ProviderFactory { HashSet factories = new HashSet(); // Try to instantiate a DTraceProviderFactory - String prop = null; - try { prop = System.getProperty("com.sun.tracing.dtrace"); } - catch (java.security.AccessControlException e) { - Logger.getAnonymousLogger().fine( - "Cannot access property com.sun.tracing.dtrace"); - } + String prop = AccessController.doPrivileged( + new GetPropertyAction("com.sun.tracing.dtrace")); + if ( (prop == null || !prop.equals("disable")) && DTraceProviderFactory.isSupported() ) { factories.add(new DTraceProviderFactory()); } // Try to instantiate an output stream factory - try { prop = System.getProperty("sun.tracing.stream"); } - catch (java.security.AccessControlException e) { - Logger.getAnonymousLogger().fine( - "Cannot access property sun.tracing.stream"); - } + prop = AccessController.doPrivileged( + new GetPropertyAction("sun.tracing.stream")); if (prop != null) { for (String spec : prop.split(",")) { PrintStream ps = getPrintStreamFromSpec(spec); @@ -89,22 +86,29 @@ public abstract class ProviderFactory { } } - private static PrintStream getPrintStreamFromSpec(String spec) { + private static PrintStream getPrintStreamFromSpec(final String spec) { try { // spec is in the form of ., where is // a fully specified class name, and is a static member // in that class. The must be a 'PrintStream' or subtype // in order to be used. - int fieldpos = spec.lastIndexOf('.'); - Class cls = Class.forName(spec.substring(0, fieldpos)); - Field f = cls.getField(spec.substring(fieldpos + 1)); - Class fieldType = f.getType(); + final int fieldpos = spec.lastIndexOf('.'); + final Class cls = Class.forName(spec.substring(0, fieldpos)); + + Field f = AccessController.doPrivileged(new PrivilegedExceptionAction() { + public Field run() throws NoSuchFieldException { + return cls.getField(spec.substring(fieldpos + 1)); + } + }); + return (PrintStream)f.get(null); - } catch (Exception e) { - Logger.getAnonymousLogger().warning( - "Could not parse sun.tracing.stream property: " + e); + } catch (ClassNotFoundException e) { + throw new AssertionError(e); + } catch (IllegalAccessException e) { + throw new AssertionError(e); + } catch (PrivilegedActionException e) { + throw new AssertionError(e); } - return null; } } diff --git a/src/share/classes/java/lang/ClassLoader.java b/src/share/classes/java/lang/ClassLoader.java index 323240b395c0f491ba40359ca3f729bd87892f5a..bb4ea98694b31896055a6443c5549eebd4eaaf4d 100644 --- a/src/share/classes/java/lang/ClassLoader.java +++ b/src/share/classes/java/lang/ClassLoader.java @@ -175,15 +175,8 @@ import sun.security.util.SecurityConstants; public abstract class ClassLoader { private static native void registerNatives(); - - // Set of classes which are registered as parallel capable class loaders - private static final Set> parallelLoaders - = Collections.newSetFromMap(Collections.synchronizedMap - (new WeakHashMap, Boolean>())); - static { registerNatives(); - parallelLoaders.add(ClassLoader.class); } // The parent class loader for delegation @@ -191,6 +184,52 @@ public abstract class ClassLoader { // must be added *after* it. private final ClassLoader parent; + /** + * Encapsulates the set of parallel capable loader types. + */ + private static class ParallelLoaders { + private ParallelLoaders() {} + + // the set of parallel capable loader types + private static final Set> loaderTypes = + Collections.newSetFromMap( + new WeakHashMap, Boolean>()); + static { + synchronized (loaderTypes) { loaderTypes.add(ClassLoader.class); } + } + + /** + * Registers the given class loader type as parallel capabale. + * Returns {@code true} is successfully registered; {@code false} if + * loader's super class is not registered. + */ + static boolean register(Class c) { + synchronized (loaderTypes) { + if (loaderTypes.contains(c.getSuperclass())) { + // register the class loader as parallel capable + // if and only if all of its super classes are. + // Note: given current classloading sequence, if + // the immediate super class is parallel capable, + // all the super classes higher up must be too. + loaderTypes.add(c); + return true; + } else { + return false; + } + } + } + + /** + * Returns {@code true} if the given class loader type is + * registered as parallel capable. + */ + static boolean isRegistered(Class c) { + synchronized (loaderTypes) { + return loaderTypes.contains(c); + } + } + } + // Maps class name to the corresponding lock object when the current // class loader is parallel capable. // Note: VM also uses this field to decide if the current class loader @@ -237,7 +276,7 @@ public abstract class ClassLoader { private ClassLoader(Void unused, ClassLoader parent) { this.parent = parent; - if (parallelLoaders.contains(this.getClass())) { + if (ParallelLoaders.isRegistered(this.getClass())) { parallelLockMap = new ConcurrentHashMap(); package2certs = new ConcurrentHashMap(); domains = @@ -1194,24 +1233,7 @@ public abstract class ClassLoader { * @since 1.7 */ protected static boolean registerAsParallelCapable() { - Class caller = getCaller(1); - Class superCls = caller.getSuperclass(); - boolean result = false; - // Explicit synchronization needed for composite action - synchronized (parallelLoaders) { - if (!parallelLoaders.contains(caller)) { - if (parallelLoaders.contains(superCls)) { - // register the immediate caller as parallel capable - // if and only if all of its super classes are. - // Note: given current classloading sequence, if - // the immediate super class is parallel capable, - // all the super classes higher up must be too. - result = true; - parallelLoaders.add(caller); - } - } else result = true; - } - return result; + return ParallelLoaders.register(getCaller(1)); } /** @@ -2174,4 +2196,3 @@ class SystemClassLoaderAction return sys; } } - diff --git a/src/share/classes/java/lang/System.java b/src/share/classes/java/lang/System.java index b0c46528cbdfb64bd3b3cf7bf6a9351d6cded2f4..3d55a2eaea41fc9dd6d8d547581dc7c56d839d34 100644 --- a/src/share/classes/java/lang/System.java +++ b/src/share/classes/java/lang/System.java @@ -619,6 +619,20 @@ public final class System { return props; } + /** + * Returns the system-dependent line separator string. It always + * returns the same value - the initial value of the {@linkplain + * #getProperty(String) system property} {@code line.separator}. + * + *

On UNIX systems, it returns {@code "\n"}; on Microsoft + * Windows systems it returns {@code "\r\n"}. + */ + public static String lineSeparator() { + return lineSeparator; + } + + private static String lineSeparator; + /** * Sets the system properties to the Properties * argument. @@ -1104,6 +1118,7 @@ public final class System { private static void initializeSystemClass() { props = new Properties(); initProperties(props); + lineSeparator = props.getProperty("line.separator"); sun.misc.Version.init(); // Workaround until DownloadManager initialization is revisited. @@ -1192,7 +1207,7 @@ public final class System { } /* returns the class of the caller. */ - static Class getCallerClass() { + static Class getCallerClass() { // NOTE use of more generic Reflection.getCallerClass() return Reflection.getCallerClass(3); } diff --git a/src/share/classes/java/net/CookieManager.java b/src/share/classes/java/net/CookieManager.java index 57038fcdbf2b04c84fb4b82594e8ce3f5bbc4835..986daeff3378b3bbf5f24a65261b0c579662dbca 100644 --- a/src/share/classes/java/net/CookieManager.java +++ b/src/share/classes/java/net/CookieManager.java @@ -30,6 +30,7 @@ import java.util.List; import java.util.Collections; import java.util.Comparator; import java.io.IOException; +import sun.util.logging.PlatformLogger; /** * CookieManager provides a concrete implementation of {@link CookieHandler}, @@ -263,6 +264,7 @@ public class CookieManager extends CookieHandler if (cookieJar == null) return; + PlatformLogger logger = PlatformLogger.getLogger("java.net.CookieManager"); for (String headerKey : responseHeaders.keySet()) { // RFC 2965 3.2.2, key must be 'Set-Cookie2' // we also accept 'Set-Cookie' here for backward compatibility @@ -277,7 +279,16 @@ public class CookieManager extends CookieHandler for (String headerValue : responseHeaders.get(headerKey)) { try { - List cookies = HttpCookie.parse(headerValue); + List cookies; + try { + cookies = HttpCookie.parse(headerValue); + } catch (IllegalArgumentException e) { + // Bogus header, make an empty list and log the error + cookies = java.util.Collections.EMPTY_LIST; + if (logger.isLoggable(PlatformLogger.SEVERE)) { + logger.severe("Invalid cookie for " + uri + ": " + headerValue); + } + } for (HttpCookie cookie : cookies) { if (cookie.getPath() == null) { // If no path is specified, then by default diff --git a/src/share/classes/java/net/HttpCookie.java b/src/share/classes/java/net/HttpCookie.java index bd16d4f272353598f100c005fd54d7f6ee650fbe..be82cc3efbd8abe938ef22790b7c9bbf3dd9999d 100644 --- a/src/share/classes/java/net/HttpCookie.java +++ b/src/share/classes/java/net/HttpCookie.java @@ -1036,7 +1036,7 @@ public final class HttpCookie implements Cloneable { int version = Integer.parseInt(attrValue); cookie.setVersion(version); } catch (NumberFormatException ignored) { - throw new IllegalArgumentException("Illegal cookie version attribute"); + // Just ignore bogus version, it will default to 0 or 1 } } }); @@ -1147,12 +1147,15 @@ public final class HttpCookie implements Cloneable { } private static String stripOffSurroundingQuote(String str) { - if (str != null && str.length() > 0 && + if (str != null && str.length() > 2 && str.charAt(0) == '"' && str.charAt(str.length() - 1) == '"') { return str.substring(1, str.length() - 1); - } else { - return str; } + if (str != null && str.length() > 2 && + str.charAt(0) == '\'' && str.charAt(str.length() - 1) == '\'') { + return str.substring(1, str.length() - 1); + } + return str; } private static boolean equalsIgnoreCase(String s, String t) { diff --git a/src/share/classes/java/nio/channels/Selector.java b/src/share/classes/java/nio/channels/Selector.java index 46709d16fe15a7da25088062e95e8a41318eef57..e31555c122d0a78e62a59637075b0179d27d9935 100644 --- a/src/share/classes/java/nio/channels/Selector.java +++ b/src/share/classes/java/nio/channels/Selector.java @@ -25,6 +25,7 @@ package java.nio.channels; +import java.io.Closeable; import java.io.IOException; import java.nio.channels.spi.SelectorProvider; import java.util.Set; @@ -202,7 +203,7 @@ import java.util.Set; * @see SelectionKey */ -public abstract class Selector { +public abstract class Selector implements Closeable { /** * Initializes a new instance of this class. diff --git a/src/share/classes/java/util/DualPivotQuicksort.java b/src/share/classes/java/util/DualPivotQuicksort.java index b368d0b95b1046e9f0d468a3c7b62010230d0173..07cda259dd49bbeb6e84f9ec58301694987d965e 100644 --- a/src/share/classes/java/util/DualPivotQuicksort.java +++ b/src/share/classes/java/util/DualPivotQuicksort.java @@ -36,12 +36,12 @@ package java.util; * @author Jon Bentley * @author Josh Bloch * - * @version 2009.11.16 m765.827.v12a + * @version 2009.11.29 m765.827.12i */ final class DualPivotQuicksort { /** - * Suppresses default constructor. + * Prevents instantiation. */ private DualPivotQuicksort() {} @@ -84,7 +84,7 @@ final class DualPivotQuicksort { * Sorts the specified range of the array into ascending order. The range * to be sorted extends from the index {@code fromIndex}, inclusive, to * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex}, - * the range to be sorted is empty. + * the range to be sorted is empty (and the call is a no-op). * * @param a the array to be sorted * @param fromIndex the index of the first element, inclusive, to be sorted @@ -101,8 +101,8 @@ final class DualPivotQuicksort { /** * Sorts the specified range of the array into ascending order. This * method differs from the public {@code sort} method in that the - * {@code right} index is inclusive, and it does no range checking on - * {@code left} or {@code right}. + * {@code right} index is inclusive, and it does no range checking + * on {@code left} or {@code right}. * * @param a the array to be sorted * @param left the index of the first element, inclusive, to be sorted @@ -111,13 +111,13 @@ final class DualPivotQuicksort { private static void doSort(int[] a, int left, int right) { // Use insertion sort on tiny arrays if (right - left + 1 < INSERTION_SORT_THRESHOLD) { - for (int k = left + 1; k <= right; k++) { - int ak = a[k]; + for (int i = left + 1; i <= right; i++) { + int ai = a[i]; int j; - for (j = k - 1; j >= left && ak < a[j]; j--) { + for (j = i - 1; j >= left && ai < a[j]; j--) { a[j + 1] = a[j]; } - a[j + 1] = ak; + a[j + 1] = ai; } } else { // Use Dual-Pivot Quicksort on large arrays dualPivotQuicksort(a, left, right); @@ -162,7 +162,7 @@ final class DualPivotQuicksort { * second terciles of the array. Note that pivot1 <= pivot2. * * The pivots are stored in local variables, and the first and - * the last of the sorted elements are moved to the locations + * the last of the elements to be sorted are moved to the locations * formerly occupied by the pivots. When partitioning is complete, * the pivots are swapped back into their final positions, and * excluded from subsequent sorting. @@ -170,27 +170,26 @@ final class DualPivotQuicksort { int pivot1 = ae2; a[e2] = a[left]; int pivot2 = ae4; a[e4] = a[right]; - /* - * Partitioning - * - * left part center part right part - * ------------------------------------------------------------ - * [ < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 ] - * ------------------------------------------------------------ - * ^ ^ ^ - * | | | - * less k great - */ - // Pointers int less = left + 1; // The index of first element of center part int great = right - 1; // The index before first element of right part - boolean pivotsDiffer = pivot1 != pivot2; + boolean pivotsDiffer = (pivot1 != pivot2); if (pivotsDiffer) { /* + * Partitioning: + * + * left part center part right part + * +------------------------------------------------------------+ + * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 | + * +------------------------------------------------------------+ + * ^ ^ ^ + * | | | + * less k great + * * Invariants: + * * all in (left, less) < pivot1 * pivot1 <= all in [less, k) <= pivot2 * all in (great, right) > pivot2 @@ -200,37 +199,37 @@ final class DualPivotQuicksort { outer: for (int k = less; k <= great; k++) { int ak = a[k]; - if (ak < pivot1) { - if (k > less) { + if (ak < pivot1) { // Move a[k] to left part + if (k != less) { a[k] = a[less]; a[less] = ak; } less++; - } else if (ak > pivot2) { + } else if (ak > pivot2) { // Move a[k] to right part while (a[great] > pivot2) { - if (k == great--) { + if (great-- == k) { break outer; } } - a[k] = a[great]; - a[great--] = ak; - - if ((ak = a[k]) < pivot1) { + if (a[great] < pivot1) { a[k] = a[less]; - a[less++] = ak; + a[less++] = a[great]; + a[great--] = ak; + } else { // pivot1 <= a[great] <= pivot2 + a[k] = a[great]; + a[great--] = ak; } } } } else { // Pivots are equal /* - * Partition degenerates to the traditional 3-way - * (or "Dutch National Flag") partition: + * Partition degenerates to the traditional 3-way, + * or "Dutch National Flag", partition: * * left part center part right part - * ------------------------------------------------- - * [ < pivot | == pivot | ? | > pivot ] - * ------------------------------------------------- - * + * +----------------------------------------------+ + * | < pivot | == pivot | ? | > pivot | + * +----------------------------------------------+ * ^ ^ ^ * | | | * less k great @@ -243,30 +242,34 @@ final class DualPivotQuicksort { * * Pointer k is the first index of ?-part */ - outer: for (int k = less; k <= great; k++) { int ak = a[k]; if (ak == pivot1) { continue; } - if (ak < pivot1) { - if (k > less) { + if (ak < pivot1) { // Move a[k] to left part + if (k != less) { a[k] = a[less]; a[less] = ak; } less++; - } else { // a[k] > pivot + } else { // (a[k] > pivot1) - Move a[k] to right part + /* + * We know that pivot1 == a[e3] == pivot2. Thus, we know + * that great will still be >= k when the following loop + * terminates, even though we don't test for it explicitly. + * In other words, a[e3] acts as a sentinel for great. + */ while (a[great] > pivot1) { - if (k == great--) { - break outer; - } + great--; } - a[k] = a[great]; - a[great--] = ak; - - if ((ak = a[k]) < pivot1) { + if (a[great] < pivot1) { a[k] = a[less]; - a[less++] = ak; + a[less++] = a[great]; + a[great--] = ak; + } else { // a[great] == pivot1 + a[k] = pivot1; + a[great--] = ak; } } } @@ -289,26 +292,55 @@ final class DualPivotQuicksort { } /* - * If center part is too large (comprises > 5/6 of - * the array), swap internal pivot values to ends + * If center part is too large (comprises > 2/3 of the array), + * swap internal pivot values to ends */ - if (less < e1 && e5 < great) { + if (less < e1 && great > e5) { while (a[less] == pivot1) { less++; } while (a[great] == pivot2) { great--; } - for (int k = less + 1; k <= great; ) { + + /* + * Partitioning: + * + * left part center part right part + * +----------------------------------------------------------+ + * | == pivot1 | pivot1 < && < pivot2 | ? | == pivot2 | + * +----------------------------------------------------------+ + * ^ ^ ^ + * | | | + * less k great + * + * Invariants: + * + * all in (*, less) == pivot1 + * pivot1 < all in [less, k) < pivot2 + * all in (great, *) == pivot2 + * + * Pointer k is the first index of ?-part + */ + outer: + for (int k = less; k <= great; k++) { int ak = a[k]; - if (ak == pivot1) { - a[k++] = a[less]; - a[less++] = pivot1; - } else if (ak == pivot2) { - a[k] = a[great]; + if (ak == pivot2) { // Move a[k] to right part + while (a[great] == pivot2) { + if (great-- == k) { + break outer; + } + } + if (a[great] == pivot1) { + a[k] = a[less]; + a[less++] = pivot1; + } else { // pivot1 < a[great] < pivot2 + a[k] = a[great]; + } a[great--] = pivot2; - } else { - k++; + } else if (ak == pivot1) { // Move a[k] to left part + a[k] = a[less]; + a[less++] = pivot1; } } } @@ -330,7 +362,7 @@ final class DualPivotQuicksort { * Sorts the specified range of the array into ascending order. The range * to be sorted extends from the index {@code fromIndex}, inclusive, to * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex}, - * the range to be sorted is empty. + * the range to be sorted is empty (and the call is a no-op). * * @param a the array to be sorted * @param fromIndex the index of the first element, inclusive, to be sorted @@ -357,13 +389,13 @@ final class DualPivotQuicksort { private static void doSort(long[] a, int left, int right) { // Use insertion sort on tiny arrays if (right - left + 1 < INSERTION_SORT_THRESHOLD) { - for (int k = left + 1; k <= right; k++) { - long ak = a[k]; + for (int i = left + 1; i <= right; i++) { + long ai = a[i]; int j; - for (j = k - 1; j >= left && ak < a[j]; j--) { + for (j = i - 1; j >= left && ai < a[j]; j--) { a[j + 1] = a[j]; } - a[j + 1] = ak; + a[j + 1] = ai; } } else { // Use Dual-Pivot Quicksort on large arrays dualPivotQuicksort(a, left, right); @@ -408,7 +440,7 @@ final class DualPivotQuicksort { * second terciles of the array. Note that pivot1 <= pivot2. * * The pivots are stored in local variables, and the first and - * the last of the sorted elements are moved to the locations + * the last of the elements to be sorted are moved to the locations * formerly occupied by the pivots. When partitioning is complete, * the pivots are swapped back into their final positions, and * excluded from subsequent sorting. @@ -416,27 +448,26 @@ final class DualPivotQuicksort { long pivot1 = ae2; a[e2] = a[left]; long pivot2 = ae4; a[e4] = a[right]; - /* - * Partitioning - * - * left part center part right part - * ------------------------------------------------------------ - * [ < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 ] - * ------------------------------------------------------------ - * ^ ^ ^ - * | | | - * less k great - */ - // Pointers int less = left + 1; // The index of first element of center part int great = right - 1; // The index before first element of right part - boolean pivotsDiffer = pivot1 != pivot2; + boolean pivotsDiffer = (pivot1 != pivot2); if (pivotsDiffer) { /* + * Partitioning: + * + * left part center part right part + * +------------------------------------------------------------+ + * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 | + * +------------------------------------------------------------+ + * ^ ^ ^ + * | | | + * less k great + * * Invariants: + * * all in (left, less) < pivot1 * pivot1 <= all in [less, k) <= pivot2 * all in (great, right) > pivot2 @@ -446,37 +477,37 @@ final class DualPivotQuicksort { outer: for (int k = less; k <= great; k++) { long ak = a[k]; - if (ak < pivot1) { - if (k > less) { + if (ak < pivot1) { // Move a[k] to left part + if (k != less) { a[k] = a[less]; a[less] = ak; } less++; - } else if (ak > pivot2) { + } else if (ak > pivot2) { // Move a[k] to right part while (a[great] > pivot2) { - if (k == great--) { + if (great-- == k) { break outer; } } - a[k] = a[great]; - a[great--] = ak; - - if ((ak = a[k]) < pivot1) { + if (a[great] < pivot1) { a[k] = a[less]; - a[less++] = ak; + a[less++] = a[great]; + a[great--] = ak; + } else { // pivot1 <= a[great] <= pivot2 + a[k] = a[great]; + a[great--] = ak; } } } } else { // Pivots are equal /* - * Partition degenerates to the traditional 3-way - * (or "Dutch National Flag") partition: + * Partition degenerates to the traditional 3-way, + * or "Dutch National Flag", partition: * * left part center part right part - * ------------------------------------------------- - * [ < pivot | == pivot | ? | > pivot ] - * ------------------------------------------------- - * + * +----------------------------------------------+ + * | < pivot | == pivot | ? | > pivot | + * +----------------------------------------------+ * ^ ^ ^ * | | | * less k great @@ -489,30 +520,34 @@ final class DualPivotQuicksort { * * Pointer k is the first index of ?-part */ - outer: for (int k = less; k <= great; k++) { long ak = a[k]; if (ak == pivot1) { continue; } - if (ak < pivot1) { - if (k > less) { + if (ak < pivot1) { // Move a[k] to left part + if (k != less) { a[k] = a[less]; a[less] = ak; } less++; - } else { // a[k] > pivot + } else { // (a[k] > pivot1) - Move a[k] to right part + /* + * We know that pivot1 == a[e3] == pivot2. Thus, we know + * that great will still be >= k when the following loop + * terminates, even though we don't test for it explicitly. + * In other words, a[e3] acts as a sentinel for great. + */ while (a[great] > pivot1) { - if (k == great--) { - break outer; - } + great--; } - a[k] = a[great]; - a[great--] = ak; - - if ((ak = a[k]) < pivot1) { + if (a[great] < pivot1) { a[k] = a[less]; - a[less++] = ak; + a[less++] = a[great]; + a[great--] = ak; + } else { // a[great] == pivot1 + a[k] = pivot1; + a[great--] = ak; } } } @@ -535,26 +570,55 @@ final class DualPivotQuicksort { } /* - * If center part is too large (comprises > 5/6 of - * the array), swap internal pivot values to ends + * If center part is too large (comprises > 2/3 of the array), + * swap internal pivot values to ends */ - if (less < e1 && e5 < great) { + if (less < e1 && great > e5) { while (a[less] == pivot1) { less++; } while (a[great] == pivot2) { great--; } - for (int k = less + 1; k <= great; ) { + + /* + * Partitioning: + * + * left part center part right part + * +----------------------------------------------------------+ + * | == pivot1 | pivot1 < && < pivot2 | ? | == pivot2 | + * +----------------------------------------------------------+ + * ^ ^ ^ + * | | | + * less k great + * + * Invariants: + * + * all in (*, less) == pivot1 + * pivot1 < all in [less, k) < pivot2 + * all in (great, *) == pivot2 + * + * Pointer k is the first index of ?-part + */ + outer: + for (int k = less; k <= great; k++) { long ak = a[k]; - if (ak == pivot1) { - a[k++] = a[less]; - a[less++] = pivot1; - } else if (ak == pivot2) { - a[k] = a[great]; + if (ak == pivot2) { // Move a[k] to right part + while (a[great] == pivot2) { + if (great-- == k) { + break outer; + } + } + if (a[great] == pivot1) { + a[k] = a[less]; + a[less++] = pivot1; + } else { // pivot1 < a[great] < pivot2 + a[k] = a[great]; + } a[great--] = pivot2; - } else { - k++; + } else if (ak == pivot1) { // Move a[k] to left part + a[k] = a[less]; + a[less++] = pivot1; } } } @@ -576,7 +640,7 @@ final class DualPivotQuicksort { * Sorts the specified range of the array into ascending order. The range * to be sorted extends from the index {@code fromIndex}, inclusive, to * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex}, - * the range to be sorted is empty. + * the range to be sorted is empty (and the call is a no-op). * * @param a the array to be sorted * @param fromIndex the index of the first element, inclusive, to be sorted @@ -606,13 +670,13 @@ final class DualPivotQuicksort { private static void doSort(short[] a, int left, int right) { // Use insertion sort on tiny arrays if (right - left + 1 < INSERTION_SORT_THRESHOLD) { - for (int k = left + 1; k <= right; k++) { - short ak = a[k]; + for (int i = left + 1; i <= right; i++) { + short ai = a[i]; int j; - for (j = k - 1; j >= left && ak < a[j]; j--) { + for (j = i - 1; j >= left && ai < a[j]; j--) { a[j + 1] = a[j]; } - a[j + 1] = ak; + a[j + 1] = ai; } } else if (right-left+1 > COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) { // Use counting sort on huge arrays @@ -671,7 +735,7 @@ final class DualPivotQuicksort { * second terciles of the array. Note that pivot1 <= pivot2. * * The pivots are stored in local variables, and the first and - * the last of the sorted elements are moved to the locations + * the last of the elements to be sorted are moved to the locations * formerly occupied by the pivots. When partitioning is complete, * the pivots are swapped back into their final positions, and * excluded from subsequent sorting. @@ -679,27 +743,26 @@ final class DualPivotQuicksort { short pivot1 = ae2; a[e2] = a[left]; short pivot2 = ae4; a[e4] = a[right]; - /* - * Partitioning - * - * left part center part right part - * ------------------------------------------------------------ - * [ < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 ] - * ------------------------------------------------------------ - * ^ ^ ^ - * | | | - * less k great - */ - // Pointers int less = left + 1; // The index of first element of center part int great = right - 1; // The index before first element of right part - boolean pivotsDiffer = pivot1 != pivot2; + boolean pivotsDiffer = (pivot1 != pivot2); if (pivotsDiffer) { /* + * Partitioning: + * + * left part center part right part + * +------------------------------------------------------------+ + * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 | + * +------------------------------------------------------------+ + * ^ ^ ^ + * | | | + * less k great + * * Invariants: + * * all in (left, less) < pivot1 * pivot1 <= all in [less, k) <= pivot2 * all in (great, right) > pivot2 @@ -709,37 +772,37 @@ final class DualPivotQuicksort { outer: for (int k = less; k <= great; k++) { short ak = a[k]; - if (ak < pivot1) { - if (k > less) { + if (ak < pivot1) { // Move a[k] to left part + if (k != less) { a[k] = a[less]; a[less] = ak; } less++; - } else if (ak > pivot2) { + } else if (ak > pivot2) { // Move a[k] to right part while (a[great] > pivot2) { - if (k == great--) { + if (great-- == k) { break outer; } } - a[k] = a[great]; - a[great--] = ak; - - if ((ak = a[k]) < pivot1) { + if (a[great] < pivot1) { a[k] = a[less]; - a[less++] = ak; + a[less++] = a[great]; + a[great--] = ak; + } else { // pivot1 <= a[great] <= pivot2 + a[k] = a[great]; + a[great--] = ak; } } } } else { // Pivots are equal /* - * Partition degenerates to the traditional 3-way - * (or "Dutch National Flag") partition: + * Partition degenerates to the traditional 3-way, + * or "Dutch National Flag", partition: * * left part center part right part - * ------------------------------------------------- - * [ < pivot | == pivot | ? | > pivot ] - * ------------------------------------------------- - * + * +----------------------------------------------+ + * | < pivot | == pivot | ? | > pivot | + * +----------------------------------------------+ * ^ ^ ^ * | | | * less k great @@ -752,30 +815,34 @@ final class DualPivotQuicksort { * * Pointer k is the first index of ?-part */ - outer: for (int k = less; k <= great; k++) { short ak = a[k]; if (ak == pivot1) { continue; } - if (ak < pivot1) { - if (k > less) { + if (ak < pivot1) { // Move a[k] to left part + if (k != less) { a[k] = a[less]; a[less] = ak; } less++; - } else { // a[k] > pivot + } else { // (a[k] > pivot1) - Move a[k] to right part + /* + * We know that pivot1 == a[e3] == pivot2. Thus, we know + * that great will still be >= k when the following loop + * terminates, even though we don't test for it explicitly. + * In other words, a[e3] acts as a sentinel for great. + */ while (a[great] > pivot1) { - if (k == great--) { - break outer; - } + great--; } - a[k] = a[great]; - a[great--] = ak; - - if ((ak = a[k]) < pivot1) { + if (a[great] < pivot1) { a[k] = a[less]; - a[less++] = ak; + a[less++] = a[great]; + a[great--] = ak; + } else { // a[great] == pivot1 + a[k] = pivot1; + a[great--] = ak; } } } @@ -798,26 +865,55 @@ final class DualPivotQuicksort { } /* - * If center part is too large (comprises > 5/6 of - * the array), swap internal pivot values to ends + * If center part is too large (comprises > 2/3 of the array), + * swap internal pivot values to ends */ - if (less < e1 && e5 < great) { + if (less < e1 && great > e5) { while (a[less] == pivot1) { less++; } while (a[great] == pivot2) { great--; } - for (int k = less + 1; k <= great; ) { + + /* + * Partitioning: + * + * left part center part right part + * +----------------------------------------------------------+ + * | == pivot1 | pivot1 < && < pivot2 | ? | == pivot2 | + * +----------------------------------------------------------+ + * ^ ^ ^ + * | | | + * less k great + * + * Invariants: + * + * all in (*, less) == pivot1 + * pivot1 < all in [less, k) < pivot2 + * all in (great, *) == pivot2 + * + * Pointer k is the first index of ?-part + */ + outer: + for (int k = less; k <= great; k++) { short ak = a[k]; - if (ak == pivot1) { - a[k++] = a[less]; - a[less++] = pivot1; - } else if (ak == pivot2) { - a[k] = a[great]; + if (ak == pivot2) { // Move a[k] to right part + while (a[great] == pivot2) { + if (great-- == k) { + break outer; + } + } + if (a[great] == pivot1) { + a[k] = a[less]; + a[less++] = pivot1; + } else { // pivot1 < a[great] < pivot2 + a[k] = a[great]; + } a[great--] = pivot2; - } else { - k++; + } else if (ak == pivot1) { // Move a[k] to left part + a[k] = a[less]; + a[less++] = pivot1; } } } @@ -839,7 +935,7 @@ final class DualPivotQuicksort { * Sorts the specified range of the array into ascending order. The range * to be sorted extends from the index {@code fromIndex}, inclusive, to * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex}, - * the range to be sorted is empty. + * the range to be sorted is empty (and the call is a no-op). * * @param a the array to be sorted * @param fromIndex the index of the first element, inclusive, to be sorted @@ -869,13 +965,13 @@ final class DualPivotQuicksort { private static void doSort(char[] a, int left, int right) { // Use insertion sort on tiny arrays if (right - left + 1 < INSERTION_SORT_THRESHOLD) { - for (int k = left + 1; k <= right; k++) { - char ak = a[k]; + for (int i = left + 1; i <= right; i++) { + char ai = a[i]; int j; - for (j = k - 1; j >= left && ak < a[j]; j--) { + for (j = i - 1; j >= left && ai < a[j]; j--) { a[j + 1] = a[j]; } - a[j + 1] = ak; + a[j + 1] = ai; } } else if (right-left+1 > COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) { // Use counting sort on huge arrays @@ -932,7 +1028,7 @@ final class DualPivotQuicksort { * second terciles of the array. Note that pivot1 <= pivot2. * * The pivots are stored in local variables, and the first and - * the last of the sorted elements are moved to the locations + * the last of the elements to be sorted are moved to the locations * formerly occupied by the pivots. When partitioning is complete, * the pivots are swapped back into their final positions, and * excluded from subsequent sorting. @@ -940,27 +1036,26 @@ final class DualPivotQuicksort { char pivot1 = ae2; a[e2] = a[left]; char pivot2 = ae4; a[e4] = a[right]; - /* - * Partitioning - * - * left part center part right part - * ------------------------------------------------------------ - * [ < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 ] - * ------------------------------------------------------------ - * ^ ^ ^ - * | | | - * less k great - */ - // Pointers int less = left + 1; // The index of first element of center part int great = right - 1; // The index before first element of right part - boolean pivotsDiffer = pivot1 != pivot2; + boolean pivotsDiffer = (pivot1 != pivot2); if (pivotsDiffer) { /* + * Partitioning: + * + * left part center part right part + * +------------------------------------------------------------+ + * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 | + * +------------------------------------------------------------+ + * ^ ^ ^ + * | | | + * less k great + * * Invariants: + * * all in (left, less) < pivot1 * pivot1 <= all in [less, k) <= pivot2 * all in (great, right) > pivot2 @@ -970,37 +1065,37 @@ final class DualPivotQuicksort { outer: for (int k = less; k <= great; k++) { char ak = a[k]; - if (ak < pivot1) { - if (k > less) { + if (ak < pivot1) { // Move a[k] to left part + if (k != less) { a[k] = a[less]; a[less] = ak; } less++; - } else if (ak > pivot2) { + } else if (ak > pivot2) { // Move a[k] to right part while (a[great] > pivot2) { - if (k == great--) { + if (great-- == k) { break outer; } } - a[k] = a[great]; - a[great--] = ak; - - if ((ak = a[k]) < pivot1) { + if (a[great] < pivot1) { a[k] = a[less]; - a[less++] = ak; + a[less++] = a[great]; + a[great--] = ak; + } else { // pivot1 <= a[great] <= pivot2 + a[k] = a[great]; + a[great--] = ak; } } } } else { // Pivots are equal /* - * Partition degenerates to the traditional 3-way - * (or "Dutch National Flag") partition: + * Partition degenerates to the traditional 3-way, + * or "Dutch National Flag", partition: * * left part center part right part - * ------------------------------------------------- - * [ < pivot | == pivot | ? | > pivot ] - * ------------------------------------------------- - * + * +----------------------------------------------+ + * | < pivot | == pivot | ? | > pivot | + * +----------------------------------------------+ * ^ ^ ^ * | | | * less k great @@ -1013,30 +1108,34 @@ final class DualPivotQuicksort { * * Pointer k is the first index of ?-part */ - outer: for (int k = less; k <= great; k++) { char ak = a[k]; if (ak == pivot1) { continue; } - if (ak < pivot1) { - if (k > less) { + if (ak < pivot1) { // Move a[k] to left part + if (k != less) { a[k] = a[less]; a[less] = ak; } less++; - } else { // a[k] > pivot + } else { // (a[k] > pivot1) - Move a[k] to right part + /* + * We know that pivot1 == a[e3] == pivot2. Thus, we know + * that great will still be >= k when the following loop + * terminates, even though we don't test for it explicitly. + * In other words, a[e3] acts as a sentinel for great. + */ while (a[great] > pivot1) { - if (k == great--) { - break outer; - } + great--; } - a[k] = a[great]; - a[great--] = ak; - - if ((ak = a[k]) < pivot1) { + if (a[great] < pivot1) { a[k] = a[less]; - a[less++] = ak; + a[less++] = a[great]; + a[great--] = ak; + } else { // a[great] == pivot1 + a[k] = pivot1; + a[great--] = ak; } } } @@ -1059,26 +1158,55 @@ final class DualPivotQuicksort { } /* - * If center part is too large (comprises > 5/6 of - * the array), swap internal pivot values to ends + * If center part is too large (comprises > 2/3 of the array), + * swap internal pivot values to ends */ - if (less < e1 && e5 < great) { + if (less < e1 && great > e5) { while (a[less] == pivot1) { less++; } while (a[great] == pivot2) { great--; } - for (int k = less + 1; k <= great; ) { + + /* + * Partitioning: + * + * left part center part right part + * +----------------------------------------------------------+ + * | == pivot1 | pivot1 < && < pivot2 | ? | == pivot2 | + * +----------------------------------------------------------+ + * ^ ^ ^ + * | | | + * less k great + * + * Invariants: + * + * all in (*, less) == pivot1 + * pivot1 < all in [less, k) < pivot2 + * all in (great, *) == pivot2 + * + * Pointer k is the first index of ?-part + */ + outer: + for (int k = less; k <= great; k++) { char ak = a[k]; - if (ak == pivot1) { - a[k++] = a[less]; - a[less++] = pivot1; - } else if (ak == pivot2) { - a[k] = a[great]; + if (ak == pivot2) { // Move a[k] to right part + while (a[great] == pivot2) { + if (great-- == k) { + break outer; + } + } + if (a[great] == pivot1) { + a[k] = a[less]; + a[less++] = pivot1; + } else { // pivot1 < a[great] < pivot2 + a[k] = a[great]; + } a[great--] = pivot2; - } else { - k++; + } else if (ak == pivot1) { // Move a[k] to left part + a[k] = a[less]; + a[less++] = pivot1; } } } @@ -1100,7 +1228,7 @@ final class DualPivotQuicksort { * Sorts the specified range of the array into ascending order. The range * to be sorted extends from the index {@code fromIndex}, inclusive, to * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex}, - * the range to be sorted is empty. + * the range to be sorted is empty (and the call is a no-op). * * @param a the array to be sorted * @param fromIndex the index of the first element, inclusive, to be sorted @@ -1130,13 +1258,13 @@ final class DualPivotQuicksort { private static void doSort(byte[] a, int left, int right) { // Use insertion sort on tiny arrays if (right - left + 1 < INSERTION_SORT_THRESHOLD) { - for (int k = left + 1; k <= right; k++) { - byte ak = a[k]; + for (int i = left + 1; i <= right; i++) { + byte ai = a[i]; int j; - for (j = k - 1; j >= left && ak < a[j]; j--) { + for (j = i - 1; j >= left && ai < a[j]; j--) { a[j + 1] = a[j]; } - a[j + 1] = ak; + a[j + 1] = ai; } } else if (right - left + 1 > COUNTING_SORT_THRESHOLD_FOR_BYTE) { // Use counting sort on huge arrays @@ -1195,7 +1323,7 @@ final class DualPivotQuicksort { * second terciles of the array. Note that pivot1 <= pivot2. * * The pivots are stored in local variables, and the first and - * the last of the sorted elements are moved to the locations + * the last of the elements to be sorted are moved to the locations * formerly occupied by the pivots. When partitioning is complete, * the pivots are swapped back into their final positions, and * excluded from subsequent sorting. @@ -1203,27 +1331,26 @@ final class DualPivotQuicksort { byte pivot1 = ae2; a[e2] = a[left]; byte pivot2 = ae4; a[e4] = a[right]; - /* - * Partitioning - * - * left part center part right part - * ------------------------------------------------------------ - * [ < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 ] - * ------------------------------------------------------------ - * ^ ^ ^ - * | | | - * less k great - */ - // Pointers int less = left + 1; // The index of first element of center part int great = right - 1; // The index before first element of right part - boolean pivotsDiffer = pivot1 != pivot2; + boolean pivotsDiffer = (pivot1 != pivot2); if (pivotsDiffer) { /* + * Partitioning: + * + * left part center part right part + * +------------------------------------------------------------+ + * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 | + * +------------------------------------------------------------+ + * ^ ^ ^ + * | | | + * less k great + * * Invariants: + * * all in (left, less) < pivot1 * pivot1 <= all in [less, k) <= pivot2 * all in (great, right) > pivot2 @@ -1233,37 +1360,37 @@ final class DualPivotQuicksort { outer: for (int k = less; k <= great; k++) { byte ak = a[k]; - if (ak < pivot1) { - if (k > less) { + if (ak < pivot1) { // Move a[k] to left part + if (k != less) { a[k] = a[less]; a[less] = ak; } less++; - } else if (ak > pivot2) { + } else if (ak > pivot2) { // Move a[k] to right part while (a[great] > pivot2) { - if (k == great--) { + if (great-- == k) { break outer; } } - a[k] = a[great]; - a[great--] = ak; - - if ((ak = a[k]) < pivot1) { + if (a[great] < pivot1) { a[k] = a[less]; - a[less++] = ak; + a[less++] = a[great]; + a[great--] = ak; + } else { // pivot1 <= a[great] <= pivot2 + a[k] = a[great]; + a[great--] = ak; } } } } else { // Pivots are equal /* - * Partition degenerates to the traditional 3-way - * (or "Dutch National Flag") partition: + * Partition degenerates to the traditional 3-way, + * or "Dutch National Flag", partition: * * left part center part right part - * ------------------------------------------------- - * [ < pivot | == pivot | ? | > pivot ] - * ------------------------------------------------- - * + * +----------------------------------------------+ + * | < pivot | == pivot | ? | > pivot | + * +----------------------------------------------+ * ^ ^ ^ * | | | * less k great @@ -1276,30 +1403,34 @@ final class DualPivotQuicksort { * * Pointer k is the first index of ?-part */ - outer: for (int k = less; k <= great; k++) { byte ak = a[k]; if (ak == pivot1) { continue; } - if (ak < pivot1) { - if (k > less) { + if (ak < pivot1) { // Move a[k] to left part + if (k != less) { a[k] = a[less]; a[less] = ak; } less++; - } else { // a[k] > pivot + } else { // (a[k] > pivot1) - Move a[k] to right part + /* + * We know that pivot1 == a[e3] == pivot2. Thus, we know + * that great will still be >= k when the following loop + * terminates, even though we don't test for it explicitly. + * In other words, a[e3] acts as a sentinel for great. + */ while (a[great] > pivot1) { - if (k == great--) { - break outer; - } + great--; } - a[k] = a[great]; - a[great--] = ak; - - if ((ak = a[k]) < pivot1) { + if (a[great] < pivot1) { a[k] = a[less]; - a[less++] = ak; + a[less++] = a[great]; + a[great--] = ak; + } else { // a[great] == pivot1 + a[k] = pivot1; + a[great--] = ak; } } } @@ -1322,26 +1453,55 @@ final class DualPivotQuicksort { } /* - * If center part is too large (comprises > 5/6 of - * the array), swap internal pivot values to ends + * If center part is too large (comprises > 2/3 of the array), + * swap internal pivot values to ends */ - if (less < e1 && e5 < great) { + if (less < e1 && great > e5) { while (a[less] == pivot1) { less++; } while (a[great] == pivot2) { great--; } - for (int k = less + 1; k <= great; ) { + + /* + * Partitioning: + * + * left part center part right part + * +----------------------------------------------------------+ + * | == pivot1 | pivot1 < && < pivot2 | ? | == pivot2 | + * +----------------------------------------------------------+ + * ^ ^ ^ + * | | | + * less k great + * + * Invariants: + * + * all in (*, less) == pivot1 + * pivot1 < all in [less, k) < pivot2 + * all in (great, *) == pivot2 + * + * Pointer k is the first index of ?-part + */ + outer: + for (int k = less; k <= great; k++) { byte ak = a[k]; - if (ak == pivot1) { - a[k++] = a[less]; - a[less++] = pivot1; - } else if (ak == pivot2) { - a[k] = a[great]; + if (ak == pivot2) { // Move a[k] to right part + while (a[great] == pivot2) { + if (great-- == k) { + break outer; + } + } + if (a[great] == pivot1) { + a[k] = a[less]; + a[less++] = pivot1; + } else { // pivot1 < a[great] < pivot2 + a[k] = a[great]; + } a[great--] = pivot2; - } else { - k++; + } else if (ak == pivot1) { // Move a[k] to left part + a[k] = a[less]; + a[less++] = pivot1; } } } @@ -1371,7 +1531,7 @@ final class DualPivotQuicksort { * Sorts the specified range of the array into ascending order. The range * to be sorted extends from the index {@code fromIndex}, inclusive, to * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex}, - * the range to be sorted is empty. + * the range to be sorted is empty and the call is a no-op). * *

The {@code <} relation does not provide a total order on all float * values: {@code -0.0f == 0.0f} is {@code true} and a {@code Float.NaN} @@ -1485,13 +1645,13 @@ final class DualPivotQuicksort { private static void doSort(float[] a, int left, int right) { // Use insertion sort on tiny arrays if (right - left + 1 < INSERTION_SORT_THRESHOLD) { - for (int k = left + 1; k <= right; k++) { - float ak = a[k]; + for (int i = left + 1; i <= right; i++) { + float ai = a[i]; int j; - for (j = k - 1; j >= left && ak < a[j]; j--) { + for (j = i - 1; j >= left && ai < a[j]; j--) { a[j + 1] = a[j]; } - a[j + 1] = ak; + a[j + 1] = ai; } } else { // Use Dual-Pivot Quicksort on large arrays dualPivotQuicksort(a, left, right); @@ -1536,7 +1696,7 @@ final class DualPivotQuicksort { * second terciles of the array. Note that pivot1 <= pivot2. * * The pivots are stored in local variables, and the first and - * the last of the sorted elements are moved to the locations + * the last of the elements to be sorted are moved to the locations * formerly occupied by the pivots. When partitioning is complete, * the pivots are swapped back into their final positions, and * excluded from subsequent sorting. @@ -1544,27 +1704,26 @@ final class DualPivotQuicksort { float pivot1 = ae2; a[e2] = a[left]; float pivot2 = ae4; a[e4] = a[right]; - /* - * Partitioning - * - * left part center part right part - * ------------------------------------------------------------ - * [ < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 ] - * ------------------------------------------------------------ - * ^ ^ ^ - * | | | - * less k great - */ - // Pointers int less = left + 1; // The index of first element of center part int great = right - 1; // The index before first element of right part - boolean pivotsDiffer = pivot1 != pivot2; + boolean pivotsDiffer = (pivot1 != pivot2); if (pivotsDiffer) { /* + * Partitioning: + * + * left part center part right part + * +------------------------------------------------------------+ + * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 | + * +------------------------------------------------------------+ + * ^ ^ ^ + * | | | + * less k great + * * Invariants: + * * all in (left, less) < pivot1 * pivot1 <= all in [less, k) <= pivot2 * all in (great, right) > pivot2 @@ -1574,37 +1733,37 @@ final class DualPivotQuicksort { outer: for (int k = less; k <= great; k++) { float ak = a[k]; - if (ak < pivot1) { - if (k > less) { + if (ak < pivot1) { // Move a[k] to left part + if (k != less) { a[k] = a[less]; a[less] = ak; } less++; - } else if (ak > pivot2) { + } else if (ak > pivot2) { // Move a[k] to right part while (a[great] > pivot2) { - if (k == great--) { + if (great-- == k) { break outer; } } - a[k] = a[great]; - a[great--] = ak; - - if ((ak = a[k]) < pivot1) { + if (a[great] < pivot1) { a[k] = a[less]; - a[less++] = ak; + a[less++] = a[great]; + a[great--] = ak; + } else { // pivot1 <= a[great] <= pivot2 + a[k] = a[great]; + a[great--] = ak; } } } } else { // Pivots are equal /* - * Partition degenerates to the traditional 3-way - * (or "Dutch National Flag") partition: + * Partition degenerates to the traditional 3-way, + * or "Dutch National Flag", partition: * * left part center part right part - * ------------------------------------------------- - * [ < pivot | == pivot | ? | > pivot ] - * ------------------------------------------------- - * + * +----------------------------------------------+ + * | < pivot | == pivot | ? | > pivot | + * +----------------------------------------------+ * ^ ^ ^ * | | | * less k great @@ -1617,30 +1776,34 @@ final class DualPivotQuicksort { * * Pointer k is the first index of ?-part */ - outer: for (int k = less; k <= great; k++) { float ak = a[k]; if (ak == pivot1) { continue; } - if (ak < pivot1) { - if (k > less) { + if (ak < pivot1) { // Move a[k] to left part + if (k != less) { a[k] = a[less]; a[less] = ak; } less++; - } else { // a[k] > pivot + } else { // (a[k] > pivot1) - Move a[k] to right part + /* + * We know that pivot1 == a[e3] == pivot2. Thus, we know + * that great will still be >= k when the following loop + * terminates, even though we don't test for it explicitly. + * In other words, a[e3] acts as a sentinel for great. + */ while (a[great] > pivot1) { - if (k == great--) { - break outer; - } + great--; } - a[k] = a[great]; - a[great--] = ak; - - if ((ak = a[k]) < pivot1) { + if (a[great] < pivot1) { a[k] = a[less]; - a[less++] = ak; + a[less++] = a[great]; + a[great--] = ak; + } else { // a[great] == pivot1 + a[k] = pivot1; + a[great--] = ak; } } } @@ -1663,26 +1826,55 @@ final class DualPivotQuicksort { } /* - * If center part is too large (comprises > 5/6 of - * the array), swap internal pivot values to ends + * If center part is too large (comprises > 2/3 of the array), + * swap internal pivot values to ends */ - if (less < e1 && e5 < great) { + if (less < e1 && great > e5) { while (a[less] == pivot1) { less++; } while (a[great] == pivot2) { great--; } - for (int k = less + 1; k <= great; ) { + + /* + * Partitioning: + * + * left part center part right part + * +----------------------------------------------------------+ + * | == pivot1 | pivot1 < && < pivot2 | ? | == pivot2 | + * +----------------------------------------------------------+ + * ^ ^ ^ + * | | | + * less k great + * + * Invariants: + * + * all in (*, less) == pivot1 + * pivot1 < all in [less, k) < pivot2 + * all in (great, *) == pivot2 + * + * Pointer k is the first index of ?-part + */ + outer: + for (int k = less; k <= great; k++) { float ak = a[k]; - if (ak == pivot1) { - a[k++] = a[less]; - a[less++] = pivot1; - } else if (ak == pivot2) { - a[k] = a[great]; + if (ak == pivot2) { // Move a[k] to right part + while (a[great] == pivot2) { + if (great-- == k) { + break outer; + } + } + if (a[great] == pivot1) { + a[k] = a[less]; + a[less++] = pivot1; + } else { // pivot1 < a[great] < pivot2 + a[k] = a[great]; + } a[great--] = pivot2; - } else { - k++; + } else if (ak == pivot1) { // Move a[k] to left part + a[k] = a[less]; + a[less++] = pivot1; } } } @@ -1712,7 +1904,7 @@ final class DualPivotQuicksort { * Sorts the specified range of the array into ascending order. The range * to be sorted extends from the index {@code fromIndex}, inclusive, to * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex}, - * the range to be sorted is empty. + * the range to be sorted is empty (and the call is a no-op). * *

The {@code <} relation does not provide a total order on all double * values: {@code -0.0d == 0.0d} is {@code true} and a {@code Double.NaN} @@ -1826,13 +2018,13 @@ final class DualPivotQuicksort { private static void doSort(double[] a, int left, int right) { // Use insertion sort on tiny arrays if (right - left + 1 < INSERTION_SORT_THRESHOLD) { - for (int k = left + 1; k <= right; k++) { - double ak = a[k]; + for (int i = left + 1; i <= right; i++) { + double ai = a[i]; int j; - for (j = k - 1; j >= left && ak < a[j]; j--) { + for (j = i - 1; j >= left && ai < a[j]; j--) { a[j + 1] = a[j]; } - a[j + 1] = ak; + a[j + 1] = ai; } } else { // Use Dual-Pivot Quicksort on large arrays dualPivotQuicksort(a, left, right); @@ -1877,7 +2069,7 @@ final class DualPivotQuicksort { * second terciles of the array. Note that pivot1 <= pivot2. * * The pivots are stored in local variables, and the first and - * the last of the sorted elements are moved to the locations + * the last of the elements to be sorted are moved to the locations * formerly occupied by the pivots. When partitioning is complete, * the pivots are swapped back into their final positions, and * excluded from subsequent sorting. @@ -1885,27 +2077,26 @@ final class DualPivotQuicksort { double pivot1 = ae2; a[e2] = a[left]; double pivot2 = ae4; a[e4] = a[right]; - /* - * Partitioning - * - * left part center part right part - * ------------------------------------------------------------ - * [ < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 ] - * ------------------------------------------------------------ - * ^ ^ ^ - * | | | - * less k great - */ - // Pointers int less = left + 1; // The index of first element of center part int great = right - 1; // The index before first element of right part - boolean pivotsDiffer = pivot1 != pivot2; + boolean pivotsDiffer = (pivot1 != pivot2); if (pivotsDiffer) { /* + * Partitioning: + * + * left part center part right part + * +------------------------------------------------------------+ + * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 | + * +------------------------------------------------------------+ + * ^ ^ ^ + * | | | + * less k great + * * Invariants: + * * all in (left, less) < pivot1 * pivot1 <= all in [less, k) <= pivot2 * all in (great, right) > pivot2 @@ -1915,37 +2106,37 @@ final class DualPivotQuicksort { outer: for (int k = less; k <= great; k++) { double ak = a[k]; - if (ak < pivot1) { - if (k > less) { + if (ak < pivot1) { // Move a[k] to left part + if (k != less) { a[k] = a[less]; a[less] = ak; } less++; - } else if (ak > pivot2) { + } else if (ak > pivot2) { // Move a[k] to right part while (a[great] > pivot2) { - if (k == great--) { + if (great-- == k) { break outer; } } - a[k] = a[great]; - a[great--] = ak; - - if ((ak = a[k]) < pivot1) { + if (a[great] < pivot1) { a[k] = a[less]; - a[less++] = ak; + a[less++] = a[great]; + a[great--] = ak; + } else { // pivot1 <= a[great] <= pivot2 + a[k] = a[great]; + a[great--] = ak; } } } } else { // Pivots are equal /* - * Partition degenerates to the traditional 3-way - * (or "Dutch National Flag") partition: + * Partition degenerates to the traditional 3-way, + * or "Dutch National Flag", partition: * * left part center part right part - * ------------------------------------------------- - * [ < pivot | == pivot | ? | > pivot ] - * ------------------------------------------------- - * + * +----------------------------------------------+ + * | < pivot | == pivot | ? | > pivot | + * +----------------------------------------------+ * ^ ^ ^ * | | | * less k great @@ -1958,30 +2149,34 @@ final class DualPivotQuicksort { * * Pointer k is the first index of ?-part */ - outer: for (int k = less; k <= great; k++) { double ak = a[k]; if (ak == pivot1) { continue; } - if (ak < pivot1) { - if (k > less) { + if (ak < pivot1) { // Move a[k] to left part + if (k != less) { a[k] = a[less]; a[less] = ak; } less++; - } else { // a[k] > pivot + } else { // (a[k] > pivot1) - Move a[k] to right part + /* + * We know that pivot1 == a[e3] == pivot2. Thus, we know + * that great will still be >= k when the following loop + * terminates, even though we don't test for it explicitly. + * In other words, a[e3] acts as a sentinel for great. + */ while (a[great] > pivot1) { - if (k == great--) { - break outer; - } + great--; } - a[k] = a[great]; - a[great--] = ak; - - if ((ak = a[k]) < pivot1) { + if (a[great] < pivot1) { a[k] = a[less]; - a[less++] = ak; + a[less++] = a[great]; + a[great--] = ak; + } else { // a[great] == pivot1 + a[k] = pivot1; + a[great--] = ak; } } } @@ -2004,26 +2199,55 @@ final class DualPivotQuicksort { } /* - * If center part is too large (comprises > 5/6 of - * the array), swap internal pivot values to ends + * If center part is too large (comprises > 2/3 of the array), + * swap internal pivot values to ends */ - if (less < e1 && e5 < great) { + if (less < e1 && great > e5) { while (a[less] == pivot1) { less++; } while (a[great] == pivot2) { great--; } - for (int k = less + 1; k <= great; ) { + + /* + * Partitioning: + * + * left part center part right part + * +----------------------------------------------------------+ + * | == pivot1 | pivot1 < && < pivot2 | ? | == pivot2 | + * +----------------------------------------------------------+ + * ^ ^ ^ + * | | | + * less k great + * + * Invariants: + * + * all in (*, less) == pivot1 + * pivot1 < all in [less, k) < pivot2 + * all in (great, *) == pivot2 + * + * Pointer k is the first index of ?-part + */ + outer: + for (int k = less; k <= great; k++) { double ak = a[k]; - if (ak == pivot1) { - a[k++] = a[less]; - a[less++] = pivot1; - } else if (ak == pivot2) { - a[k] = a[great]; + if (ak == pivot2) { // Move a[k] to right part + while (a[great] == pivot2) { + if (great-- == k) { + break outer; + } + } + if (a[great] == pivot1) { + a[k] = a[less]; + a[less++] = pivot1; + } else { // pivot1 < a[great] < pivot2 + a[k] = a[great]; + } a[great--] = pivot2; - } else { - k++; + } else if (ak == pivot1) { // Move a[k] to left part + a[k] = a[less]; + a[less++] = pivot1; } } } diff --git a/src/share/classes/java/util/Formatter.java b/src/share/classes/java/util/Formatter.java index 59ff1da071196719c2ddfbb957ffa748916dcb06..46a6431298c230d74a99208358e2c1d4ac78dc22 100644 --- a/src/share/classes/java/util/Formatter.java +++ b/src/share/classes/java/util/Formatter.java @@ -2552,9 +2552,6 @@ public final class Formatter implements Closeable, Flushable { private boolean dt = false; private char c; - // cache the line separator - private String ls; - private int index(String s) { if (s != null) { try { @@ -2702,9 +2699,7 @@ public final class Formatter implements Closeable, Flushable { printHashCode(arg); break; case Conversion.LINE_SEPARATOR: - if (ls == null) - ls = System.getProperty("line.separator"); - a.append(ls); + a.append(System.lineSeparator()); break; case Conversion.PERCENT_SIGN: a.append('%'); diff --git a/src/share/classes/java/util/zip/Deflater.java b/src/share/classes/java/util/zip/Deflater.java index e592ce0dfd47717a5c2a3d1138e13a5b835fb54a..dbf25e688fcc6efc49655f1c65448f3d056f31ef 100644 --- a/src/share/classes/java/util/zip/Deflater.java +++ b/src/share/classes/java/util/zip/Deflater.java @@ -318,7 +318,7 @@ class Deflater { /** * Compresses the input data and fills specified buffer with compressed * data. Returns actual number of bytes of compressed data. A return value - * of 0 indicates that {@link needsInput() needsInput} should be called + * of 0 indicates that {@link #needsInput() needsInput} should be called * in order to determine if more input data is required. * *

This method uses {@link #NO_FLUSH} as its compression flush mode. @@ -339,7 +339,7 @@ class Deflater { /** * Compresses the input data and fills specified buffer with compressed * data. Returns actual number of bytes of compressed data. A return value - * of 0 indicates that {@link needsInput() needsInput} should be called + * of 0 indicates that {@link #needsInput() needsInput} should be called * in order to determine if more input data is required. * *

This method uses {@link #NO_FLUSH} as its compression flush mode. diff --git a/src/share/classes/java/util/zip/DeflaterOutputStream.java b/src/share/classes/java/util/zip/DeflaterOutputStream.java index 238de92e815def596e726171070d8fa7f7ed1e9d..109f698199b1d0f997b9ff4b728d38a208d15b1f 100644 --- a/src/share/classes/java/util/zip/DeflaterOutputStream.java +++ b/src/share/classes/java/util/zip/DeflaterOutputStream.java @@ -66,7 +66,7 @@ class DeflaterOutputStream extends FilterOutputStream { * @param def the compressor ("deflater") * @param size the output buffer size * @param syncFlush - * if {@code true} the {@link flush()} method of this + * if {@code true} the {@link #flush()} method of this * instance flushes the compressor with flush mode * {@link Deflater#SYNC_FLUSH} before flushing the output * stream, otherwise only flushes the output stream @@ -114,7 +114,7 @@ class DeflaterOutputStream extends FilterOutputStream { * @param out the output stream * @param def the compressor ("deflater") * @param syncFlush - * if {@code true} the {@link flush()} method of this + * if {@code true} the {@link #flush()} method of this * instance flushes the compressor with flush mode * {@link Deflater#SYNC_FLUSH} before flushing the output * stream, otherwise only flushes the output stream @@ -151,7 +151,7 @@ class DeflaterOutputStream extends FilterOutputStream { * * @param out the output stream * @param syncFlush - * if {@code true} the {@link flush()} method of this + * if {@code true} the {@link #flush()} method of this * instance flushes the compressor with flush mode * {@link Deflater#SYNC_FLUSH} before flushing the output * stream, otherwise only flushes the output stream @@ -262,10 +262,10 @@ class DeflaterOutputStream extends FilterOutputStream { /** * Flushes the compressed output stream. * - * If {@link DeflaterOutputStream(OutputStream, Deflater, int, boolean) + * If {@link #DeflaterOutputStream(OutputStream, Deflater, int, boolean) * syncFlush} is {@code true} when this compressed output stream is - * constructed this method flushes the underlying {@code compressor} - * first with the flush mode {@link Deflater#SYNC_FLUSH} to force + * constructed, this method first flushes the underlying {@code compressor} + * with the flush mode {@link Deflater#SYNC_FLUSH} to force * all pending data to be flushed out to the output stream and then * flushes the output stream. Otherwise this method only flushes the * output stream without flushing the {@code compressor}. diff --git a/src/share/classes/javax/naming/InitialContext.java b/src/share/classes/javax/naming/InitialContext.java index 0e105d0f8401005b2670bfbe62a32ece1ffcaf78..b9cc6e545dc53ef0c14d8af2c6dced481744bacc 100644 --- a/src/share/classes/javax/naming/InitialContext.java +++ b/src/share/classes/javax/naming/InitialContext.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-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 @@ -198,6 +198,8 @@ public class InitialContext implements Context { * *

This constructor will not modify environment * or save a reference to it, but may save a clone. + * Caller should not modify mutable keys and values in + * environment after it has been passed to the constructor. * * @param environment * environment used to create the initial context. diff --git a/src/share/classes/javax/naming/directory/InitialDirContext.java b/src/share/classes/javax/naming/directory/InitialDirContext.java index d96643acf4b8853bce2ae84939178b989ce69207..1a3aac6407ec81a1be77a268423571448756069a 100644 --- a/src/share/classes/javax/naming/directory/InitialDirContext.java +++ b/src/share/classes/javax/naming/directory/InitialDirContext.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-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 @@ -86,6 +86,8 @@ public class InitialDirContext extends InitialContext implements DirContext { * *

This constructor will not modify environment * or save a reference to it, but may save a clone. + * Caller should not modify mutable keys and values in + * environment after it has been passed to the constructor. * * @param environment * environment used to create the initial DirContext. diff --git a/src/share/classes/javax/naming/ldap/InitialLdapContext.java b/src/share/classes/javax/naming/ldap/InitialLdapContext.java index 896cae8ccaf264c0da388288b7d59eb778fdfe4e..757d29e7f788616e91b09c9aa90b3c77c48e59ac 100644 --- a/src/share/classes/javax/naming/ldap/InitialLdapContext.java +++ b/src/share/classes/javax/naming/ldap/InitialLdapContext.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-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 @@ -110,6 +110,8 @@ public class InitialLdapContext extends InitialDirContext implements LdapContext * *

This constructor will not modify its parameters or * save references to them, but may save a clone or copy. + * Caller should not modify mutable keys and values in + * environment after it has been passed to the constructor. * *

connCtls is used as the underlying context instance's * connection request controls. See the class description diff --git a/src/share/classes/javax/security/auth/Subject.java b/src/share/classes/javax/security/auth/Subject.java index ecc66fbe055a8d1c519e8df5ff357d1c01c1f4cc..1e404d6db1da219ce9f8ce8975888cc7f54e0411 100644 --- a/src/share/classes/javax/security/auth/Subject.java +++ b/src/share/classes/javax/security/auth/Subject.java @@ -40,7 +40,6 @@ import java.security.PrivilegedExceptionAction; import java.security.PrivilegedActionException; import java.security.ProtectionDomain; import sun.security.util.ResourcesMgr; -import sun.security.util.SecurityConstants; /** *

A Subject represents a grouping of related information @@ -239,7 +238,7 @@ public final class Subject implements java.io.Serializable { public void setReadOnly() { java.lang.SecurityManager sm = System.getSecurityManager(); if (sm != null) { - sm.checkPermission(new AuthPermission("setReadOnly")); + sm.checkPermission(AuthPermissionHolder.SET_READ_ONLY_PERMISSION); } this.readOnly = true; @@ -285,7 +284,7 @@ public final class Subject implements java.io.Serializable { java.lang.SecurityManager sm = System.getSecurityManager(); if (sm != null) { - sm.checkPermission(new AuthPermission("getSubject")); + sm.checkPermission(AuthPermissionHolder.GET_SUBJECT_PERMISSION); } if (acc == null) { @@ -343,7 +342,7 @@ public final class Subject implements java.io.Serializable { java.lang.SecurityManager sm = System.getSecurityManager(); if (sm != null) { - sm.checkPermission(SecurityConstants.DO_AS_PERMISSION); + sm.checkPermission(AuthPermissionHolder.DO_AS_PERMISSION); } if (action == null) throw new NullPointerException @@ -402,7 +401,7 @@ public final class Subject implements java.io.Serializable { java.lang.SecurityManager sm = System.getSecurityManager(); if (sm != null) { - sm.checkPermission(SecurityConstants.DO_AS_PERMISSION); + sm.checkPermission(AuthPermissionHolder.DO_AS_PERMISSION); } if (action == null) @@ -456,7 +455,7 @@ public final class Subject implements java.io.Serializable { java.lang.SecurityManager sm = System.getSecurityManager(); if (sm != null) { - sm.checkPermission(SecurityConstants.DO_AS_PRIVILEGED_PERMISSION); + sm.checkPermission(AuthPermissionHolder.DO_AS_PRIVILEGED_PERMISSION); } if (action == null) @@ -520,7 +519,7 @@ public final class Subject implements java.io.Serializable { java.lang.SecurityManager sm = System.getSecurityManager(); if (sm != null) { - sm.checkPermission(SecurityConstants.DO_AS_PRIVILEGED_PERMISSION); + sm.checkPermission(AuthPermissionHolder.DO_AS_PRIVILEGED_PERMISSION); } if (action == null) @@ -1044,16 +1043,13 @@ public final class Subject implements java.io.Serializable { if (sm != null) { switch (which) { case Subject.PRINCIPAL_SET: - sm.checkPermission(new AuthPermission - ("modifyPrincipals")); + sm.checkPermission(AuthPermissionHolder.MODIFY_PRINCIPALS_PERMISSION); break; case Subject.PUB_CREDENTIAL_SET: - sm.checkPermission(new AuthPermission - ("modifyPublicCredentials")); + sm.checkPermission(AuthPermissionHolder.MODIFY_PUBLIC_CREDENTIALS_PERMISSION); break; default: - sm.checkPermission(new AuthPermission - ("modifyPrivateCredentials")); + sm.checkPermission(AuthPermissionHolder.MODIFY_PRIVATE_CREDENTIALS_PERMISSION); break; } } @@ -1073,16 +1069,13 @@ public final class Subject implements java.io.Serializable { if (sm != null) { switch (which) { case Subject.PRINCIPAL_SET: - sm.checkPermission - (new AuthPermission("modifyPrincipals")); + sm.checkPermission(AuthPermissionHolder.MODIFY_PRINCIPALS_PERMISSION); break; case Subject.PUB_CREDENTIAL_SET: - sm.checkPermission - (new AuthPermission("modifyPublicCredentials")); + sm.checkPermission(AuthPermissionHolder.MODIFY_PUBLIC_CREDENTIALS_PERMISSION); break; default: - sm.checkPermission - (new AuthPermission("modifyPrivateCredentials")); + sm.checkPermission(AuthPermissionHolder.MODIFY_PRIVATE_CREDENTIALS_PERMISSION); break; } } @@ -1405,4 +1398,27 @@ public final class Subject implements java.io.Serializable { return set.add(o); } } + + static class AuthPermissionHolder { + static final AuthPermission DO_AS_PERMISSION = + new AuthPermission("doAs"); + + static final AuthPermission DO_AS_PRIVILEGED_PERMISSION = + new AuthPermission("doAsPrivileged"); + + static final AuthPermission SET_READ_ONLY_PERMISSION = + new AuthPermission("setReadOnly"); + + static final AuthPermission GET_SUBJECT_PERMISSION = + new AuthPermission("getSubject"); + + static final AuthPermission MODIFY_PRINCIPALS_PERMISSION = + new AuthPermission("modifyPrincipals"); + + static final AuthPermission MODIFY_PUBLIC_CREDENTIALS_PERMISSION = + new AuthPermission("modifyPublicCredentials"); + + static final AuthPermission MODIFY_PRIVATE_CREDENTIALS_PERMISSION = + new AuthPermission("modifyPrivateCredentials"); + } } diff --git a/src/share/classes/org/ietf/jgss/GSSContext.java b/src/share/classes/org/ietf/jgss/GSSContext.java index 5fb769dc523ab75fef8ad883f3e9633c16fca23c..e8eb70275807d16ad854100b2f4982fdd8518d80 100644 --- a/src/share/classes/org/ietf/jgss/GSSContext.java +++ b/src/share/classes/org/ietf/jgss/GSSContext.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2001 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 @@ -678,7 +678,7 @@ public interface GSSContext { * are not definitive then the method will attempt to treat all * available bytes as part of the token.

* - * Other than the possible blocking behaviour described above, this + * Other than the possible blocking behavior described above, this * method is equivalent to the byte array based {@link #unwrap(byte[], * int, int, MessageProp) unwrap} method.

* @@ -826,7 +826,7 @@ public interface GSSContext { * are not definitive then the method will attempt to treat all * available bytes as part of the token.

* - * Other than the possible blocking behaviour described above, this + * Other than the possible blocking behavior described above, this * method is equivalent to the byte array based {@link #verifyMIC(byte[], * int, int, byte[], int, int, MessageProp) verifyMIC} method.

* @@ -917,7 +917,7 @@ public interface GSSContext { * getMutualAuthState} method.

* * @param state a boolean value indicating whether mutual - * authentication shouls be used or not. + * authentication should be used or not. * @see #getMutualAuthState() * * @throws GSSException containing the following @@ -928,7 +928,7 @@ public interface GSSContext { /** * Requests that replay detection be enabled for the - * per-message security services after context establishemnt. This + * per-message security services after context establishment. This * request can only be made on the context initiator's side and it has * to be done prior to the first call to * initSecContext. During context establishment replay @@ -958,7 +958,7 @@ public interface GSSContext { /** * Requests that sequence checking be enabled for the - * per-message security services after context establishemnt. This + * per-message security services after context establishment. This * request can only be made on the context initiator's side and it has * to be done prior to the first call to * initSecContext. During context establishment sequence diff --git a/src/share/classes/sun/net/www/protocol/http/spnego/NegotiatorImpl.java b/src/share/classes/sun/net/www/protocol/http/spnego/NegotiatorImpl.java index dd4a39bd875ce78ee51855952e3e61b2cbf8850e..af0c9726ad9e06ba1515bc12611ec618db2f27a5 100644 --- a/src/share/classes/sun/net/www/protocol/http/spnego/NegotiatorImpl.java +++ b/src/share/classes/sun/net/www/protocol/http/spnego/NegotiatorImpl.java @@ -25,6 +25,7 @@ package sun.net.www.protocol.http.spnego; +import com.sun.security.jgss.ExtendedGSSContext; import java.io.IOException; import org.ietf.jgss.GSSContext; @@ -100,15 +101,10 @@ public class NegotiatorImpl extends Negotiator { null, GSSContext.DEFAULT_LIFETIME); - // In order to support credential delegation in HTTP/SPNEGO, - // we always request it before initSecContext. The current - // implementation will check the OK-AS-DELEGATE flag inside - // the service ticket of the web server, and only enable - // delegation when this flag is set. This check is only - // performed when the GSS caller is CALLER_HTTP_NEGOTIATE, - // so all other normal GSS-API calls are not affected. - - context.requestCredDeleg(true); + // Always respect delegation policy in HTTP/SPNEGO. + if (context instanceof ExtendedGSSContext) { + ((ExtendedGSSContext)context).requestDelegPolicy(true); + } oneToken = context.initSecContext(new byte[0], 0, 0); } diff --git a/src/share/classes/sun/security/jgss/GSSContextImpl.java b/src/share/classes/sun/security/jgss/GSSContextImpl.java index de703ef4dedba60c655e48a6c0b3f64197535e4e..210ba5b869ae59d721567961a8e9628696492a60 100644 --- a/src/share/classes/sun/security/jgss/GSSContextImpl.java +++ b/src/share/classes/sun/security/jgss/GSSContextImpl.java @@ -89,7 +89,8 @@ import com.sun.security.jgss.*; */ class GSSContextImpl implements ExtendedGSSContext { - private GSSManagerImpl gssManager = null; + private final GSSManagerImpl gssManager; + private final boolean initiator; // private flags for the context state private static final int PRE_INIT = 1; @@ -99,14 +100,12 @@ class GSSContextImpl implements ExtendedGSSContext { // instance variables private int currentState = PRE_INIT; - private boolean initiator; private GSSContextSpi mechCtxt = null; private Oid mechOid = null; private ObjectIdentifier objId = null; private GSSCredentialImpl myCred = null; - private GSSCredentialImpl delegCred = null; private GSSNameImpl srcName = null; private GSSNameImpl targName = null; @@ -121,6 +120,7 @@ class GSSContextImpl implements ExtendedGSSContext { private boolean reqSequenceDetState = true; private boolean reqCredDelegState = false; private boolean reqAnonState = false; + private boolean reqDelegPolicyState = false; /** * Creates a GSSContextImp on the context initiator's side. @@ -221,6 +221,7 @@ class GSSContextImpl implements ExtendedGSSContext { mechCtxt.requestSequenceDet(reqSequenceDetState); mechCtxt.requestAnonymity(reqAnonState); mechCtxt.setChannelBinding(channelBindings); + mechCtxt.requestDelegPolicy(reqDelegPolicyState); objId = new ObjectIdentifier(mechOid.toString()); @@ -465,42 +466,42 @@ class GSSContextImpl implements ExtendedGSSContext { } public void requestMutualAuth(boolean state) throws GSSException { - if (mechCtxt == null) + if (mechCtxt == null && initiator) reqMutualAuthState = state; } public void requestReplayDet(boolean state) throws GSSException { - if (mechCtxt == null) + if (mechCtxt == null && initiator) reqReplayDetState = state; } public void requestSequenceDet(boolean state) throws GSSException { - if (mechCtxt == null) + if (mechCtxt == null && initiator) reqSequenceDetState = state; } public void requestCredDeleg(boolean state) throws GSSException { - if (mechCtxt == null) + if (mechCtxt == null && initiator) reqCredDelegState = state; } public void requestAnonymity(boolean state) throws GSSException { - if (mechCtxt == null) + if (mechCtxt == null && initiator) reqAnonState = state; } public void requestConf(boolean state) throws GSSException { - if (mechCtxt == null) + if (mechCtxt == null && initiator) reqConfState = state; } public void requestInteg(boolean state) throws GSSException { - if (mechCtxt == null) + if (mechCtxt == null && initiator) reqIntegState = state; } public void requestLifetime(int lifetime) throws GSSException { - if (mechCtxt == null) + if (mechCtxt == null && initiator) reqLifetime = lifetime; } @@ -630,6 +631,8 @@ class GSSContextImpl implements ExtendedGSSContext { targName = null; } + // ExtendedGSSContext methods: + @Override public Object inquireSecContext(InquireType type) throws GSSException { SecurityManager security = System.getSecurityManager(); @@ -641,4 +644,18 @@ class GSSContextImpl implements ExtendedGSSContext { } return mechCtxt.inquireSecContext(type); } + + @Override + public void requestDelegPolicy(boolean state) throws GSSException { + if (mechCtxt == null && initiator) + reqDelegPolicyState = state; + } + + @Override + public boolean getDelegPolicyState() { + if (mechCtxt != null) + return mechCtxt.getDelegPolicyState(); + else + return reqDelegPolicyState; + } } diff --git a/src/share/classes/sun/security/jgss/krb5/InitialToken.java b/src/share/classes/sun/security/jgss/krb5/InitialToken.java index 2f0b834c1b91cb118f2000fb348fcc939cb20621..ed7eb8c6e18fbbe434cea569a27548aeb38e153f 100644 --- a/src/share/classes/sun/security/jgss/krb5/InitialToken.java +++ b/src/share/classes/sun/security/jgss/krb5/InitialToken.java @@ -85,32 +85,39 @@ abstract class InitialToken extends Krb5Token { int size = CHECKSUM_LENGTH_SIZE + CHECKSUM_BINDINGS_SIZE + CHECKSUM_FLAGS_SIZE; + if (!tgt.isForwardable()) { + context.setCredDelegState(false); + context.setDelegPolicyState(false); + } else if (context.getCredDelegState()) { + if (context.getDelegPolicyState()) { + if (!serviceTicket.checkDelegate()) { + // delegation not permitted by server policy, mark it + context.setDelegPolicyState(false); + } + } + } else if (context.getDelegPolicyState()) { + if (serviceTicket.checkDelegate()) { + context.setCredDelegState(true); + } else { + context.setDelegPolicyState(false); + } + } + if (context.getCredDelegState()) { - if (context.getCaller() instanceof HttpCaller && - !serviceTicket.getFlags()[Krb5.TKT_OPTS_DELEGATE]) { - // When the caller is HTTP/SPNEGO and OK-AS-DELEGATE - // is not present in the service ticket, delegation - // is disabled. - context.setCredDelegState(false); - } else if (!tgt.isForwardable()) { - // XXX log this resetting of delegation state - context.setCredDelegState(false); + KrbCred krbCred = null; + CipherHelper cipherHelper = + context.getCipherHelper(serviceTicket.getSessionKey()); + if (useNullKey(cipherHelper)) { + krbCred = new KrbCred(tgt, serviceTicket, + EncryptionKey.NULL_KEY); } else { - KrbCred krbCred = null; - CipherHelper cipherHelper = - context.getCipherHelper(serviceTicket.getSessionKey()); - if (useNullKey(cipherHelper)) { - krbCred = new KrbCred(tgt, serviceTicket, - EncryptionKey.NULL_KEY); - } else { - krbCred = new KrbCred(tgt, serviceTicket, - serviceTicket.getSessionKey()); - } - krbCredMessage = krbCred.getMessage(); - size += CHECKSUM_DELEG_OPT_SIZE + - CHECKSUM_DELEG_LGTH_SIZE + - krbCredMessage.length; + krbCred = new KrbCred(tgt, serviceTicket, + serviceTicket.getSessionKey()); } + krbCredMessage = krbCred.getMessage(); + size += CHECKSUM_DELEG_OPT_SIZE + + CHECKSUM_DELEG_LGTH_SIZE + + krbCredMessage.length; } checksumBytes = new byte[size]; @@ -296,6 +303,7 @@ abstract class InitialToken extends Krb5Token { return delegCreds; } + // Only called by acceptor public void setContextFlags(Krb5Context context) { // default for cred delegation is false if ((flags & CHECKSUM_DELEG_FLAG) > 0) diff --git a/src/share/classes/sun/security/jgss/krb5/Krb5Context.java b/src/share/classes/sun/security/jgss/krb5/Krb5Context.java index 4fe1e80f5f94afca5173933ce397374cfc1ec78c..8810ed606f9350f6bbfb644038185fa22ebce315 100644 --- a/src/share/classes/sun/security/jgss/krb5/Krb5Context.java +++ b/src/share/classes/sun/security/jgss/krb5/Krb5Context.java @@ -78,6 +78,7 @@ class Krb5Context implements GSSContextSpi { private boolean sequenceDetState = true; private boolean confState = true; private boolean integState = true; + private boolean delegPolicyState = false; private int mySeqNumber; private int peerSeqNumber; @@ -299,6 +300,21 @@ class Krb5Context implements GSSContextSpi { return sequenceDetState || replayDetState; } + /** + * Requests that the deleg policy be respected. + */ + public final void requestDelegPolicy(boolean value) { + if (state == STATE_NEW && isInitiator()) + delegPolicyState = value; + } + + /** + * Is deleg policy respected? + */ + public final boolean getDelegPolicyState() { + return delegPolicyState; + } + /* * Anonymity is a little different in that after an application * requests anonymity it will want to know whether the mechanism @@ -422,6 +438,10 @@ class Krb5Context implements GSSContextSpi { integState = state; } + final void setDelegPolicyState(boolean state) { + delegPolicyState = state; + } + /** * Sets the channel bindings to be used during context * establishment. diff --git a/src/share/classes/sun/security/jgss/spi/GSSContextSpi.java b/src/share/classes/sun/security/jgss/spi/GSSContextSpi.java index 5bf359a1f8ccf1d776a6ef8272a8b88d28e28aaf..aaf4eebc29fbd3ee7e8063ad9978b811f7df063b 100644 --- a/src/share/classes/sun/security/jgss/spi/GSSContextSpi.java +++ b/src/share/classes/sun/security/jgss/spi/GSSContextSpi.java @@ -124,6 +124,8 @@ public interface GSSContextSpi { public void requestInteg(boolean state) throws GSSException; + public void requestDelegPolicy(boolean state) throws GSSException; + public void setChannelBinding(ChannelBinding cb) throws GSSException; public boolean getCredDelegState(); @@ -136,6 +138,8 @@ public interface GSSContextSpi { public boolean getAnonymityState(); + public boolean getDelegPolicyState(); + public boolean isTransferable() throws GSSException; public boolean isProtReady(); diff --git a/src/share/classes/sun/security/jgss/spnego/SpNegoContext.java b/src/share/classes/sun/security/jgss/spnego/SpNegoContext.java index a436092f1bb6b4f98e0373b2960a6df648a78729..b002082d8cb1a99c7262bafab1737343490bb54e 100644 --- a/src/share/classes/sun/security/jgss/spnego/SpNegoContext.java +++ b/src/share/classes/sun/security/jgss/spnego/SpNegoContext.java @@ -63,6 +63,7 @@ public class SpNegoContext implements GSSContextSpi { private boolean sequenceDetState = true; private boolean confState = true; private boolean integState = true; + private boolean delegPolicyState = false; private GSSNameSpi peerName = null; private GSSNameSpi myName = null; @@ -153,6 +154,14 @@ public class SpNegoContext implements GSSContextSpi { integState = value; } + /** + * Requests that deleg policy be respected. + */ + public final void requestDelegPolicy(boolean value) throws GSSException { + if (state == STATE_NEW && isInitiator()) + delegPolicyState = value; + } + /** * Is integrity available? */ @@ -160,6 +169,19 @@ public class SpNegoContext implements GSSContextSpi { return integState; } + /** + * Is deleg policy respected? + */ + public final boolean getDelegPolicyState() { + if (isInitiator() && mechContext != null && + mechContext instanceof ExtendedGSSContext && + (state == STATE_IN_PROCESS || state == STATE_DONE)) { + return ((ExtendedGSSContext)mechContext).getDelegPolicyState(); + } else { + return delegPolicyState; + } + } + /** * Requests that credential delegation be done during context * establishment. @@ -173,7 +195,7 @@ public class SpNegoContext implements GSSContextSpi { * Is credential delegation enabled? */ public final boolean getCredDelegState() { - if (mechContext != null && + if (isInitiator() && mechContext != null && (state == STATE_IN_PROCESS || state == STATE_DONE)) { return mechContext.getCredDelegState(); } else { @@ -201,30 +223,6 @@ public class SpNegoContext implements GSSContextSpi { return mutualAuthState; } - final void setCredDelegState(boolean state) { - credDelegState = state; - } - - final void setMutualAuthState(boolean state) { - mutualAuthState = state; - } - - final void setReplayDetState(boolean state) { - replayDetState = state; - } - - final void setSequenceDetState(boolean state) { - sequenceDetState = state; - } - - final void setConfState(boolean state) { - confState = state; - } - - final void setIntegState(boolean state) { - integState = state; - } - /** * Returns the mechanism oid. * @@ -319,14 +317,9 @@ public class SpNegoContext implements GSSContextSpi { mechToken = GSS_initSecContext(null); errorCode = GSSException.DEFECTIVE_TOKEN; - byte[] micToken = null; - if (!GSSUtil.useMSInterop()) { - // calculate MIC only in normal mode - micToken = generateMechListMIC(DER_mechTypes); - } // generate SPNEGO token initToken = new NegTokenInit(DER_mechTypes, getContextFlags(), - mechToken, micToken); + mechToken, null); if (DEBUG) { System.out.println("SpNegoContext.initSecContext: " + "sending token of type = " + @@ -585,15 +578,9 @@ public class SpNegoContext implements GSSContextSpi { "negotiated result = " + negoResult); } - // calculate MIC only in normal mode - byte[] micToken = null; - if (!GSSUtil.useMSInterop() && valid) { - micToken = generateMechListMIC(DER_mechTypes); - } - // generate SPNEGO token NegTokenTarg targToken = new NegTokenTarg(negoResult.ordinal(), - mech_wanted, accept_token, micToken); + mech_wanted, accept_token, null); if (DEBUG) { System.out.println("SpNegoContext.acceptSecContext: " + "sending token of type = " + @@ -653,6 +640,10 @@ public class SpNegoContext implements GSSContextSpi { throw gssException; } + if (state == STATE_DONE) { + // now set the context flags for acceptor + setContextFlags(); + } return retVal; } @@ -703,36 +694,39 @@ public class SpNegoContext implements GSSContextSpi { return out; } + // Only called on acceptor side. On the initiator side, most flags + // are already set at request. For those that might get chanegd, + // state from mech below is used. private void setContextFlags() { if (mechContext != null) { // default for cred delegation is false if (mechContext.getCredDelegState()) { - setCredDelegState(true); + credDelegState = true; } // default for the following are true if (!mechContext.getMutualAuthState()) { - setMutualAuthState(false); + mutualAuthState = false; } if (!mechContext.getReplayDetState()) { - setReplayDetState(false); + replayDetState = false; } if (!mechContext.getSequenceDetState()) { - setSequenceDetState(false); + sequenceDetState = false; } if (!mechContext.getIntegState()) { - setIntegState(false); + integState = false; } if (!mechContext.getConfState()) { - setConfState(false); + confState = false; } } } /** - * generate MIC on mechList + * generate MIC on mechList. Not used at the moment. */ - private byte[] generateMechListMIC(byte[] mechTypes) + /*private byte[] generateMechListMIC(byte[] mechTypes) throws GSSException { // sanity check the required input @@ -769,7 +763,7 @@ public class SpNegoContext implements GSSContextSpi { } } return mic; - } + }*/ /** * verify MIC on MechList @@ -837,6 +831,10 @@ public class SpNegoContext implements GSSContextSpi { mechContext.requestMutualAuth(mutualAuthState); mechContext.requestReplayDet(replayDetState); mechContext.requestSequenceDet(sequenceDetState); + if (mechContext instanceof ExtendedGSSContext) { + ((ExtendedGSSContext)mechContext).requestDelegPolicy( + delegPolicyState); + } } // pass token @@ -1202,5 +1200,5 @@ public class SpNegoContext implements GSSContextSpi { "inquireSecContext not supported by underlying mech."); } } - } + diff --git a/src/share/classes/sun/security/jgss/spnego/SpNegoMechFactory.java b/src/share/classes/sun/security/jgss/spnego/SpNegoMechFactory.java index ae12d6b3a7854a61966011f099164ac64ff7cfdb..72b77ac716625ab8452541ae07c1556f94aaae10 100644 --- a/src/share/classes/sun/security/jgss/spnego/SpNegoMechFactory.java +++ b/src/share/classes/sun/security/jgss/spnego/SpNegoMechFactory.java @@ -57,6 +57,12 @@ public final class SpNegoMechFactory implements MechanismFactory { GSSName.NT_HOSTBASED_SERVICE, GSSName.NT_EXPORT_NAME}; + // The default underlying mech of SPNEGO, must not be SPNEGO itself. + private static final Oid DEFAULT_SPNEGO_MECH_OID = + ProviderList.DEFAULT_MECH_OID.equals(GSS_SPNEGO_MECH_OID)? + GSSUtil.GSS_KRB5_MECH_OID: + ProviderList.DEFAULT_MECH_OID; + // Use an instance of a GSSManager whose provider list // does not include native provider final GSSManagerImpl manager; @@ -100,18 +106,27 @@ public final class SpNegoMechFactory implements MechanismFactory { availableMechs[j++] = mechs[i]; } } + // Move the preferred mech to first place + for (int i=0; i>> Credentials acquireServiceCreds: " + + "global OK-AS-DELEGATE turned off at " + + newTgt.getServer()); + } + okAsDelegate = false; + } if (DEBUG) { @@ -283,6 +293,9 @@ rs. System.out.println(">>> Credentials acquireServiceCreds: returning creds:"); Credentials.printDebug(theCreds); } + if (!okAsDelegate) { + theCreds.resetDelegate(); + } return theCreds; } throw new KrbApErrException(Krb5.KRB_AP_ERR_GEN_CRED, diff --git a/src/share/classes/sun/security/pkcs/PKCS10.java b/src/share/classes/sun/security/pkcs/PKCS10.java index 595eed7c6af6e5a8ed957d193423406e39d39296..ef51273e9b2b2ce4ebfdc7ff3ece1c47a5d1ae2a 100644 --- a/src/share/classes/sun/security/pkcs/PKCS10.java +++ b/src/share/classes/sun/security/pkcs/PKCS10.java @@ -44,7 +44,6 @@ import sun.security.util.*; import sun.security.x509.AlgorithmId; import sun.security.x509.X509Key; import sun.security.x509.X500Name; -import sun.security.x509.X500Signer; /** * A PKCS #10 certificate request is created and sent to a Certificate @@ -183,13 +182,13 @@ public class PKCS10 { * Create the signed certificate request. This will later be * retrieved in either string or binary format. * - * @param requester identifies the signer (by X.500 name) - * and provides the private key used to sign. + * @param subject identifies the signer (by X.500 name). + * @param signature private key and signing algorithm to use. * @exception IOException on errors. * @exception CertificateException on certificate handling errors. * @exception SignatureException on signature handling errors. */ - public void encodeAndSign(X500Signer requester) + public void encodeAndSign(X500Name subject, Signature signature) throws CertificateException, IOException, SignatureException { DerOutputStream out, scratch; byte[] certificateRequestInfo; @@ -198,7 +197,7 @@ public class PKCS10 { if (encoded != null) throw new SignatureException("request is already signed"); - subject = requester.getSigner(); + this.subject = subject; /* * Encode cert request info, wrap in a sequence for signing @@ -217,14 +216,20 @@ public class PKCS10 { /* * Sign it ... */ - requester.update(certificateRequestInfo, 0, + signature.update(certificateRequestInfo, 0, certificateRequestInfo.length); - sig = requester.sign(); + sig = signature.sign(); /* * Build guts of SIGNED macro */ - requester.getAlgorithmId().encode(scratch); // sig algorithm + AlgorithmId algId = null; + try { + algId = AlgorithmId.getAlgorithmId(signature.getAlgorithm()); + } catch (NoSuchAlgorithmException nsae) { + throw new SignatureException(nsae); + } + algId.encode(scratch); // sig algorithm scratch.putBitString(sig); // sig /* diff --git a/src/share/classes/sun/security/provider/IdentityDatabase.java b/src/share/classes/sun/security/provider/IdentityDatabase.java deleted file mode 100644 index 0c118161c8a4d11de5bf2083993f3a61c162e953..0000000000000000000000000000000000000000 --- a/src/share/classes/sun/security/provider/IdentityDatabase.java +++ /dev/null @@ -1,427 +0,0 @@ -/* - * Copyright 1996-2006 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 sun.security.provider; - -import java.io.*; -import java.util.*; -import java.security.*; - -/** - * An implementation of IdentityScope as a persistent identity - * database. - * - * @see Identity - * @see Key - * - * @author Benjamin Renaud - */ -public -class IdentityDatabase extends IdentityScope implements Serializable { - - /** use serialVersionUID from JDK 1.1. for interoperability */ - private static final long serialVersionUID = 4923799573357658384L; - - /* Are we debugging? */ - private static final boolean debug = false; - - /* Are we printing out error messages? */ - private static final boolean error = true; - - /* The source file, if any, for this database.*/ - File sourceFile; - - /* The private representation of the database.*/ - Hashtable identities; - - IdentityDatabase() throws InvalidParameterException { - this("restoring..."); - } - - /** - * Construct a new, empty database with a specified source file. - * - * @param file the source file. - */ - public IdentityDatabase(File file) throws InvalidParameterException { - this(file.getName()); - sourceFile = file; - } - - /** - * Construct a new, empty database. - */ - public IdentityDatabase(String name) throws InvalidParameterException { - super(name); - identities = new Hashtable(); - } - - /** - * Initialize an identity database from a stream. The stream should - * contain data to initialized a serialized IdentityDatabase - * object. - * - * @param is the input stream from which to restore the database. - * - * @exception IOException if a stream IO exception occurs - */ - public static IdentityDatabase fromStream(InputStream is) - throws IOException { - IdentityDatabase db = null; - try { - ObjectInputStream ois = new ObjectInputStream(is); - db = (IdentityDatabase)ois.readObject(); - } catch (ClassNotFoundException e) { - // this can't happen. - debug("This should not be happening.", e); - error( - "The version of the database is obsolete. Cannot initialize."); - - } catch (InvalidClassException e) { - // this may happen in developers workspaces happen. - debug("This should not be happening.", e); - error("Unable to initialize system identity scope: " + - " InvalidClassException. \nThis is most likely due to " + - "a serialization versioning problem: a class used in " + - "key management was obsoleted"); - - } catch (StreamCorruptedException e) { - debug("The serialization stream is corrupted. Unable to load.", e); - error("Unable to initialize system identity scope." + - " StreamCorruptedException."); - } - - if (db == null) { - db = new IdentityDatabase("uninitialized"); - } - - return db; - } - - /** - * Initialize an IdentityDatabase from file. - * - * @param f the filename where the identity database is stored. - * - * @exception IOException a file-related exception occurs (e.g. - * the directory of the file passed does not exists, etc. - * - * @IOException if a file IO exception occurs. - */ - public static IdentityDatabase fromFile(File f) throws IOException { - FileInputStream fis = new FileInputStream(f); - IdentityDatabase edb = fromStream(fis); - edb.sourceFile = f; - return edb; - } - - - - /** - * @return the number of identities in the database. - */ - public int size() { - return identities.size(); - } - - - /** - * @param name the name of the identity to be retrieved. - * - * @return the identity named name, or null if there are - * no identities named name in the database. - */ - public Identity getIdentity(String name) { - Identity id = identities.get(name); - if (id instanceof Signer) { - localCheck("get.signer"); - } - return id; - } - - /** - * Get an identity by key. - * - * @param name the key of the identity to be retrieved. - * - * @return the identity with a given key, or null if there are no - * identities with that key in the database. - */ - public Identity getIdentity(PublicKey key) { - if (key == null) { - return null; - } - Enumeration e = identities(); - while (e.hasMoreElements()) { - Identity i = e.nextElement(); - PublicKey k = i.getPublicKey(); - if (k != null && keyEqual(k, key)) { - if (i instanceof Signer) { - localCheck("get.signer"); - } - return i; - } - } - return null; - } - - private boolean keyEqual(Key key1, Key key2) { - if (key1 == key2) { - return true; - } else { - return MessageDigest.isEqual(key1.getEncoded(), key2.getEncoded()); - } - } - - /** - * Adds an identity to the database. - * - * @param identity the identity to be added. - * - * @exception KeyManagementException if a name or key clash - * occurs, or if another exception occurs. - */ - public void addIdentity(Identity identity) - throws KeyManagementException { - localCheck("add.identity"); - Identity byName = getIdentity(identity.getName()); - Identity byKey = getIdentity(identity.getPublicKey()); - String msg = null; - - if (byName != null) { - msg = "name conflict"; - } - if (byKey != null) { - msg = "key conflict"; - } - if (msg != null) { - throw new KeyManagementException(msg); - } - identities.put(identity.getName(), identity); - } - - /** - * Removes an identity to the database. - */ - public void removeIdentity(Identity identity) - throws KeyManagementException { - localCheck("remove.identity"); - String name = identity.getName(); - if (identities.get(name) == null) { - throw new KeyManagementException("there is no identity named " + - name + " in " + this); - } - identities.remove(name); - } - - /** - * @return an enumeration of all identities in the database. - */ - public Enumeration identities() { - return identities.elements(); - } - - /** - * Set the source file for this database. - */ - void setSourceFile(File f) { - sourceFile = f; - } - - /** - * @return the source file for this database. - */ - File getSourceFile() { - return sourceFile; - } - - /** - * Save the database in its current state to an output stream. - * - * @param os the output stream to which the database should be serialized. - * - * @exception IOException if an IO exception is raised by stream - * operations. - */ - public void save(OutputStream os) throws IOException { - try { - ObjectOutputStream oos = new ObjectOutputStream(os); - oos.writeObject(this); - oos.flush(); - } catch (InvalidClassException e) { - debug("This should not be happening.", e); - return; - } - } - - /** - * Save the database to a file. - * - * @exception IOException if an IO exception is raised by stream - * operations. - */ - void save(File f) throws IOException { - setSourceFile(f); - FileOutputStream fos = new FileOutputStream(f); - save(fos); - } - - /** - * Saves the database to the default source file. - * - * @exception KeyManagementException when there is no default source - * file specified for this database. - */ - public void save() throws IOException { - if (sourceFile == null) { - throw new IOException("this database has no source file"); - } - save(sourceFile); - } - - /** - * This method returns the file from which to initialize the - * system database. - */ - private static File systemDatabaseFile() { - - // First figure out where the identity database is hiding, if anywhere. - String dbPath = Security.getProperty("identity.database"); - // if nowhere, it's the canonical place. - if (dbPath == null) { - dbPath = System.getProperty("user.home") + File.separatorChar + - "identitydb.obj"; - } - return new File(dbPath); - } - - - /* This block initializes the system database, if there is one. */ - static { - java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { - public Void run() { - initializeSystem(); - return null; - } - }); - } - - /** - * This method initializes the system's identity database. The - * canonical location is - * /identitydatabase.obj. This is settable through - * the identity.database property. */ - private static void initializeSystem() { - - IdentityDatabase systemDatabase; - File dbFile = systemDatabaseFile(); - - // Second figure out if it's there, and if it isn't, create one. - try { - if (dbFile.exists()) { - debug("loading system database from file: " + dbFile); - systemDatabase = fromFile(dbFile); - } else { - systemDatabase = new IdentityDatabase(dbFile); - } - IdentityScope.setSystemScope(systemDatabase); - debug("System database initialized: " + systemDatabase); - } catch (IOException e) { - debug("Error initializing identity database: " + dbFile, e); - return; - } catch (InvalidParameterException e) { - debug("Error trying to instantiate a system identities db in " + - dbFile, e); - return; - } - } - - /* - private static File securityPropFile(String filename) { - // maybe check for a system property which will specify where to - // look. - String sep = File.separator; - return new File(System.getProperty("java.home") + - sep + "lib" + sep + "security" + - sep + filename); - } - */ - - public String toString() { - return "sun.security.provider.IdentityDatabase, source file: " + - sourceFile; - } - - - private static void debug(String s) { - if (debug) { - System.err.println(s); - } - } - - private static void debug(String s, Throwable t) { - if (debug) { - t.printStackTrace(); - System.err.println(s); - } - } - - private static void error(String s) { - if (error) { - System.err.println(s); - } - } - - void localCheck(String directive) { - SecurityManager security = System.getSecurityManager(); - if (security != null) { - directive = this.getClass().getName() + "." + - directive + "." + localFullName(); - security.checkSecurityAccess(directive); - } - } - - /** - * Returns a parsable name for identity: identityName.scopeName - */ - String localFullName() { - String parsable = getName(); - if (getScope() != null) { - parsable += "." +getScope().getName(); - } - return parsable; - } - - /** - * Serialization write. - */ - private synchronized void writeObject (java.io.ObjectOutputStream stream) - throws IOException { - localCheck("serialize.identity.database"); - stream.writeObject(identities); - stream.writeObject(sourceFile); - } -} diff --git a/src/share/classes/sun/security/provider/PolicyFile.java b/src/share/classes/sun/security/provider/PolicyFile.java index ed4757d3cff21e7e7ded1b42d29a31b7f24a0a3e..c5ae8316d108b07fefc75f2cf1eb8b49bc5e3bee 100644 --- a/src/share/classes/sun/security/provider/PolicyFile.java +++ b/src/share/classes/sun/security/provider/PolicyFile.java @@ -295,16 +295,13 @@ public class PolicyFile extends java.security.Policy { private static final int DEFAULT_CACHE_SIZE = 1; - /** the scope to check */ - private static IdentityScope scope = null; - // contains the policy grant entries, PD cache, and alias mapping private AtomicReference policyInfo = new AtomicReference(); private boolean constructed = false; private boolean expandProperties = true; - private boolean ignoreIdentityScope = false; + private boolean ignoreIdentityScope = true; private boolean allowSystemProperties = true; private boolean notUtf8 = false; private URL url; @@ -2024,85 +2021,9 @@ public class PolicyFile extends java.security.Policy { private boolean checkForTrustedIdentity(final Certificate cert, PolicyInfo myInfo) { - if (cert == null) - return false; - - // see if we are ignoring the identity scope or not - if (ignoreIdentityScope) - return false; - - // try to initialize scope - synchronized(PolicyFile.class) { - if (scope == null) { - IdentityScope is = IdentityScope.getSystemScope(); - - if (is instanceof sun.security.provider.IdentityDatabase) { - scope = is; - } else { - // leave scope null - } - } - } - - if (scope == null) { - ignoreIdentityScope = true; - return false; - } - - // need privileged block for getIdentity in case we are trying - // to get a signer - final Identity id = AccessController.doPrivileged( - new java.security.PrivilegedAction() { - public Identity run() { - return scope.getIdentity(cert.getPublicKey()); - } - }); - - if (isTrusted(id)) { - if (debug != null) { - debug.println("Adding policy entry for trusted Identity: "); - //needed for identity toString! - AccessController.doPrivileged( - new java.security.PrivilegedAction() { - public Void run() { - debug.println(" identity = " + id); - return null; - } - }); - debug.println(""); - } - - // add it to the policy for future reference - Certificate certs[] = new Certificate[] {cert}; - PolicyEntry pe = new PolicyEntry(new CodeSource(null, certs)); - pe.add(SecurityConstants.ALL_PERMISSION); - - myInfo.identityPolicyEntries.add(pe); - - // add it to the mapping as well so - // we don't have to go through this again - myInfo.aliasMapping.put(cert, id.getName()); - - return true; - } return false; } - private static boolean isTrusted(Identity id) { - if (id instanceof SystemIdentity) { - SystemIdentity sysid = (SystemIdentity)id; - if (sysid.isTrusted()) { - return true; - } - } else if (id instanceof SystemSigner) { - SystemSigner sysid = (SystemSigner)id; - if (sysid.isTrusted()) { - return true; - } - } - return false; - } - /** * Each entry in the policy configuration file is represented by a * PolicyEntry object.

diff --git a/src/share/classes/sun/security/provider/SystemIdentity.java b/src/share/classes/sun/security/provider/SystemIdentity.java deleted file mode 100644 index 7759bbca9aaa0fc02aa3bc28cd224c633cb26e79..0000000000000000000000000000000000000000 --- a/src/share/classes/sun/security/provider/SystemIdentity.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright 1996-2000 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 sun.security.provider; - -import java.io.Serializable; -import java.util.Enumeration; -import java.security.*; - -/** - * An identity with a very simple trust mechanism. - * - * @author Benjamin Renaud - */ - -public class SystemIdentity extends Identity implements Serializable { - - /** use serialVersionUID from JDK 1.1. for interoperability */ - private static final long serialVersionUID = 9060648952088498478L; - - /* This should be changed to ACL */ - boolean trusted = false; - - /* Free form additional information about this identity. */ - private String info; - - public SystemIdentity(String name, IdentityScope scope) - throws InvalidParameterException, KeyManagementException { - super(name, scope); - } - - /** - * Is this identity trusted by sun.* facilities? - */ - public boolean isTrusted() { - return trusted; - } - - /** - * Set the trust status of this identity. - */ - protected void setTrusted(boolean trusted) { - this.trusted = trusted; - } - - void setIdentityInfo(String info) { - super.setInfo(info); - } - - String getIndentityInfo() { - return super.getInfo(); - } - - /** - * Call back method into a protected method for package friends. - */ - void setIdentityPublicKey(PublicKey key) throws KeyManagementException { - setPublicKey(key); - } - - /** - * Call back method into a protected method for package friends. - */ - void addIdentityCertificate(Certificate cert) - throws KeyManagementException { - addCertificate(cert); - } - - void clearCertificates() throws KeyManagementException { - Certificate[] certs = certificates(); - for (int i = 0; i < certs.length; i++) { - removeCertificate(certs[i]); - } - } - - public String toString() { - String trustedString = "not trusted"; - if (trusted) { - trustedString = "trusted"; - } - return super.toString() + "[" + trustedString + "]"; - } - - -} diff --git a/src/share/classes/sun/security/provider/SystemSigner.java b/src/share/classes/sun/security/provider/SystemSigner.java deleted file mode 100644 index 4bd2ee8db232f5156ef236a387b54cb7b8f07260..0000000000000000000000000000000000000000 --- a/src/share/classes/sun/security/provider/SystemSigner.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright 1996-2000 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 sun.security.provider; - -import java.util.*; -import java.security.*; - -/** - * SunSecurity signer. Like SystemIdentity, it has a trust bit, which - * can be set by SunSecurity classes, and a set of accessors for other - * classes in sun.security.*. - * - * @author Benjamin Renaud - */ - -public class SystemSigner extends Signer { - - /** use serialVersionUID from JDK 1.1. for interoperability */ - private static final long serialVersionUID = -2127743304301557711L; - - /* Is this signer trusted */ - private boolean trusted = false; - - /** - * Construct a signer with a given name. - */ - public SystemSigner(String name) { - super(name); - } - - /** - * Construct a signer with a name and a scope. - * - * @param name the signer's name. - * - * @param scope the scope for this signer. - */ - public SystemSigner(String name, IdentityScope scope) - throws KeyManagementException { - - super(name, scope); - } - - /* Set the trust status of this signer */ - void setTrusted(boolean trusted) { - this.trusted = trusted; - } - - /** - * Returns true if this signer is trusted. - */ - public boolean isTrusted() { - return trusted; - } - - /* friendly callback for set keys */ - void setSignerKeyPair(KeyPair pair) - throws InvalidParameterException, KeyException { - setKeyPair(pair); - } - - /* friendly callback for getting private keys */ - PrivateKey getSignerPrivateKey() { - return getPrivateKey(); - } - - void setSignerInfo(String s) { - setInfo(s); - } - - /** - * Call back method into a protected method for package friends. - */ - void addSignerCertificate(Certificate cert) throws KeyManagementException { - addCertificate(cert); - } - - void clearCertificates() throws KeyManagementException { - Certificate[] certs = certificates(); - for (int i = 0; i < certs.length; i++) { - removeCertificate(certs[i]); - } - } - - public String toString() { - String trustedString = "not trusted"; - if (trusted) { - trustedString = "trusted"; - } - return super.toString() + "[" + trustedString + "]"; - } -} diff --git a/src/share/classes/sun/security/provider/certpath/OCSPChecker.java b/src/share/classes/sun/security/provider/certpath/OCSPChecker.java index 499a5912aca40022c639e1c42139cc8a91262418..3d17803f765d236c1c1c131838d868eecc000962 100644 --- a/src/share/classes/sun/security/provider/certpath/OCSPChecker.java +++ b/src/share/classes/sun/security/provider/certpath/OCSPChecker.java @@ -335,10 +335,13 @@ class OCSPChecker extends PKIXCertPathChecker { response = OCSP.check(Collections.singletonList(certId), uri, responderCert, pkixParams.getDate()); } catch (Exception e) { - // Wrap all exceptions in CertPathValidatorException so that - // we can fallback to CRLs, if enabled. - throw new CertPathValidatorException - ("Unable to send OCSP request", e); + if (e instanceof CertPathValidatorException) { + throw (CertPathValidatorException) e; + } else { + // Wrap exceptions in CertPathValidatorException so that + // we can fallback to CRLs, if enabled. + throw new CertPathValidatorException(e); + } } RevocationStatus rs = (RevocationStatus) response.getSingleResponse(certId); diff --git a/src/share/classes/sun/security/tools/JarSigner.java b/src/share/classes/sun/security/tools/JarSigner.java index 005d8aa1bfda3e1c9447ea73eb25790b5f7bcdd0..5c824c5712fbe4bc35b29c1054ee45f14bdf5db7 100644 --- a/src/share/classes/sun/security/tools/JarSigner.java +++ b/src/share/classes/sun/security/tools/JarSigner.java @@ -118,8 +118,6 @@ public class JarSigner { KeyStore store; // the keystore specified by -keystore // or the default keystore, never null - IdentityScope scope; - String keystore; // key store file boolean nullStream = false; // null keystore input stream (NONE) boolean token = false; // token-based keystore @@ -212,7 +210,6 @@ public class JarSigner { if (verify) { try { loadKeyStore(keystore, false); - scope = IdentityScope.getSystemScope(); } catch (Exception e) { if ((keystore != null) || (storepass != null)) { System.out.println(rb.getString("jarsigner error: ") + @@ -984,13 +981,6 @@ public class JarSigner { result |= IN_KEYSTORE; } } - if (!found && (scope != null)) { - Identity id = scope.getIdentity(c.getPublicKey()); - if (id != null) { - result |= IN_SCOPE; - storeHash.put(c, "[" + id.getName() + "]"); - } - } if (ckaliases.contains(alias)) { result |= SIGNED_BY_ALIAS; } diff --git a/src/share/classes/sun/security/tools/KeyTool.java b/src/share/classes/sun/security/tools/KeyTool.java index b3b0f7365ab47ddc90cb5df237ecca91d602b8cf..cacdbe834965d82c8df55f8248427a0d412c30f1 100644 --- a/src/share/classes/sun/security/tools/KeyTool.java +++ b/src/share/classes/sun/security/tools/KeyTool.java @@ -40,7 +40,6 @@ import java.security.UnrecoverableEntryException; import java.security.UnrecoverableKeyException; import java.security.Principal; import java.security.Provider; -import java.security.Identity; import java.security.cert.Certificate; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; @@ -57,9 +56,6 @@ import java.net.URLClassLoader; import sun.misc.BASE64Encoder; import sun.security.util.ObjectIdentifier; import sun.security.pkcs.PKCS10; -import sun.security.provider.IdentityDatabase; -import sun.security.provider.SystemSigner; -import sun.security.provider.SystemIdentity; import sun.security.provider.X509Factory; import sun.security.util.DerOutputStream; import sun.security.util.Password; @@ -1163,18 +1159,16 @@ public final class KeyTool { Signature signature = Signature.getInstance(sigAlgName); signature.initSign(privateKey); - X500Signer signer = new X500Signer(signature, issuer); - X509CertInfo info = new X509CertInfo(); info.set(X509CertInfo.VALIDITY, interval); info.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber( new java.util.Random().nextInt() & 0x7fffffff)); info.set(X509CertInfo.VERSION, - new CertificateVersion(CertificateVersion.V3)); + new CertificateVersion(CertificateVersion.V3)); info.set(X509CertInfo.ALGORITHM_ID, - new CertificateAlgorithmId(signer.getAlgorithmId())); - info.set(X509CertInfo.ISSUER, - new CertificateIssuerName(signer.getSigner())); + new CertificateAlgorithmId( + AlgorithmId.getAlgorithmId(sigAlgName))); + info.set(X509CertInfo.ISSUER, new CertificateIssuerName(issuer)); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); boolean canRead = false; @@ -1249,7 +1243,7 @@ public final class KeyTool { request.getAttributes().setAttribute(X509CertInfo.EXTENSIONS, new PKCS10Attribute(PKCS9Attribute.EXTENSION_REQUEST_OID, ext)); - // Construct an X500Signer object, so that we can sign the request + // Construct a Signature object, so that we can sign the request if (sigAlgName == null) { sigAlgName = getCompatibleSigAlgName(privKey.getAlgorithm()); } @@ -1259,10 +1253,9 @@ public final class KeyTool { 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 - request.encodeAndSign(signer); + request.encodeAndSign(subject, signature); request.print(out); } @@ -1564,75 +1557,8 @@ public final class KeyTool { private void doImportIdentityDatabase(InputStream in) throws Exception { - byte[] encoded; - ByteArrayInputStream bais; - java.security.cert.X509Certificate newCert; - java.security.cert.Certificate[] chain = null; - PrivateKey privKey; - boolean modified = false; - - IdentityDatabase idb = IdentityDatabase.fromStream(in); - for (Enumeration enum_ = idb.identities(); - enum_.hasMoreElements();) { - Identity id = enum_.nextElement(); - newCert = null; - // only store trusted identities in keystore - if ((id instanceof SystemSigner && ((SystemSigner)id).isTrusted()) - || (id instanceof SystemIdentity - && ((SystemIdentity)id).isTrusted())) { - // ignore if keystore entry with same alias name already exists - if (keyStore.containsAlias(id.getName())) { - MessageFormat form = new MessageFormat - (rb.getString("Keystore entry for already exists")); - Object[] source = {id.getName()}; - System.err.println(form.format(source)); - continue; - } - java.security.Certificate[] certs = id.certificates(); - if (certs!=null && certs.length>0) { - // we can only store one user cert per identity. - // convert old-style to new-style cert via the encoding - DerOutputStream dos = new DerOutputStream(); - certs[0].encode(dos); - encoded = dos.toByteArray(); - bais = new ByteArrayInputStream(encoded); - newCert = (X509Certificate)cf.generateCertificate(bais); - bais.close(); - - // if certificate is self-signed, make sure it verifies - if (isSelfSigned(newCert)) { - PublicKey pubKey = newCert.getPublicKey(); - try { - newCert.verify(pubKey); - } catch (Exception e) { - // ignore this cert - continue; - } - } - - if (id instanceof SystemSigner) { - MessageFormat form = new MessageFormat(rb.getString - ("Creating keystore entry for ...")); - Object[] source = {id.getName()}; - System.err.println(form.format(source)); - if (chain==null) { - chain = new java.security.cert.Certificate[1]; - } - chain[0] = newCert; - privKey = ((SystemSigner)id).getPrivateKey(); - keyStore.setKeyEntry(id.getName(), privKey, storePass, - chain); - } else { - keyStore.setCertificateEntry(id.getName(), newCert); - } - kssave = true; - } - } - } - if (!kssave) { - System.err.println(rb.getString - ("No entries from identity database added")); - } + System.err.println(rb.getString + ("No entries from identity database added")); } /** diff --git a/src/share/classes/sun/security/util/SecurityConstants.java b/src/share/classes/sun/security/util/SecurityConstants.java index 89c6fd7fdea445fa4dea06c28114e18cf539c3fd..8ba512390b10e46892047576e2f297f853a369d1 100644 --- a/src/share/classes/sun/security/util/SecurityConstants.java +++ b/src/share/classes/sun/security/util/SecurityConstants.java @@ -33,7 +33,6 @@ import java.security.Permission; import java.security.BasicPermission; import java.security.SecurityPermission; import java.security.AllPermission; -import javax.security.auth.AuthPermission; /** * Permission constants and string constants used to create permissions @@ -259,12 +258,4 @@ public final class SecurityConstants { // java.lang.SecurityManager public static final SocketPermission LOCAL_LISTEN_PERMISSION = new SocketPermission("localhost:1024-", SOCKET_LISTEN_ACTION); - - // javax.security.auth.Subject - public static final AuthPermission DO_AS_PERMISSION = - new AuthPermission("doAs"); - - // javax.security.auth.Subject - public static final AuthPermission DO_AS_PRIVILEGED_PERMISSION = - new AuthPermission("doAsPrivileged"); } diff --git a/src/share/classes/sun/security/validator/PKIXValidator.java b/src/share/classes/sun/security/validator/PKIXValidator.java index 1cc6a4ee5a4367eb108adf0a9f5e854227f78b86..eb12ef2200241b0b11c81c8c113589559e655b97 100644 --- a/src/share/classes/sun/security/validator/PKIXValidator.java +++ b/src/share/classes/sun/security/validator/PKIXValidator.java @@ -150,9 +150,17 @@ public final class PKIXValidator extends Validator { ("null or zero-length certificate chain"); } if (TRY_VALIDATOR) { - // check if chain contains trust anchor + // check that chain is in correct order and check if chain contains + // trust anchor + X500Principal prevIssuer = null; for (int i = 0; i < chain.length; i++) { - if (trustedCerts.contains(chain[i])) { + X509Certificate cert = chain[i]; + if (i != 0 && + !cert.getSubjectX500Principal().equals(prevIssuer)) { + // chain is not ordered correctly, call builder instead + return doBuild(chain, otherCerts); + } + if (trustedCerts.contains(cert)) { if (i == 0) { return new X509Certificate[] {chain[0]}; } @@ -161,6 +169,7 @@ public final class PKIXValidator extends Validator { System.arraycopy(chain, 0, newChain, 0, i); return doValidate(newChain); } + prevIssuer = cert.getIssuerX500Principal(); } // apparently issued by trust anchor? @@ -303,5 +312,4 @@ public final class PKIXValidator extends Validator { ("PKIX path building failed: " + e.toString(), e); } } - } diff --git a/src/share/classes/sun/security/x509/CertAndKeyGen.java b/src/share/classes/sun/security/x509/CertAndKeyGen.java index 2cf34c871ec733e1b12eb0187c6c69b97c3a0aa7..feeaf4cf3ebcfa492c5bb201778d4fb92c00257d 100644 --- a/src/share/classes/sun/security/x509/CertAndKeyGen.java +++ b/src/share/classes/sun/security/x509/CertAndKeyGen.java @@ -189,41 +189,6 @@ public final class CertAndKeyGen { } - /** - * Returns a self-signed X.509v1 certificate for the public key. - * The certificate is immediately valid. - * - *

Such certificates normally are used to identify a "Certificate - * Authority" (CA). Accordingly, they will not always be accepted by - * other parties. However, such certificates are also useful when - * you are bootstrapping your security infrastructure, or deploying - * system prototypes. - * - * @deprecated Use the new - * - * @param myname X.500 name of the subject (who is also the issuer) - * @param validity how long the certificate should be valid, in seconds - */ - @Deprecated - public X509Cert getSelfCert (X500Name myname, long validity) - throws InvalidKeyException, SignatureException, NoSuchAlgorithmException - { - X509Certificate cert; - - try { - cert = getSelfCertificate(myname, validity); - return new X509Cert(cert.getEncoded()); - } catch (CertificateException e) { - throw new SignatureException(e.getMessage()); - } catch (NoSuchProviderException e) { - throw new NoSuchAlgorithmException(e.getMessage()); - } catch (IOException e) { - throw new SignatureException(e.getMessage()); - } - } - - /** * Returns a self-signed X.509v3 certificate for the public key. * The certificate is immediately valid. No extensions. @@ -248,13 +213,10 @@ public final class CertAndKeyGen { throws CertificateException, InvalidKeyException, SignatureException, NoSuchAlgorithmException, NoSuchProviderException { - X500Signer issuer; X509CertImpl cert; Date lastDate; try { - issuer = getSigner (myname); - lastDate = new Date (); lastDate.setTime (firstDate.getTime () + validity * 1000); @@ -267,14 +229,13 @@ public final class CertAndKeyGen { new CertificateVersion(CertificateVersion.V3)); info.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber( new java.util.Random().nextInt() & 0x7fffffff)); - AlgorithmId algID = issuer.getAlgorithmId(); + AlgorithmId algID = AlgorithmId.getAlgorithmId(sigAlg); info.set(X509CertInfo.ALGORITHM_ID, new CertificateAlgorithmId(algID)); info.set(X509CertInfo.SUBJECT, new CertificateSubjectName(myname)); info.set(X509CertInfo.KEY, new CertificateX509Key(publicKey)); info.set(X509CertInfo.VALIDITY, interval); - info.set(X509CertInfo.ISSUER, - new CertificateIssuerName(issuer.getSigner())); + info.set(X509CertInfo.ISSUER, new CertificateIssuerName(myname)); cert = new X509CertImpl(info); cert.sign(privateKey, this.sigAlg); @@ -315,7 +276,9 @@ public final class CertAndKeyGen { PKCS10 req = new PKCS10 (publicKey); try { - req.encodeAndSign (getSigner (myname)); + Signature signature = Signature.getInstance(sigAlg); + signature.initSign (privateKey); + req.encodeAndSign(myname, signature); } catch (CertificateException e) { throw new SignatureException (sigAlg + " CertificateException"); @@ -330,18 +293,6 @@ public final class CertAndKeyGen { return req; } - private X500Signer getSigner (X500Name me) - throws InvalidKeyException, NoSuchAlgorithmException - { - Signature signature = Signature.getInstance(sigAlg); - - // XXX should have a way to pass prng to the signature - // algorithm ... appropriate for DSS/DSA, not RSA - - signature.initSign (privateKey); - return new X500Signer (signature, me); - } - private SecureRandom prng; private String sigAlg; private KeyPairGenerator keyGen; diff --git a/src/share/classes/sun/security/x509/X500Signer.java b/src/share/classes/sun/security/x509/X500Signer.java deleted file mode 100644 index b51b31d329e7d7c95ef49342be8b9e5e8b5c5973..0000000000000000000000000000000000000000 --- a/src/share/classes/sun/security/x509/X500Signer.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright 1996-2003 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 sun.security.x509; - -import java.security.Signature; -import java.security.SignatureException; -import java.security.Signer; -import java.security.NoSuchAlgorithmException; - -/** - * This class provides a binding between a Signature object and an - * authenticated X.500 name (from an X.509 certificate chain), which - * is needed in many public key signing applications. - * - *

The name of the signer is important, both because knowing it is the - * whole point of the signature, and because the associated X.509 certificate - * is always used to verify the signature. - * - *

The X.509 certificate chain is temporarily not associated with - * the signer, but this omission will be resolved. - * - * - * @author David Brownell - * @author Amit Kapoor - * @author Hemma Prafullchandra - */ -public final class X500Signer extends Signer -{ - private static final long serialVersionUID = -8609982645394364834L; - - /** - * Called for each chunk of the data being signed. That - * is, you can present the data in many chunks, so that - * it doesn't need to be in a single sequential buffer. - * - * @param buf buffer holding the next chunk of the data to be signed - * @param offset starting point of to-be-signed data - * @param len how many bytes of data are to be signed - * @exception SignatureException on errors. - */ - public void update(byte buf[], int offset, int len) - throws SignatureException { - sig.update (buf, offset, len); - } - - /** - * Produces the signature for the data processed by update(). - * - * @exception SignatureException on errors. - */ - public byte[] sign() throws SignatureException { - return sig.sign(); - } - - /** - * Returns the algorithm used to sign. - */ - public AlgorithmId getAlgorithmId() { - return algid; - } - - /** - * Returns the name of the signing agent. - */ - public X500Name getSigner() { - return agent; - } - - /* - * Constructs a binding between a signature and an X500 name - * from an X.509 certificate. - */ - // package private ----hmmmmm ????? - public X500Signer(Signature sig, X500Name agent) { - if (sig == null || agent == null) - throw new IllegalArgumentException ("null parameter"); - - this.sig = sig; - this.agent = agent; - - try { - this.algid = AlgorithmId.getAlgorithmId(sig.getAlgorithm()); - - } catch (NoSuchAlgorithmException e) { - throw new RuntimeException("internal error! " + e.getMessage()); - } - } - - private Signature sig; - private X500Name agent; // XXX should be X509CertChain - private AlgorithmId algid; -} diff --git a/src/share/classes/sun/security/x509/X509Cert.java b/src/share/classes/sun/security/x509/X509Cert.java deleted file mode 100644 index e90014c0493e562481a971c17c97be50fa102936..0000000000000000000000000000000000000000 --- a/src/share/classes/sun/security/x509/X509Cert.java +++ /dev/null @@ -1,892 +0,0 @@ -/* - * Copyright 1997-2008 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 sun.security.x509; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.math.BigInteger; -import java.security.*; -import java.util.Date; -import java.util.Enumeration; - -import sun.security.util.*; // DER - -/** - * @author David Brownell - * - * @see CertAndKeyGen - * @deprecated Use the new X509Certificate class. - * This class is only restored for backwards compatibility. - */ -@Deprecated -public class X509Cert implements Certificate, Serializable { - - static final long serialVersionUID = -52595524744692374L; - - /* - * NOTE: All fields are marked transient, because we do not want them to - * be included in the class description when we serialize an object of - * this class. We override "writeObject" and "readObject" to use the - * ASN.1 encoding of a certificate as the serialized form, instead of - * calling the default routines which would operate on the field values. - * - * MAKE SURE TO MARK ANY FIELDS THAT ARE ADDED IN THE FUTURE AS TRANSIENT. - */ - - /* The algorithm id */ - transient protected AlgorithmId algid; - - /* - * Certificate data, and its envelope - */ - transient private byte rawCert []; - transient private byte signature []; - transient private byte signedCert []; - - /* - * X509.v1 data (parsed) - */ - transient private X500Name subject; // from subject - transient private PublicKey pubkey; - - transient private Date notafter; // from CA (constructor) - transient private Date notbefore; - - transient private int version; // from CA (signAndEncode) - transient private BigInteger serialnum; - transient private X500Name issuer; - transient private AlgorithmId issuerSigAlg; - - /* - * flag to indicate whether or not this certificate has already been parsed - * (through a call to one of the constructors or the "decode" or - * "readObject" methods). This is to ensure that certificates are - * immutable. - */ - transient private boolean parsed=false; - - /* - * X509.v2 extensions - */ - - /* - * X509.v3 extensions - */ - - /* - * Other extensions ... Netscape, Verisign, SET, etc - */ - - - /** - * Construct a uninitialized X509 Cert on which - * decode must later be called (or which may be deserialized). - */ - // XXX deprecated, delete this - public X509Cert() { } - - - /** - * Unmarshals a certificate from its encoded form, parsing the - * encoded bytes. This form of constructor is used by agents which - * need to examine and use certificate contents. That is, this is - * one of the more commonly used constructors. Note that the buffer - * must include only a certificate, and no "garbage" may be left at - * the end. If you need to ignore data at the end of a certificate, - * use another constructor. - * - * @param cert the encoded bytes, with no terminatu (CONSUMED) - * @exception IOException when the certificate is improperly encoded. - */ - public X509Cert(byte cert []) throws IOException - { - DerValue in = new DerValue (cert); - parse (in); - if (in.data.available () != 0) - throw new CertParseError ("garbage at end"); - signedCert = cert; - } - - - /** - * Unmarshals a certificate from its encoded form, parsing the - * encoded bytes. This form of constructor is used by agents which - * need to examine and use certificate contents. That is, this is - * one of the most commonly used constructors. - * - * @param buf the buffer holding the encoded bytes - * @param offset the offset in the buffer where the bytes begin - * @param len how many bytes of certificate exist - * - * @exception IOException when the certificate is improperly encoded. - */ - public X509Cert(byte buf [], int offset, int len) throws IOException - { - DerValue in = new DerValue (buf, offset, len); - - parse (in); - if (in.data.available () != 0) - throw new CertParseError ("garbage at end"); - signedCert = new byte [len]; - System.arraycopy (buf, offset, signedCert, 0, len); - } - - - /** - * Unmarshal a certificate from its encoded form, parsing a DER value. - * This form of constructor is used by agents which need to examine - * and use certificate contents. - * - * @param derVal the der value containing the encoded cert. - * @exception IOException when the certificate is improperly encoded. - */ - public X509Cert(DerValue derVal) throws IOException - { - parse (derVal); - if (derVal.data.available () != 0) - throw new CertParseError ("garbage at end"); - signedCert = derVal.toByteArray (); - } - - - /** - * Partially constructs a certificate from descriptive parameters. - * This constructor may be used by Certificate Authority (CA) code, - * which later signs and encodes the - * certificate. Also, self-signed certificates serve as CA certificates, - * and are sometimes used as certificate requests. - * - *

Until the certificate has been signed and encoded, some of - * the mandatory fields in the certificate will not be available - * via accessor functions: the serial number, issuer name and signing - * algorithm, and of course the signed certificate. The fields passed - * to this constructor are available, and must be non-null. - * - *

Note that the public key being signed is generally independent of - * the signature algorithm being used. So for example Diffie-Hellman - * keys (which do not support signatures) can be placed in X.509 - * certificates when some other signature algorithm (e.g. DSS/DSA, - * or one of the RSA based algorithms) is used. - * - * @see CertAndKeyGen - * - * @param subjectName the X.500 distinguished name being certified - * @param subjectPublicKey the public key being certified. This - * must be an "X509Key" implementing the "PublicKey" interface. - * @param notBefore the first time the certificate is valid - * @param notAfter the last time the certificate is valid - * - * @exception CertException if the public key is inappropriate - */ - public X509Cert(X500Name subjectName, X509Key subjectPublicKey, - Date notBefore, Date notAfter) throws CertException - { - subject = subjectName; - - if (!(subjectPublicKey instanceof PublicKey)) - throw new CertException (CertException.err_INVALID_PUBLIC_KEY, - "Doesn't implement PublicKey interface"); - - // The X509 cert API requires X509 keys, else things break. - pubkey = subjectPublicKey; - notbefore = notBefore; - notafter = notAfter; - version = 0; - } - - - /** - * Decode an X.509 certificate from an input stream. - * - * @param in an input stream holding at least one certificate - * @exception IOException when the certificate is improperly encoded, or - * if it has already been parsed. - */ - public void decode(InputStream in) throws IOException - { - DerValue val = new DerValue(in); - parse(val); - signedCert = val.toByteArray(); - } - - - /** - * Appends the certificate to an output stream. - * - * @param out an input stream to which the certificate is appended. - * @exception IOException when appending fails. - */ - public void encode (OutputStream out) throws IOException - { out.write (getSignedCert ()); } - - - /** - * Compares two certificates. This is false if the - * certificates are not both X.509 certs, otherwise it - * compares them as binary data. - * - * @param other the object being compared with this one - * @return true iff the certificates are equivalent - */ - public boolean equals (Object other) - { - if (other instanceof X509Cert) - return equals ((X509Cert) other); - else - return false; - } - - - /** - * Compares two certificates, returning false if any data - * differs between the two. - * - * @param other the object being compared with this one - * @return true iff the certificates are equivalent - */ - public boolean equals (X509Cert src) - { - if (this == src) - return true; - if (signedCert == null || src.signedCert == null) - return false; - if (signedCert.length != src.signedCert.length) - return false; - for (int i = 0; i < signedCert.length; i++) - if (signedCert [i] != src.signedCert [i]) - return false; - return true; - } - - - /** Returns the "X.509" format identifier. */ - public String getFormat () // for Certificate - { return "X.509"; } - - - /** Returns getIssuerName */ - public Principal getGuarantor () // for Certificate - { return getIssuerName (); } - - - /** Returns getSubjectName */ - public Principal getPrincipal () - { return getSubjectName (); } - - - /** - * Throws an exception if the certificate is invalid because it is - * now outside of the certificate's validity period, or because it - * was not signed using the verification key provided. Successfully - * verifying a certificate does not indicate that one should - * trust the entity which it represents. - * - *

Note that since this class represents only a single X.509 - * certificate, it cannot know anything about the certificate chain - * which is used to provide the verification key and to establish trust. - * Other code must manage and use those cert chains. - * - *

For now, you must walk the cert chain being used to verify any - * given cert. Start at the root, which is a self-signed certificate; - * verify it using the key inside the certificate. Then use that to - * verify the next certificate in the chain, issued by that CA. In - * this manner, verify each certificate until you reach the particular - * certificate you wish to verify. You should not use a certificate - * if any of the verification operations for its certificate chain - * were unsuccessful. - * - * - * @param issuerPublicKey the public key of the issuing CA - * @exception CertException when the certificate is not valid. - */ - public void verify (PublicKey issuerPublicKey) - throws CertException - { - Date now = new Date (); - - if (now.before (notbefore)) - throw new CertException (CertException.verf_INVALID_NOTBEFORE); - if (now.after (notafter)) - throw new CertException (CertException.verf_INVALID_EXPIRED); - if (signedCert == null) - throw new CertException (CertException.verf_INVALID_SIG, - "?? certificate is not signed yet ??"); - - // - // Verify the signature ... - // - String algName = null; - - try { - Signature sigVerf = null; - - algName = issuerSigAlg.getName(); - sigVerf = Signature.getInstance(algName); - sigVerf.initVerify (issuerPublicKey); - sigVerf.update (rawCert, 0, rawCert.length); - - if (!sigVerf.verify (signature)) { - throw new CertException (CertException.verf_INVALID_SIG, - "Signature ... by <" + issuer + "> for <" + subject + ">"); - } - - // Gag -- too many catch clauses, let most through. - - } catch (NoSuchAlgorithmException e) { - throw new CertException (CertException.verf_INVALID_SIG, - "Unsupported signature algorithm (" + algName + ")"); - - } catch (InvalidKeyException e) { - // e.printStackTrace(); - throw new CertException (CertException.err_INVALID_PUBLIC_KEY, - "Algorithm (" + algName + ") rejected public key"); - - } catch (SignatureException e) { - throw new CertException (CertException.verf_INVALID_SIG, - "Signature by <" + issuer + "> for <" + subject + ">"); - } - } - - - /** - * Creates an X.509 certificate, and signs it using the issuer - * passed (associating a signature algorithm and an X.500 name). - * This operation is used to implement the certificate generation - * functionality of a certificate authority. - * - * @see #getSignedCert - * @see #getSigner - * @see CertAndKeyGen - * - * @param serial the serial number of the certificate (non-null) - * @param issuer the certificate issuer (CA) (non-null) - * @return the signed certificate, as returned by getSignedCert - * - * @exception IOException if any of the data could not be encoded, - * or when any mandatory data was omitted - * @exception SignatureException on signing failures - */ - public byte [] - encodeAndSign ( - BigInteger serial, - X500Signer issuer - ) throws IOException, SignatureException - { - rawCert = null; - - /* - * Get the remaining cert parameters, and make sure we have enough. - * - * We deduce version based on what attribute data are available - * For now, we have no attributes, so we always deduce X.509v1 ! - */ - version = 0; - serialnum = serial; - this.issuer = issuer.getSigner (); - issuerSigAlg = issuer.getAlgorithmId (); - - if (subject == null || pubkey == null - || notbefore == null || notafter == null) - throw new IOException ("not enough cert parameters"); - - /* - * Encode the raw cert, create its signature and put it - * into the envelope. - */ - rawCert = DERencode (); - signedCert = sign (issuer, rawCert); - return signedCert; - } - - - /** - * Returns an X500Signer that may be used to create signatures. Those - * signature may in turn be verified using this certificate (or a - * copy of it). - * - *

NOTE: If the private key is by itself capable of - * creating signatures, this fact may not be recognized at this time. - * Specifically, the case of DSS/DSA keys which get their algorithm - * parameters from higher in the certificate chain is not supportable - * without using an X509CertChain API, and there is no current support - * for other sources of algorithm parameters. - * - * @param algorithm the signature algorithm to be used. Note that a - * given public/private key pair may support several such algorithms. - * @param privateKey the private key used to create the signature, - * which must correspond to the public key in this certificate - * @return the Signer object - * - * @exception NoSuchAlgorithmException if the signature - * algorithm is not supported - * @exception InvalidKeyException if either the key in the certificate, - * or the private key parameter, does not support the requested - * signature algorithm - */ - public X500Signer getSigner (AlgorithmId algorithmId, - PrivateKey privateKey) - throws NoSuchAlgorithmException, InvalidKeyException - { - String algorithm; - Signature sig; - - if (privateKey instanceof Key) { - Key key = (Key)privateKey; - algorithm = key.getAlgorithm(); - } else { - throw new InvalidKeyException("private key not a key!"); - } - - sig = Signature.getInstance(algorithmId.getName()); - - if (!pubkey.getAlgorithm ().equals (algorithm)) { - - throw new InvalidKeyException( "Private key algorithm " + - algorithm + - " incompatible with certificate " + - pubkey.getAlgorithm()); - } - sig.initSign (privateKey); - return new X500Signer (sig, subject); - } - - - /** - * Returns a signature object that may be used to verify signatures - * created using a specified signature algorithm and the public key - * contained in this certificate. - * - *

NOTE: If the public key in this certificate is not by - * itself capable of verifying signatures, this may not be recognized - * at this time. Specifically, the case of DSS/DSA keys which get - * their algorithm parameters from higher in the certificate chain - * is not supportable without using an X509CertChain API, and there - * is no current support for other sources of algorithm parameters. - * - * @param algorithm the algorithm of the signature to be verified - * @return the Signature object - * @exception NoSuchAlgorithmException if the signature - * algorithm is not supported - * @exception InvalidKeyException if the key in the certificate - * does not support the requested signature algorithm - */ - public Signature getVerifier(String algorithm) - throws NoSuchAlgorithmException, InvalidKeyException - { - String algName; - Signature sig; - - sig = Signature.getInstance(algorithm); - sig.initVerify (pubkey); - return sig; - } - - - - /** - * Return the signed X.509 certificate as a byte array. - * The bytes are in standard DER marshaled form. - * Null is returned in the case of a partially constructed cert. - */ - public byte [] getSignedCert () - { return signedCert.clone(); } - - - /** - * Returns the certificate's serial number. - * Null is returned in the case of a partially constructed cert. - */ - public BigInteger getSerialNumber () - { return serialnum; } - - - /** - * Returns the subject's X.500 distinguished name. - */ - public X500Name getSubjectName () - { return subject; } - - - /** - * Returns the certificate issuer's X.500 distinguished name. - * Null is returned in the case of a partially constructed cert. - */ - public X500Name getIssuerName () - { return issuer; } - - - /** - * Returns the algorithm used by the issuer to sign the certificate. - * Null is returned in the case of a partially constructed cert. - */ - public AlgorithmId getIssuerAlgorithmId () - { return issuerSigAlg; } - - - /** - * Returns the first time the certificate is valid. - */ - public Date getNotBefore () - { return new Date(notbefore.getTime()); } - - - /** - * Returns the last time the certificate is valid. - */ - public Date getNotAfter () - { return new Date(notafter.getTime()); } - - - /** - * Returns the subject's public key. Note that some public key - * algorithms support an optional certificate generation policy - * where the keys in the certificates are not in themselves sufficient - * to perform a public key operation. Those keys need to be augmented - * by algorithm parameters, which the certificate generation policy - * chose not to place in the certificate. - * - *

Two such public key algorithms are: DSS/DSA, where algorithm - * parameters could be acquired from a CA certificate in the chain - * of issuers; and Diffie-Hellman, with a similar solution although - * the CA then needs both a Diffie-Hellman certificate and a signature - * capable certificate. - */ - public PublicKey getPublicKey () - { return pubkey; } - - - /** - * Returns the X.509 version number of this certificate, zero based. - * That is, "2" indicates an X.509 version 3 (1993) certificate, - * and "0" indicates X.509v1 (1988). - * Zero is returned in the case of a partially constructed cert. - */ - public int getVersion () - { return version; } - - - /** - * Calculates a hash code value for the object. Objects - * which are equal will also have the same hashcode. - */ - public int hashCode () - { - int retval = 0; - - for (int i = 0; i < signedCert.length; i++) - retval += signedCert [i] * i; - return retval; - } - - - /** - * Returns a printable representation of the certificate. This does not - * contain all the information available to distinguish this from any - * other certificate. The certificate must be fully constructed - * before this function may be called; in particular, if you are - * creating certificates you must call encodeAndSign() before calling - * this function. - */ - public String toString () - { - String s; - - if (subject == null || pubkey == null - || notbefore == null || notafter == null - || issuer == null || issuerSigAlg == null - || serialnum == null) - throw new NullPointerException ("X.509 cert is incomplete"); - - s = " X.509v" + (version + 1) + " certificate,\n"; - s += " Subject is " + subject + "\n"; - s += " Key: " + pubkey; - s += " Validity <" + notbefore + "> until <" + notafter + ">\n"; - s += " Issuer is " + issuer + "\n"; - s += " Issuer signature used " + issuerSigAlg.toString () + "\n"; - s += " Serial number = " + Debug.toHexString(serialnum) + "\n"; - - // optional v2, v3 extras - - return "[\n" + s + "]"; - } - - - /** - * Returns a printable representation of the certificate. - * - * @param detailed true iff lots of detail is requested - */ - public String toString (boolean detailed) - { return toString (); } - - - /************************************************************/ - - /* - * Cert is a SIGNED ASN.1 macro, a three elment sequence: - * - * - Data to be signed (ToBeSigned) -- the "raw" cert - * - Signature algorithm (SigAlgId) - * - The signature bits - * - * This routine unmarshals the certificate, saving the signature - * parts away for later verification. - */ - private void parse (DerValue val) throws IOException - { - if (parsed == true) { - throw new IOException("Certificate already parsed"); - } - - DerValue seq [] = new DerValue [3]; - - seq [0] = val.data.getDerValue (); - seq [1] = val.data.getDerValue (); - seq [2] = val.data.getDerValue (); - - if (val.data.available () != 0) - throw new CertParseError ("signed overrun, bytes = " - + val.data.available ()); - if (seq [0].tag != DerValue.tag_Sequence) - throw new CertParseError ("signed fields invalid"); - - rawCert = seq [0].toByteArray (); // XXX slow; fixme! - - - issuerSigAlg = AlgorithmId.parse (seq [1]); - signature = seq [2].getBitString (); - - if (seq [1].data.available () != 0) { - // XXX why was this error check commented out? - // It was originally part of the next check. - throw new CertParseError ("algid field overrun"); - } - - if (seq [2].data.available () != 0) - throw new CertParseError ("signed fields overrun"); - - /* - * Let's have fun parsing the cert itself. - */ - DerInputStream in; - DerValue tmp; - - in = seq [0].data; - - /* - * Version -- this is optional (default zero). If it's there it's - * the first field and is specially tagged. - * - * Both branches leave "tmp" holding a value for the serial - * number that comes next. - */ - version = 0; - tmp = in.getDerValue (); - if (tmp.isConstructed () && tmp.isContextSpecific ()) { - version = tmp.data.getInteger(); - if (tmp.data.available () != 0) - throw new IOException ("X.509 version, bad format"); - tmp = in.getDerValue (); - } - - /* - * serial number ... an integer - */ - serialnum = tmp.getBigInteger (); - - /* - * algorithm type for CA's signature ... needs to match the - * one on the envelope, and that's about it! different IDs - * may represent a signature attack. In general we want to - * inherit parameters. - */ - tmp = in.getDerValue (); - { - AlgorithmId algid; - - - algid = AlgorithmId.parse(tmp); - - if (!algid.equals (issuerSigAlg)) - throw new CertParseError ("CA Algorithm mismatch!"); - - this.algid = algid; - } - - /* - * issuer name - */ - issuer = new X500Name (in); - - /* - * validity: SEQUENCE { start date, end date } - */ - tmp = in.getDerValue (); - if (tmp.tag != DerValue.tag_Sequence) - throw new CertParseError ("corrupt validity field"); - - notbefore = tmp.data.getUTCTime (); - notafter = tmp.data.getUTCTime (); - if (tmp.data.available () != 0) - throw new CertParseError ("excess validity data"); - - /* - * subject name and public key - */ - subject = new X500Name (in); - - tmp = in.getDerValue (); - pubkey = X509Key.parse (tmp); - - /* - * XXX for v2 and later, a bunch of tagged options follow - */ - - if (in.available () != 0) { - /* - * Until we parse V2/V3 data ... ignore it. - * - // throw new CertParseError ("excess cert data"); - System.out.println ( - "@end'o'cert, optional V2/V3 data unparsed: " - + in.available () - + " bytes" - ); - */ - } - - parsed = true; - } - - - /* - * Encode only the parts that will later be signed. - */ - private byte [] DERencode () throws IOException - { - DerOutputStream raw = new DerOutputStream (); - - encode (raw); - return raw.toByteArray (); - } - - - /* - * Marshal the contents of a "raw" certificate into a DER sequence. - */ - private void encode (DerOutputStream out) throws IOException - { - DerOutputStream tmp = new DerOutputStream (); - - /* - * encode serial number, issuer signing algorithm, - * and issuer name into the data we'll return - */ - tmp.putInteger (serialnum); - issuerSigAlg.encode (tmp); - issuer.encode (tmp); - - /* - * Validity is a two element sequence ... encode the - * elements, then wrap them into the data we'll return - */ - { - DerOutputStream seq = new DerOutputStream (); - - seq.putUTCTime (notbefore); - seq.putUTCTime (notafter); - tmp.write (DerValue.tag_Sequence, seq); - } - - /* - * Encode subject (principal) and associated key - */ - subject.encode (tmp); - tmp.write(pubkey.getEncoded()); - - /* - * Wrap the data; encoding of the "raw" cert is now complete. - */ - out.write (DerValue.tag_Sequence, tmp); - } - - - /* - * Calculate the signature of the "raw" certificate, - * and marshal the cert with the signature and a - * description of the signing algorithm. - */ - private byte [] sign (X500Signer issuer, byte data []) - throws IOException, SignatureException - { - /* - * Encode the to-be-signed data, then the algorithm used - * to create the signature. - */ - DerOutputStream out = new DerOutputStream (); - DerOutputStream tmp = new DerOutputStream (); - - tmp.write (data); - issuer.getAlgorithmId ().encode(tmp); - - - /* - * Create and encode the signature itself. - */ - issuer.update (data, 0, data.length); - signature = issuer.sign (); - tmp.putBitString (signature); - - /* - * Wrap the signed data in a SEQUENCE { data, algorithm, sig } - */ - out.write (DerValue.tag_Sequence, tmp); - return out.toByteArray (); - } - - - /** - * Serialization write ... X.509 certificates serialize as - * themselves, and they're parsed when they get read back. - * (Actually they serialize as some type data from the - * serialization subsystem, then the cert data.) - */ - private void writeObject (java.io.ObjectOutputStream stream) - throws IOException - { encode(stream); } - - /** - * Serialization read ... X.509 certificates serialize as - * themselves, and they're parsed when they get read back. - */ - private void readObject (ObjectInputStream stream) - throws IOException - { decode(stream); } -} diff --git a/src/share/classes/sun/tools/jar/JarVerifierStream.java b/src/share/classes/sun/tools/jar/JarVerifierStream.java deleted file mode 100644 index 52a48d18dd31149f4a58aeebb82d66b34174e205..0000000000000000000000000000000000000000 --- a/src/share/classes/sun/tools/jar/JarVerifierStream.java +++ /dev/null @@ -1,295 +0,0 @@ -/* - * Copyright 1996-2008 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 sun.tools.jar; - -import java.io.*; -import java.util.*; -import java.util.zip.*; -import java.util.jar.*; -import java.security.cert.Certificate; -import java.security.AccessController; -import java.security.cert.X509Certificate; -import java.security.PublicKey; -import java.security.Principal; -import sun.security.provider.SystemIdentity; - -/** - * This is OBSOLETE. DO NOT USE THIS. Use - * java.util.jar.JarEntry.getCertificates instead. It has to stay here - * because some apps (namely HJ and HJV) call directly into it. - * - * This class is stripped down greatly from JDK 1.1.x. - * - * @author Roland Schemers - */ -public class JarVerifierStream extends ZipInputStream { - - private JarEntry current; - private Hashtable> verified - = new Hashtable>(); - private JarInputStream jis; - private sun.tools.jar.Manifest man = null; - - /** - * construct a JarVerfierStream from an input stream. - */ - public JarVerifierStream(InputStream is) - throws IOException - { - super(is); - jis = new JarInputStream(is); - } - - public void close() - throws IOException - { - jis.close(); - } - - public void closeEntry() throws IOException { - jis.closeEntry(); - } - - /** - * This method scans to see which entry we're parsing and - * keeps various state information depending on what type of - * file is being parsed. Files it treats specially are:

    - * - *
  • Manifest files. At any point, this stream can be queried - * for a manifest. If it is present, a Manifest object will be - * returned. - * - *
  • Block Signature file. Like with the manifest, the stream - * can be queried at any time for all blocks parsed thus far. - * - *
- */ - public synchronized ZipEntry getNextEntry() throws IOException { - current = (JarEntry) jis.getNextEntry(); - return current; - } - - /** - * read a single byte. - */ - public int read() throws IOException { - int n = jis.read(); - if (n == -1) { - addIds(); - } - return n; - } - - /** - * read an array of bytes. - */ - public int read(byte[] b, int off, int len) throws IOException { - int n = jis.read(b, off, len); - if (n == -1) { - addIds(); - } - return n; - } - - private void addIds() - { - - if (current != null) { - Certificate[] certs = current.getCertificates(); - if (certs != null) { - Vector ids = getIds(certs); - if (ids != null) { - verified.put(current.getName(), ids); - } - } - } - } - - /** - * Returns a Hashtable mapping filenames to vectors of identities. - */ - public Hashtable getVerifiedSignatures() { - /* we may want to return a copy of this at some point. - For now we simply trust the caller */ - if (verified.isEmpty()) - return null; - else - return verified; - } - - /** - * Returns an enumeration of PKCS7 blocks. This looks bogus, - * but Hotjava just checks to see if enumeration is not null - * to see if anything was signed! - */ - public Enumeration getBlocks() { - if (verified.isEmpty()) { - return null; - } else { - return new Enumeration() { - public boolean hasMoreElements() { return false; } - public Object nextElement() { return null; } - }; - } - } - - /** - * This method used to be called by various versions of - * AppletResourceLoader, even though they didn't do anything with - * the result. We leave them and return null for backwards compatability. - */ - public Hashtable getNameToHash() { - return null; - } - - /** - * Convert java.util.jar.Manifest object to a sun.tools.jar.Manifest - * object. - */ - - public sun.tools.jar.Manifest getManifest() { - if (man == null) { - try { - java.util.jar.Manifest jman = jis.getManifest(); - if (jman == null) - return null; - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - jman.write(baos); - byte[] data = baos.toByteArray(); - man = new sun.tools.jar.Manifest(data); - } catch (IOException ioe) { - // return null - } - } - return man; - } - - static class CertCache { - Certificate [] certs; - Vector ids; - - boolean equals(Certificate[] certs) { - if (this.certs == null) { - if (certs!= null) - return false; - else - return true; - } - - if (certs == null) - return false; - - boolean match; - - for (int i = 0; i < certs.length; i++) { - match = false; - for (int j = 0; j < this.certs.length; j++) { - if (certs[i].equals(this.certs[j])) { - match = true; - break; - } - } - if (!match) return false; - } - - for (int i = 0; i < this.certs.length; i++) { - match = false; - for (int j = 0; j < certs.length; j++) { - if (this.certs[i].equals(certs[j])) { - match = true; - break; - } - } - if (!match) return false; - } - return true; - } - } - - private ArrayList certCache = null; - - - /** - * Returns the Identity vector for the given array of Certificates - */ - protected Vector getIds(Certificate[] certs) { - if (certs == null) - return null; - - if (certCache == null) - certCache = new ArrayList(); - CertCache cc; - for (int i = 0; i < certCache.size(); i++) { - cc = certCache.get(i); - if (cc.equals(certs)) { - return cc.ids; - } - } - cc = new CertCache(); - cc.certs = certs; - - if (certs.length > 0) { - for (int i=0; i() { - public Void run() - throws java.security.KeyManagementException - { - id.addCertificate(oldC); - return null; - } - }); - } catch (java.security.PrivilegedActionException pae) { - throw (java.security.KeyManagementException) - pae.getException(); - } - if (cc.ids == null) - cc.ids = new Vector(); - cc.ids.addElement(id); - } catch (java.security.KeyManagementException kme) { - // ignore if we can't create Identity - } catch (IOException ioe) { - // ignore if we can't parse - } catch (java.security.cert.CertificateEncodingException cee) { - // ignore if we can't encode - } - } - } - certCache.add(cc); - return cc.ids; - } -} diff --git a/src/share/classes/sun/tracing/MultiplexProviderFactory.java b/src/share/classes/sun/tracing/MultiplexProviderFactory.java index 6ede31ec158b73539225e268910a0aedd8b8ae0a..14c27c76d869f5da00205395315f85081bcae0aa 100644 --- a/src/share/classes/sun/tracing/MultiplexProviderFactory.java +++ b/src/share/classes/sun/tracing/MultiplexProviderFactory.java @@ -30,7 +30,6 @@ import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.HashSet; import java.util.Set; -import java.util.logging.Logger; import com.sun.tracing.ProviderFactory; import com.sun.tracing.Provider; @@ -65,13 +64,7 @@ public class MultiplexProviderFactory extends ProviderFactory { providers.add(factory.createProvider(cls)); } MultiplexProvider provider = new MultiplexProvider(cls, providers); - try { - provider.init(); - } catch (Exception e) { - // Probably a permission problem (can't get declared members) - Logger.getAnonymousLogger().warning( - "Could not initialize tracing provider: " + e.getMessage()); - } + provider.init(); return provider.newProxyInstance(); } } diff --git a/src/share/classes/sun/tracing/NullProviderFactory.java b/src/share/classes/sun/tracing/NullProviderFactory.java index f567acabb324818dee82611fa554d9bb061c32b9..5416fe35e53bc69fcda0eba09f388682e61c7150 100644 --- a/src/share/classes/sun/tracing/NullProviderFactory.java +++ b/src/share/classes/sun/tracing/NullProviderFactory.java @@ -26,7 +26,6 @@ package sun.tracing; import java.lang.reflect.Method; -import java.util.logging.Logger; import com.sun.tracing.ProviderFactory; import com.sun.tracing.Provider; @@ -53,13 +52,7 @@ public class NullProviderFactory extends ProviderFactory { */ public T createProvider(Class cls) { NullProvider provider = new NullProvider(cls); - try { - provider.init(); - } catch (Exception e) { - // Probably a permission problem (can't get declared members) - Logger.getAnonymousLogger().warning( - "Could not initialize tracing provider: " + e.getMessage()); - } + provider.init(); return provider.newProxyInstance(); } } diff --git a/src/share/classes/sun/tracing/PrintStreamProviderFactory.java b/src/share/classes/sun/tracing/PrintStreamProviderFactory.java index 53013041653479f7833dcb8c09cc4baffeca4c54..cca6bb58df53d37f9467d75a1ef1e4dfa3d21fae 100644 --- a/src/share/classes/sun/tracing/PrintStreamProviderFactory.java +++ b/src/share/classes/sun/tracing/PrintStreamProviderFactory.java @@ -28,7 +28,6 @@ package sun.tracing; import java.lang.reflect.Method; import java.io.PrintStream; import java.util.HashMap; -import java.util.logging.Logger; import com.sun.tracing.ProviderFactory; import com.sun.tracing.Provider; @@ -54,13 +53,7 @@ public class PrintStreamProviderFactory extends ProviderFactory { public T createProvider(Class cls) { PrintStreamProvider provider = new PrintStreamProvider(cls, stream); - try { - provider.init(); - } catch (Exception e) { - // Probably a permission problem (can't get declared members) - Logger.getAnonymousLogger().warning( - "Could not initialize tracing provider: " + e.getMessage()); - } + provider.init(); return provider.newProxyInstance(); } } diff --git a/src/share/classes/sun/tracing/ProviderSkeleton.java b/src/share/classes/sun/tracing/ProviderSkeleton.java index 0178fe46ed85a45510be09b7b7537caae0349548..dd7cbb1976a43a9a27a815d93beeccf028c536a5 100644 --- a/src/share/classes/sun/tracing/ProviderSkeleton.java +++ b/src/share/classes/sun/tracing/ProviderSkeleton.java @@ -32,6 +32,8 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.AnnotatedElement; import java.lang.annotation.Annotation; import java.util.HashMap; +import java.security.AccessController; +import java.security.PrivilegedAction; import com.sun.tracing.Provider; import com.sun.tracing.Probe; @@ -99,7 +101,13 @@ public abstract class ProviderSkeleton implements InvocationHandler, Provider { * It is up to the factory implementations to call this after construction. */ public void init() { - for (Method m : providerType.getDeclaredMethods()) { + Method[] methods = AccessController.doPrivileged(new PrivilegedAction() { + public Method[] run() { + return providerType.getDeclaredMethods(); + } + }); + + for (Method m : methods) { if ( m.getReturnType() != Void.TYPE ) { throw new IllegalArgumentException( "Return value of method is not void"); diff --git a/src/share/classes/sun/tracing/dtrace/DTraceProviderFactory.java b/src/share/classes/sun/tracing/dtrace/DTraceProviderFactory.java index 3148f6f6db4ee7fb7773d751621dcd16c0beadfa..ce921d88eebe91f35cf121dd4e02735e08c574ff 100644 --- a/src/share/classes/sun/tracing/dtrace/DTraceProviderFactory.java +++ b/src/share/classes/sun/tracing/dtrace/DTraceProviderFactory.java @@ -29,7 +29,6 @@ import java.util.Map; import java.util.Set; import java.util.HashMap; import java.util.HashSet; -import java.util.logging.Logger; import java.security.Permission; import com.sun.tracing.ProviderFactory; @@ -80,15 +79,8 @@ public final class DTraceProviderFactory extends ProviderFactory { DTraceProvider jsdt = new DTraceProvider(cls); T proxy = jsdt.newProxyInstance(); jsdt.setProxy(proxy); - try { - jsdt.init(); - new Activation(jsdt.getModuleName(), new DTraceProvider[] { jsdt }); - } catch (Exception e) { - // Probably a permission problem (can't get declared members) - Logger.getAnonymousLogger().warning( - "Could not initialize tracing provider: " + e.getMessage()); - jsdt.dispose(); - } + jsdt.init(); + new Activation(jsdt.getModuleName(), new DTraceProvider[] { jsdt }); return proxy; } diff --git a/src/share/classes/sun/util/CoreResourceBundleControl-XLocales.java b/src/share/classes/sun/util/CoreResourceBundleControl-XLocales.java.template similarity index 100% rename from src/share/classes/sun/util/CoreResourceBundleControl-XLocales.java rename to src/share/classes/sun/util/CoreResourceBundleControl-XLocales.java.template diff --git a/src/share/classes/sun/util/LocaleDataMetaInfo-XLocales.java b/src/share/classes/sun/util/LocaleDataMetaInfo-XLocales.java.template similarity index 100% rename from src/share/classes/sun/util/LocaleDataMetaInfo-XLocales.java rename to src/share/classes/sun/util/LocaleDataMetaInfo-XLocales.java.template diff --git a/src/solaris/bin/java_md.c b/src/solaris/bin/java_md.c index 73efc1090fddb70c1e82ef639f8bcf9cef8ebe76..7c68ed0831632a057c030c52200962224f23a151 100644 --- a/src/solaris/bin/java_md.c +++ b/src/solaris/bin/java_md.c @@ -1,5 +1,5 @@ /* - * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-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 @@ -51,9 +51,9 @@ * two data models and cohabitation of jre/jdk bits with both data * models is supported, then DUAL_MODE is defined. When DUAL_MODE is * defined, the architecture names for the narrow and wide version of - * the architecture are defined in LIBARCH64NAME and LIBARCH32NAME. Currently - * only Solaris on sparc/sparcv9 and i586/amd64 is DUAL_MODE; linux - * i586/amd64 could be defined as DUAL_MODE but that is not the + * the architecture are defined in LIBARCH64NAME and LIBARCH32NAME. + * Currently only Solaris on sparc/sparcv9 and i586/amd64 is DUAL_MODE; + * linux i586/amd64 could be defined as DUAL_MODE but that is not the * current policy. */ @@ -103,49 +103,56 @@ static char *execname = NULL; * platform independent routine SelectVersion. This may result in * the exec of the specified launcher version. * - * Typically, the launcher execs at least once to ensure a suitable - * LD_LIBRARY_PATH is in effect for the process. The first exec - * screens out all the data model options; leaving the choice of data - * model implicit in the binary selected to run. However, in case no - * exec is done, the data model options are screened out before the vm - * is invoked. + * Previously the launcher modified the LD_LIBRARY_PATH appropriately for the + * desired data model path, regardless if data models matched or not. The + * launcher subsequently exec'ed the desired executable, in order to make the + * LD_LIBRARY_PATH path available for the runtime linker. This is no longer the + * case, the launcher dlopens the target libjvm.so. All other required + * libraries are loaded by the runtime linker, by virtue of the $ORIGIN paths + * baked into the shared libraries, by the build infrastructure at compile time. * - * incoming argv ------------------------------ - * | | - * \|/ | - * CheckJVMType | - * (removes -client, -server, etc.) | - * \|/ - * CreateExecutionEnvironment - * (removes -d32 and -d64, - * determines desired data model, - * sets up LD_LIBRARY_PATH, - * and exec's) - * | - * -------------------------------------------- + * Main + * (incoming argv) + * | + * \|/ + * SelectVersion + * (selects the JRE version, note: not data model) + * | + * \|/ + * CreateExecutionEnvironment + * (determines desired data model) + * | * | * \|/ - * exec child 1 incoming argv ----------------- + * Have Desired Model ? --> NO --> Is Dual-Mode ? --> NO --> Exit(with error) + * | | + * | | + * | \|/ + * | YES + * | | * | | - * \|/ | - * CheckJVMType | - * (removes -client, -server, etc.) | * | \|/ - * | CreateExecutionEnvironment - * | (verifies desired data model - * | is running and acceptable - * | LD_LIBRARY_PATH; - * | no-op in child) + * | CheckJvmType + * | (removes -client, -server etc.) + * | | + * | | + * \|/ \|/ + * YES (find the desired executable and exec child) + * | | + * | | + * \|/ \|/ + * CheckJvmType Main + * (removes -client, -server, etc.) + * | * | * \|/ * TranslateDashJArgs... * (Prepare to pass args to vm) * | * | - * | * \|/ * ParseArguments - * (ignores -d32 and -d64, + * (removes -d32 and -d64 if any, * processes version options, * creates argument list for vm, * etc.) @@ -199,17 +206,13 @@ CreateExecutionEnvironment(int *_argcp, /* Compute/set the name of the executable */ SetExecname(*_argvp); - /* Set the LD_LIBRARY_PATH environment variable, check data model - flags, and exec process, if needed */ + /* Check data model flags, and exec process, if needed */ { char *arch = (char *)GetArch(); /* like sparc or sparcv9 */ char * jvmtype = NULL; int argc = *_argcp; char **argv = original_argv; - char *runpath = NULL; /* existing effective LD_LIBRARY_PATH - setting */ - int running = CURRENT_DATA_MODEL; int wanted = running; /* What data mode is being @@ -217,18 +220,8 @@ CreateExecutionEnvironment(int *_argcp, fine unless another model is asked for */ - char* new_runpath = NULL; /* desired new LD_LIBRARY_PATH string */ - char* newpath = NULL; /* path on new LD_LIBRARY_PATH */ - char* lastslash = NULL; - - char** newenvp = NULL; /* current environment */ - char** newargv = NULL; int newargc = 0; -#ifdef __solaris__ - char* dmpath = NULL; /* data model specific LD_LIBRARY_PATH, - Solaris only */ -#endif /* * Starting in 1.5, all unix platforms accept the -d32 and -d64 @@ -306,6 +299,11 @@ CreateExecutionEnvironment(int *_argcp, JLI_ReportErrorMessage(CFG_ERROR8, jvmtype, jvmpath); exit(4); } + /* + * we seem to have everything we need, so without further ado + * we return back. + */ + return; } else { /* do the same speculatively or exit */ #ifdef DUAL_MODE if (running != wanted) { @@ -335,190 +333,6 @@ CreateExecutionEnvironment(int *_argcp, #endif } - /* - * We will set the LD_LIBRARY_PATH as follows: - * - * o $JVMPATH (directory portion only) - * o $JRE/lib/$LIBARCHNAME - * o $JRE/../lib/$LIBARCHNAME - * - * followed by the user's previous effective LD_LIBRARY_PATH, if - * any. - */ - -#ifdef __solaris__ - /* - * Starting in Solaris 7, ld.so.1 supports three LD_LIBRARY_PATH - * variables: - * - * 1. LD_LIBRARY_PATH -- used for 32 and 64 bit searches if - * data-model specific variables are not set. - * - * 2. LD_LIBRARY_PATH_64 -- overrides and replaces LD_LIBRARY_PATH - * for 64-bit binaries. - * - * 3. LD_LIBRARY_PATH_32 -- overrides and replaces LD_LIBRARY_PATH - * for 32-bit binaries. - * - * The vm uses LD_LIBRARY_PATH to set the java.library.path system - * property. To shield the vm from the complication of multiple - * LD_LIBRARY_PATH variables, if the appropriate data model - * specific variable is set, we will act as if LD_LIBRARY_PATH had - * the value of the data model specific variant and the data model - * specific variant will be unset. Note that the variable for the - * *wanted* data model must be used (if it is set), not simply the - * current running data model. - */ - - switch(wanted) { - case 0: - if(running == 32) { - dmpath = getenv("LD_LIBRARY_PATH_32"); - wanted = 32; - } - else { - dmpath = getenv("LD_LIBRARY_PATH_64"); - wanted = 64; - } - break; - - case 32: - dmpath = getenv("LD_LIBRARY_PATH_32"); - break; - - case 64: - dmpath = getenv("LD_LIBRARY_PATH_64"); - break; - - default: - JLI_ReportErrorMessage(JRE_ERROR3, __LINE__); - exit(1); /* unknown value in wanted */ - break; - } - - /* - * If dmpath is NULL, the relevant data model specific variable is - * not set and normal LD_LIBRARY_PATH should be used. - */ - if( dmpath == NULL) { - runpath = getenv("LD_LIBRARY_PATH"); - } - else { - runpath = dmpath; - } -#else - /* - * If not on Solaris, assume only a single LD_LIBRARY_PATH - * variable. - */ - runpath = getenv("LD_LIBRARY_PATH"); -#endif /* __solaris__ */ - -#ifdef __linux - /* - * On linux, if a binary is running as sgid or suid, glibc sets - * LD_LIBRARY_PATH to the empty string for security purposes. (In - * contrast, on Solaris the LD_LIBRARY_PATH variable for a - * privileged binary does not lose its settings; but the dynamic - * linker does apply more scrutiny to the path.) The launcher uses - * the value of LD_LIBRARY_PATH to prevent an exec loop. - * Therefore, if we are running sgid or suid, this function's - * setting of LD_LIBRARY_PATH will be ineffective and we should - * return from the function now. Getting the right libraries to - * be found must be handled through other mechanisms. - */ - if((getgid() != getegid()) || (getuid() != geteuid()) ) { - return; - } -#endif - - /* runpath contains current effective LD_LIBRARY_PATH setting */ - - jvmpath = JLI_StringDup(jvmpath); - new_runpath = JLI_MemAlloc( ((runpath!=NULL)?JLI_StrLen(runpath):0) + - 2*JLI_StrLen(jrepath) + 2*JLI_StrLen(arch) + - JLI_StrLen(jvmpath) + 52); - newpath = new_runpath + JLI_StrLen("LD_LIBRARY_PATH="); - - - /* - * Create desired LD_LIBRARY_PATH value for target data model. - */ - { - /* remove the name of the .so from the JVM path */ - lastslash = JLI_StrRChr(jvmpath, '/'); - if (lastslash) - *lastslash = '\0'; - - - /* jvmpath, ((running != wanted)?((wanted==64)?"/"LIBARCH64NAME:"/.."):""), */ - - sprintf(new_runpath, "LD_LIBRARY_PATH=" - "%s:" - "%s/lib/%s:" - "%s/../lib/%s", - jvmpath, -#ifdef DUAL_MODE - jrepath, GetArchPath(wanted), - jrepath, GetArchPath(wanted) -#else - jrepath, arch, - jrepath, arch -#endif - ); - - - /* - * Check to make sure that the prefix of the current path is the - * desired environment variable setting. - */ - if (runpath != NULL && - JLI_StrNCmp(newpath, runpath, JLI_StrLen(newpath))==0 && - (runpath[JLI_StrLen(newpath)] == 0 || runpath[JLI_StrLen(newpath)] == ':') && - (running == wanted) /* data model does not have to be changed */ -#ifdef __solaris__ - && (dmpath == NULL) /* data model specific variables not set */ -#endif - ) { - - return; - - } - } - - /* - * Place the desired environment setting onto the prefix of - * LD_LIBRARY_PATH. Note that this prevents any possible infinite - * loop of execv() because we test for the prefix, above. - */ - if (runpath != 0) { - JLI_StrCat(new_runpath, ":"); - JLI_StrCat(new_runpath, runpath); - } - - if( putenv(new_runpath) != 0) { - exit(1); /* problem allocating memory; LD_LIBRARY_PATH not set - properly */ - } - - /* - * Unix systems document that they look at LD_LIBRARY_PATH only - * once at startup, so we have to re-exec the current executable - * to get the changed environment variable to have an effect. - */ - -#ifdef __solaris__ - /* - * If dmpath is not NULL, remove the data model specific string - * in the environment for the exec'ed child. - */ - - if( dmpath != NULL) - (void)UnsetEnv((wanted==32)?"LD_LIBRARY_PATH_32":"LD_LIBRARY_PATH_64"); -#endif - - newenvp = environ; - { char *newexec = execname; #ifdef DUAL_MODE @@ -549,17 +363,16 @@ CreateExecutionEnvironment(int *_argcp, argv[0] = newexec; } #endif - + JLI_TraceLauncher("TRACER_MARKER:About to EXEC\n"); (void)fflush(stdout); (void)fflush(stderr); - execve(newexec, argv, newenvp); + execv(newexec, argv); JLI_ReportErrorMessageSys(JRE_ERROR4, newexec); #ifdef DUAL_MODE if (running != wanted) { JLI_ReportErrorMessage(JRE_ERROR5, wanted, running); # ifdef __solaris__ - # ifdef __sparc JLI_ReportErrorMessage(JRE_ERROR6); # else @@ -570,13 +383,11 @@ CreateExecutionEnvironment(int *_argcp, #endif } - exit(1); } } - /* * On Solaris VM choosing is done by the launcher (java.c). */ @@ -1123,6 +934,7 @@ ExecJRE(char *jre, char **argv) printf(" %s", argv[i]); printf("\n"); } + JLI_TraceLauncher("TRACER_MARKER:About to EXEC\n"); (void)fflush(stdout); (void)fflush(stderr); execv(wanted, argv); diff --git a/test/Makefile b/test/Makefile index 602d8fc0a91f103e6744b04c1c5f1aeb1657a73a..25f0dc1ed6fcb3b32e218d4eda4a2fa2f462e4d3 100644 --- a/test/Makefile +++ b/test/Makefile @@ -282,11 +282,23 @@ STATS_TXT = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)")/$(STATS_TXT_NAME) RUNLIST = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)")/runlist.txt PASSLIST = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)")/passlist.txt FAILLIST = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)")/faillist.txt +EXITCODE = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)")/exitcode.txt + +TESTEXIT = \ + if [ ! -s $(EXITCODE) ] ; then \ + $(ECHO) "ERROR: EXITCODE file not filled in."; \ + $(ECHO) "1" > $(EXITCODE); \ + fi ; \ + testExitCode=`$(CAT) $(EXITCODE)`; \ + $(ECHO) "EXIT CODE: $${testExitCode}"; \ + exit ${testExitCode} + BUNDLE_UP_AND_EXIT = \ ( \ - exitCode=$$? && \ + jtregExitCode=$$? && \ _summary="$(SUMMARY_TXT)"; \ - $(RM) -f $(STATS_TXT) $(RUNLIST) $(PASSLIST) $(FAILLIST); \ + $(RM) -f $(STATS_TXT) $(RUNLIST) $(PASSLIST) $(FAILLIST) $(EXITCODE); \ + $(ECHO) "$${jtregExitCode}" > $(EXITCODE); \ if [ -r "$${_summary}" ] ; then \ $(ECHO) "Summary: $${_summary}" > $(STATS_TXT); \ $(EXPAND) $${_summary} | $(EGREP) -v ' Not run\.' > $(RUNLIST); \ @@ -297,10 +309,13 @@ BUNDLE_UP_AND_EXIT = \ $(EGREP) ' Error\.' $(RUNLIST); \ $(EGREP) -v ' Passed\.' $(RUNLIST) ) \ | $(SORT) | $(UNIQ) > $(FAILLIST); \ - if [ $${exitCode} != 0 -o -s $(FAILLIST) ] ; then \ + if [ $${jtregExitCode} != 0 -o -s $(FAILLIST) ] ; then \ $(EXPAND) $(FAILLIST) \ | $(CUT) -d' ' -f1 \ | $(SED) -e 's@^@FAILED: @' >> $(STATS_TXT); \ + if [ $${jtregExitCode} = 0 ] ; then \ + jtregExitCode=1; \ + fi; \ fi; \ runc="`$(CAT) $(RUNLIST) | $(WC) -l | $(AWK) '{print $$1;}'`"; \ passc="`$(CAT) $(PASSLIST) | $(WC) -l | $(AWK) '{print $$1;}'`"; \ @@ -312,8 +327,8 @@ BUNDLE_UP_AND_EXIT = \ $(ECHO) "Missing file: $${_summary}" >> $(STATS_TXT); \ fi; \ $(CAT) $(STATS_TXT); \ - $(ZIP_UP_RESULTS) && $(KILL_DISPLAY) && \ - exit $${exitCode} \ + $(ZIP_UP_RESULTS) && $(KILL_DISPLAY) ; \ + $(TESTEXIT) \ ) ################################################################ @@ -337,9 +352,11 @@ clean: # jtreg tests # Expect JT_HOME to be set for jtreg tests. (home for jtreg) -JT_HOME = $(SLASH_JAVA)/re/jtreg/4.0/promoted/latest/binaries/jtreg -ifdef JPRT_JTREG_HOME - JT_HOME = $(JPRT_JTREG_HOME) +ifndef JT_HOME + JT_HOME = $(SLASH_JAVA)/re/jtreg/4.0/promoted/latest/binaries/jtreg + ifdef JPRT_JTREG_HOME + JT_HOME = $(JPRT_JTREG_HOME) + endif endif # Expect JPRT to set TESTDIRS to the jtreg test dirs @@ -361,21 +378,22 @@ endif # Some tests annoy me and fail frequently PROBLEM_LIST=ProblemList.txt +PROBLEM_LISTS=$(PROBLEM_LIST) $(wildcard closed/$(PROBLEM_LIST)) EXCLUDELIST=$(ABS_TEST_OUTPUT_DIR)/excludelist.txt # Create exclude list for this platform and arch ifdef NO_EXCLUDES -$(EXCLUDELIST): $(PROBLEM_LIST) $(TESTDIRS) +$(EXCLUDELIST): $(PROBLEM_LISTS) $(TESTDIRS) @$(ECHO) "NOTHING_EXCLUDED" > $@ else -$(EXCLUDELIST): $(PROBLEM_LIST) $(TESTDIRS) +$(EXCLUDELIST): $(PROBLEM_LISTS) $(TESTDIRS) @$(RM) $@ $@.temp1 $@.temp2 - @( ( $(EGREP) -- '$(OS_NAME)-all' $< ) ;\ - ( $(EGREP) -- '$(OS_NAME)-$(OS_ARCH)' $< ) ;\ - ( $(EGREP) -- '$(OS_NAME)-$(OS_VERSION)' $< ) ;\ - ( $(EGREP) -- 'generic-$(OS_ARCH)' $< ) ;\ - ( $(EGREP) -- 'generic-all' $< ) ;\ - ( $(ECHO) "#") ;\ + @(($(CAT) $(PROBLEM_LISTS) | $(EGREP) -- '$(OS_NAME)-all' ) ;\ + ($(CAT) $(PROBLEM_LISTS) | $(EGREP) -- '$(OS_NAME)-$(OS_ARCH)' ) ;\ + ($(CAT) $(PROBLEM_LISTS) | $(EGREP) -- '$(OS_NAME)-$(OS_VERSION)') ;\ + ($(CAT) $(PROBLEM_LISTS) | $(EGREP) -- 'generic-$(OS_ARCH)' ) ;\ + ($(CAT) $(PROBLEM_LISTS) | $(EGREP) -- 'generic-all' ) ;\ + ($(ECHO) "#") ;\ ) | $(SED) -e 's@^[\ ]*@@' \ | $(EGREP) -v '^#' > $@.temp1 @for tdir in $(TESTDIRS) ; do \ @@ -386,14 +404,18 @@ $(EXCLUDELIST): $(PROBLEM_LIST) $(TESTDIRS) @$(ECHO) "Excluding list contains `$(EXPAND) $@ | $(WC) -l` items" endif +# Select list of directories that exist +define TestDirs +$(foreach i,$1,$(wildcard ${i})) $(foreach i,$1,$(wildcard closed/${i})) +endef # Running batches of tests with or without samevm define RunSamevmBatch -$(ECHO) "Running tests in samevm mode: $?" -$(MAKE) TESTDIRS="$?" USE_JTREG_SAMEVM=true UNIQUE_DIR=$@ jtreg_tests +$(ECHO) "Running tests in samevm mode: $(call TestDirs, $?)" +$(MAKE) TESTDIRS="$(call TestDirs, $?)" USE_JTREG_SAMEVM=true UNIQUE_DIR=$@ jtreg_tests endef define RunOthervmBatch -$(ECHO) "Running tests in othervm mode: $?" -$(MAKE) TESTDIRS="$?" USE_JTREG_SAMEVM=false UNIQUE_DIR=$@ jtreg_tests +$(ECHO) "Running tests in othervm mode: $(call TestDirs, $?)" +$(MAKE) TESTDIRS="$(call TestDirs, $?)" USE_JTREG_SAMEVM=false UNIQUE_DIR=$@ jtreg_tests endef define SummaryInfo $(ECHO) "Summary for: $?" @@ -428,6 +450,9 @@ JDK_ALL_TARGETS += jdk_beans3 jdk_beans3: java/beans/XMLEncoder $(call RunOthervmBatch) +jdk_beans: jdk_beans1 jdk_beans2 jdk_beans3 + @$(SummaryInfo) + # Stable samevm testruns (minus items from PROBLEM_LIST) JDK_ALL_TARGETS += jdk_io jdk_io: java/io @@ -450,6 +475,9 @@ JDK_ALL_TARGETS += jdk_management2 jdk_management2: com/sun/jmx com/sun/management sun/management $(call RunOthervmBatch) +jdk_management: jdk_management1 jdk_management2 + @$(SummaryInfo) + # Stable samevm testruns (minus items from PROBLEM_LIST) JDK_ALL_TARGETS += jdk_math jdk_math: java/math @@ -482,6 +510,9 @@ JDK_ALL_TARGETS += jdk_nio3 jdk_nio3: com/sun/nio sun/nio $(call RunOthervmBatch) +jdk_nio: jdk_nio1 jdk_nio2 jdk_nio3 + @$(SummaryInfo) + # Stable othervm testruns (minus items from PROBLEM_LIST) # Using samevm has serious problems with these tests JDK_ALL_TARGETS += jdk_rmi @@ -502,6 +533,9 @@ JDK_ALL_TARGETS += jdk_security3 jdk_security3: com/sun/security lib/security javax/security sun/security $(call RunOthervmBatch) +jdk_security: jdk_security1 jdk_security2 jdk_security3 + @$(SummaryInfo) + # Stable othervm testruns (minus items from PROBLEM_LIST) # Using samevm has problems, and doesn't help performance as much as others. JDK_ALL_TARGETS += jdk_swing @@ -517,11 +551,14 @@ jdk_text: java/text sun/text # Using samevm has serious problems with these tests JDK_ALL_TARGETS += jdk_tools1 jdk_tools1: com/sun/jdi - $(call RunOthervmBatch) + $(call RunSamevmBatch) JDK_ALL_TARGETS += jdk_tools2 jdk_tools2: com/sun/tools sun/jvmstat sun/tools tools vm com/sun/servicetag com/sun/tracing $(call RunOthervmBatch) +jdk_tools: jdk_tools1 jdk_tools2 + @$(SummaryInfo) + # Stable samevm testruns (minus items from PROBLEM_LIST) JDK_ALL_TARGETS += jdk_util jdk_util: java/util sun/util @@ -576,7 +613,7 @@ jtreg_tests: prep $(PRODUCT_HOME) $(JTREG) $(EXCLUDELIST) $(JTREG_TEST_OPTIONS) \ $(TESTDIRS) \ ) ; $(BUNDLE_UP_AND_EXIT) \ - ) 2>&1 | $(TEE) $(ABS_TEST_OUTPUT_DIR)/output.txt + ) 2>&1 | $(TEE) $(ABS_TEST_OUTPUT_DIR)/output.txt ; $(TESTEXIT) PHONY_LIST += jtreg_tests diff --git a/test/ProblemList.txt b/test/ProblemList.txt index 9a366c1ba8f526d6991bd70dc8b57a4d48da8a73..2edcfd4d59502614b29122531660724ce476ac91 100644 --- a/test/ProblemList.txt +++ b/test/ProblemList.txt @@ -344,6 +344,9 @@ java/io/StreamTokenizer/Comment.java generic-all # Some of these tests (like java/lang/management) may just need to be marked # othervm, but that is partially speculation. +# Samevm failure on OpenSolaris, security manager? +java/lang/ClassLoader/UninitializedParent.java generic-all + # Times out on solaris 10 sparc java/lang/ClassLoader/Assert.java generic-all @@ -538,6 +541,18 @@ javax/imageio/plugins/jpeg/ReadAsGrayTest.java generic-all # Missing close on file wbmp*, windows samevm javax/imageio/plugins/wbmp/CanDecodeTest.java generic-all +# Failures on OpenSolaris, cannot read input files? samevm issues? +javax/imageio/metadata/BooleanAttributes.java generic-all +javax/imageio/plugins/bmp/BMPSubsamplingTest.java generic-all +javax/imageio/plugins/bmp/TopDownTest.java generic-all +javax/imageio/plugins/gif/EncodeSubImageTest.java generic-all +javax/imageio/plugins/gif/GifTransparencyTest.java generic-all +javax/imageio/plugins/png/GrayPngTest.java generic-all +javax/imageio/plugins/png/ItxtUtf8Test.java generic-all +javax/imageio/plugins/png/MergeStdCommentTest.java generic-all +javax/imageio/plugins/png/ShortHistogramTest.java generic-all +javax/imageio/plugins/shared/BitDepth.java generic-all + # Exclude all javax/print tests, even if they passed, they may need samevm work # Times out on solaris-sparc, sparcv9, x64 -server, some on i586 -client @@ -1073,9 +1088,6 @@ java/text/Bidi/Bug6665028.java linux-x64 # So most if not all tools tests are now being run with "othervm" mode. # Some of these tools tests have a tendency to use fixed ports, bad idea. -# Solaris 10 client x86, java.lang.IndexOutOfBoundsException resumer Interrupted -com/sun/jdi/SimulResumerTest.java generic-all - # Output of jps differs from expected output. # Invalid argument count on solaris-sparc and x64 sun/tools/jstatd/jstatdPort.sh generic-all @@ -1087,12 +1099,17 @@ sun/tools/jps/jps-lm.sh generic-all sun/tools/jps/jps-Vvml_2.sh generic-all sun/tools/jps/jps-m_2.sh generic-all +# Fails on OpenSolaris "Could not synchronize with target" +sun/tools/jps/jps-Defaults.sh generic-all +sun/tools/jps/jps-V_2.sh generic-all +sun/tools/jps/jps-Vm_2.sh generic-all +sun/tools/jps/jps-Vvm.sh generic-all +sun/tools/jps/jps-Vvml.sh generic-all +sun/tools/jps/jps-m.sh generic-all + # Server name error, port 2098 problem? sun/tools/jstatd/jstatdServerName.sh generic-all -# Solaris, handshake failed, othervm mode -com/sun/jdi/RedefineException.sh generic-all - # These tests fail on solaris sparc, all the time com/sun/servicetag/DeleteServiceTag.java generic-all com/sun/servicetag/DuplicateNotFound.java generic-all @@ -1117,9 +1134,6 @@ sun/jvmstat/monitor/MonitoredVm/CR6672135.java generic-all # Unexpected Monitor Exception, solaris sparc -client sun/jvmstat/monitor/MonitoredVm/MonitorVmStartTerminate.sh generic-all -# Probably should be samevm, but seem to cause errors even in othervm at times -sun/tools/jhat/HatHeapDump1Test.java generic-all - # Problems on windows, jmap.exe hangs? (these run jmap) sun/tools/jmap/Basic.sh windows-all @@ -1129,9 +1143,6 @@ sun/tools/jstatd/jstatdDefaults.sh solaris-all # Solaris sparcv9, jps output does not match, x64 different sun/tools/jstatd/jstatdExternalRegistry.sh solaris-all -# Probably should be samevm, but seem to cause errors even in othervm at times -sun/tools/native2ascii/NativeErrors.java generic-all - # Solaris 10 sparc 32bit -client, java.lang.AssertionError: Some tests failed tools/jar/JarEntryTime.java generic-all diff --git a/test/com/sun/jdi/BadHandshakeTest.java b/test/com/sun/jdi/BadHandshakeTest.java index d5ecd0a73b84d7a07c7f94912c6b13c421309043..e03aeb1001c93bed58b16a3f0adab95d62970c1c 100644 --- a/test/com/sun/jdi/BadHandshakeTest.java +++ b/test/com/sun/jdi/BadHandshakeTest.java @@ -110,8 +110,11 @@ public class BadHandshakeTest { String exe = System.getProperty("java.home") + File.separator + "bin" + File.separator; String arch = System.getProperty("os.arch"); - if (arch.equals("sparcv9")) { + String osname = System.getProperty("os.name"); + if (osname.equals("SunOS") && arch.equals("sparcv9")) { exe += "sparcv9/java"; + } else if (osname.equals("SunOS") && arch.equals("amd64")) { + exe += "amd64/java"; } else { exe += "java"; } diff --git a/test/com/sun/jdi/DoubleAgentTest.java b/test/com/sun/jdi/DoubleAgentTest.java index 77c72cb08fddd26990e781a9d5e1989586d0fb77..bb06b89b9e2ea408802f2b1330e53f1a57957077 100644 --- a/test/com/sun/jdi/DoubleAgentTest.java +++ b/test/com/sun/jdi/DoubleAgentTest.java @@ -92,8 +92,11 @@ public class DoubleAgentTest { String exe = System.getProperty("java.home") + File.separator + "bin" + File.separator; String arch = System.getProperty("os.arch"); - if (arch.equals("sparcv9")) { + String osname = System.getProperty("os.name"); + if (osname.equals("SunOS") && arch.equals("sparcv9")) { exe += "sparcv9/java"; + } else if (osname.equals("SunOS") && arch.equals("amd64")) { + exe += "amd64/java"; } else { exe += "java"; } diff --git a/test/com/sun/jdi/ExclusiveBind.java b/test/com/sun/jdi/ExclusiveBind.java index ca2ba0229ec0d7019f6476f6f8ec612a7fa1924a..c3690e62e402231188f50539ca1bb3f4a3d1eeb8 100644 --- a/test/com/sun/jdi/ExclusiveBind.java +++ b/test/com/sun/jdi/ExclusiveBind.java @@ -99,8 +99,11 @@ public class ExclusiveBind { String exe = System.getProperty("java.home") + File.separator + "bin" + File.separator; String arch = System.getProperty("os.arch"); - if (arch.equals("sparcv9")) { + String osname = System.getProperty("os.name"); + if (osname.equals("SunOS") && arch.equals("sparcv9")) { exe += "sparcv9/java"; + } else if (osname.equals("SunOS") && arch.equals("amd64")) { + exe += "amd64/java"; } else { exe += "java"; } diff --git a/test/com/sun/jdi/JITDebug.sh b/test/com/sun/jdi/JITDebug.sh index 33aaa471fd33342b86a0843dc4474dae2ce4ad38..637c6deabd304986ffe0131e1c585ebbef1b13e3 100644 --- a/test/com/sun/jdi/JITDebug.sh +++ b/test/com/sun/jdi/JITDebug.sh @@ -103,10 +103,10 @@ if [ -z "${TESTJAVA}" ] ; then #if running standalone (no test harness of any kind), compile the #support files and the test case ${TESTJAVA}/bin/javac -d ${TESTCLASSES} \ - -classpath "$TESTJAVA/lib/tools.jar${PATHSEP}." \ + -classpath "$TESTJAVA/lib/tools.jar${PATHSEP}${TESTSRC}" \ TestScaffold.java VMConnection.java TargetListener.java TargetAdapter.java ${TESTJAVA}/bin/javac -d ${TESTCLASSES} \ - -classpath "$TESTJAVA/lib/tools.jar${PATHSEP}." -g \ + -classpath "$TESTJAVA/lib/tools.jar${PATHSEP}${TESTSRC}" -g \ JITDebug.java fi echo "JDK under test is: $TESTJAVA" diff --git a/test/com/sun/jdi/RepStep.java b/test/com/sun/jdi/RepStep.java index da058b2a3e11e92d776b0269f498d91021af208d..840ebb38427f7899116bd7c551cc037a60f2f4d6 100644 --- a/test/com/sun/jdi/RepStep.java +++ b/test/com/sun/jdi/RepStep.java @@ -29,7 +29,7 @@ * @run compile -g RepStepTarg.java * @run build VMConnection RepStep * - * @run main RepStep + * @run main/othervm RepStep * * @summary RepStep detects missed step events due to lack of * frame pop events (in back-end). diff --git a/test/com/sun/jdi/RunToExit.java b/test/com/sun/jdi/RunToExit.java index 947bcb26f976602aff825bdd68956ecedbf80ca2..c5f11f724a2f380af27d32d776c9609b833500fd 100644 --- a/test/com/sun/jdi/RunToExit.java +++ b/test/com/sun/jdi/RunToExit.java @@ -26,7 +26,7 @@ * @summary Test that with server=y, when VM runs to System.exit() no error happens * * @build VMConnection RunToExit Exit0 - * @run main RunToExit + * @run main/othervm RunToExit */ import java.io.InputStream; import java.io.IOException; @@ -115,8 +115,11 @@ public class RunToExit { String exe = System.getProperty("java.home") + File.separator + "bin" + File.separator; String arch = System.getProperty("os.arch"); - if (arch.equals("sparcv9")) { + String osname = System.getProperty("os.name"); + if (osname.equals("SunOS") && arch.equals("sparcv9")) { exe += "sparcv9/java"; + } else if (osname.equals("SunOS") && arch.equals("amd64")) { + exe += "amd64/java"; } else { exe += "java"; } diff --git a/test/com/sun/jdi/ShellScaffold.sh b/test/com/sun/jdi/ShellScaffold.sh index 855ba8ba0924c54df6e57c765a238ed14d856a2f..6d35af52dd87dcf083f73e941a2aa25d433123c9 100644 --- a/test/com/sun/jdi/ShellScaffold.sh +++ b/test/com/sun/jdi/ShellScaffold.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright 2002-2005 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 @@ -194,7 +194,7 @@ findPid() # Return 0 if $1 is the pid of a running process. if [ -z "$isWin98" ] ; then if [ "$osname" = SunOS ] ; then - #Solaris and OpenSolaris use pgrep and not ps in psCmd + # Solaris and OpenSolaris use pgrep and not ps in psCmd findPidCmd="$psCmd" else # Never use plain 'ps', which requires a "controlling terminal" @@ -298,15 +298,15 @@ EOF # On linux, core files take a long time, and can leave # zombie processes if [ "$osname" = SunOS ] ; then - #Experiments show Solaris '/usr/ucb/ps -axwww' and - #'/usr/bin/pgrep -f -l' provide the same small amount of the - #argv string (PRARGSZ=80 in /usr/include/sys/procfs.h) - # 1) This seems to have been working OK in ShellScaffold. - # 2) OpenSolaris does not provide /usr/ucb/ps, so use pgrep - # instead - #The alternative would be to use /usr/bin/pargs [pid] to get - #all the args for a process, splice them back into one - #long string, then grep. + # Experiments show Solaris '/usr/ucb/ps -axwww' and + # '/usr/bin/pgrep -f -l' provide the same small amount of the + # argv string (PRARGSZ=80 in /usr/include/sys/procfs.h) + # 1) This seems to have been working OK in ShellScaffold. + # 2) OpenSolaris does not provide /usr/ucb/ps, so use pgrep + # instead + # The alternative would be to use /usr/bin/pargs [pid] to get + # all the args for a process, splice them back into one + # long string, then grep. UU=`/usr/xpg4/bin/id -u -n` psCmd="pgrep -f -l -U $UU" else @@ -519,7 +519,7 @@ cmd() # if jdb got a cont cmd that caused the debuggee # to run to completion, jdb can be gone before # we get here. - echo quit >& 2 + echo "--Sending cmd: quit" >& 2 echo quit # See 6562090. Maybe there is a way that the exit # can cause jdb to not get the quit. @@ -531,7 +531,7 @@ cmd() # because after starting jdb, we waited # for the prompt. fileSize=`wc -c $jdbOutFile | awk '{ print $1 }'` - echo $* >&2 + echo "--Sending cmd: " $* >&2 # jjh: We have a few intermittent failures here. # It is as if every so often, jdb doesn't @@ -558,12 +558,85 @@ cmd() # seen the ]. echo $* - # wait for jdb output to appear + # Now we have to wait for the next jdb prompt. We wait for a pattern + # to appear in the last line of jdb output. Normally, the prompt is + # + # 1) ^main[89] @ + # + # where ^ means start of line, and @ means end of file with no end of line + # and 89 is the current command counter. But we have complications e.g., + # the following jdb output can appear: + # + # 2) a[89] = 10 + # + # The above form is an array assignment and not a prompt. + # + # 3) ^main[89] main[89] ... + # + # This occurs if the next cmd is one that causes no jdb output, e.g., + # 'trace methods'. + # + # 4) ^main[89] [main[89]] .... > @ + # + # jdb prints a > as a prompt after something like a cont. + # Thus, even though the above is the last 'line' in the file, it + # isn't the next prompt we are waiting for after the cont completes. + # HOWEVER, sometimes we see this for a cont command: + # + # ^main[89] $ + # + # + # 5) ^main[89] > @ + # + # i.e., the > prompt comes out AFTER the prompt we we need to wait for. + # + # So, how do we know when the next prompt has appeared?? + # 1. Search for + # main[89] $ + # This will handle cases 1, 2, 3 + # 2. This leaves cases 4 and 5. + # + # What if we wait for 4 more chars to appear and then search for + # + # main[89] [>]$ + # + # on the last line? + # + # a. if we are currently at + # + # ^main[89] main[89] @ + # + # and a 'trace methods comes in, we will wait until at least + # + # ^main[89] main[89] main@ + # + # and then the search will find the new prompt when it completes. + # + # b. if we are currently at + # + # ^main[89] main[89] @ + # + # and the first form of cont comes in, then we will see + # + # ^main[89] main[89] > $ + # ^x@ + # + # where x is the first char of the msg output when the bkpt is hit + # and we will start our search, which will find the prompt + # when it comes out after the bkpt output, with or without the + # trailing > + # + + # wait for 4 new chars to appear in the jdb output count=0 + desiredFileSize=`expr $fileSize + 4` msg1=`echo At start: cmd/size/waiting : $* / $fileSize / \`date\`` while [ 1 = 1 ] ; do newFileSize=`wc -c $jdbOutFile | awk '{ print $1 } '` - if [ "$fileSize" != "$newFileSize" ] ; then + #echo jj: desired = $desiredFileSize, new = $newFileSize >& 2 + + done=`expr $newFileSize \>= $desiredFileSize` + if [ $done = 1 ] ; then break fi sleep ${sleep_seconds} @@ -573,14 +646,19 @@ cmd() echo "--DEBUG: jdb $$ didn't responded to command in $count secs: $*" >& 2 echo "--DEBUG:" $msg1 >& 2 echo "--DEBUG: "done size/waiting : / $newFileSize / `date` >& 2 - $psCmd | sed -e '/com.sun.javatest/d' -e '/nsk/d' >& 2 + echo "-- $jdbOutFile follows-------------------------------" >& 2 + cat $jdbOutFile >& 2 + echo "------------------------------------------" >& 2 + dojstack + #$psCmd | sed -e '/com.sun.javatest/d' -e '/nsk/d' >& 2 if [ $count = 60 ] ; then dofail "jdb never responded to command: $*" fi fi done - - waitForJdbMsg '^.*\[[0-9]*\] $' 1 allowExit + # Note that this assumes just these chars in thread names. + waitForJdbMsg '[a-zA-Z0-9_-][a-zA-Z0-9_-]*\[[1-9][0-9]*\] [ >]*$' \ + 1 allowExit } setBkpts() @@ -596,15 +674,19 @@ setBkpts() runToBkpt() { cmd run + # Don't need to do this - the above waits for the next prompt which comes out + # AFTER the Breakpoint hit message. # Wait for jdb to hit the bkpt - waitForJdbMsg "Breakpoint hit" 5 + #waitForJdbMsg "Breakpoint hit" 5 } contToBkpt() { cmd cont + # Don't need to do this - the above waits for the next prompt which comes out + # AFTER the Breakpoint hit message. # Wait for jdb to hit the bkpt - waitForJdbMsg "Breakpoint hit" 5 + #waitForJdbMsg "Breakpoint hit" 5 } @@ -618,7 +700,7 @@ waitForJdbMsg() nlines=$2 allowExit="$3" myCount=0 - timeLimit=40 # wait a max of 40 secs for a response from a jdb command + timeLimit=40 # wait a max of this many secs for a response from a jdb command while [ 1 = 1 ] ; do if [ -r $jdbOutFile ] ; then # Something here causes jdb to complain about Unrecognized cmd on x86. @@ -654,8 +736,11 @@ waitForJdbMsg() myCount=`expr $myCount + ${sleep_seconds}` if [ $myCount -gt $timeLimit ] ; then + echo "--Fail: waitForJdbMsg timed out after $timeLimit seconds, looking for /$1/, in $nlines lines; exitting" >> $failFile + echo "vv jdbOutFile vvvvvvvvvvvvvvvvvvvvvvvvvvvv" >& 2 + cat $jdbOutFile >& 2 + echo "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" >& 2 dojstack - echo "--Fail: waitForJdbMsg timed out after $timeLimit seconds; exitting" >> $failFile exit 1 fi done @@ -865,35 +950,29 @@ grepForString() # get inserted into the string we are searching for # so ignore those chars. if [ -z "$3" ] ; then - case "$2" in - *\>*) - # Target string contains a > so we better - # not ignore it - $grep -s "$2" $1 > $devnull 2>&1 - stat=$? - ;; - *) - # Target string does not contain a >. - # Ignore > and '> ' in the file. - cat $1 | sed -e 's@> @@g' -e 's@>@@g' | $grep -s "$2" > $devnull 2>&1 - stat=$? - esac + theCmd=cat else - case "$2" in - *\>*) - # Target string contains a > so we better - # not ignore it - tail -$3 $1 | $grep -s "$2" > $devnull 2>&1 - stat=$? - ;; - *) - # Target string does not contain a >. - # Ignore > and '> ' in the file. - tail -$3 $1 | sed -e 's@> @@g' -e 's@>@@g' | $grep -s "$2" > $devnull 2>&1 - stat=$? - ;; - esac + theCmd="tail -$3" + fi + case "$2" in + *\>*) + # Target string contains a > so we better + # not ignore it + $theCmd $1 | $grep -s "$2" > $devnull 2>&1 + return $? + ;; + esac + # Target string does not contain a >. + # Ignore > and '> ' in the file. + # NOTE: if $1 does not end with a new line, piping it to sed doesn't include the + # chars on the last line. Detect this case, and add a new line. + cp $1 $1.tmp + if [ `tail -1 $1.tmp | wc -l | sed -e 's@ @@g'` = 0 ] ; then + echo >> $1.tmp fi + $theCmd $1.tmp | sed -e 's@> @@g' -e 's@>@@g' | $grep -s "$2" > $devnull 2>&1 + stat=$? + rm -f $1.tmp return $stat } diff --git a/test/com/sun/jdi/SimulResumerTest.java b/test/com/sun/jdi/SimulResumerTest.java index cf7568e8be0912f7089f3a9252adf5f400460045..c0f54f806d8987f6f03f73e2a4c0210f53f27e82 100644 --- a/test/com/sun/jdi/SimulResumerTest.java +++ b/test/com/sun/jdi/SimulResumerTest.java @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g SimulResumerTest.java - * @run main SimulResumerTest + * @run main/othervm SimulResumerTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff --git a/test/com/sun/jdi/Solaris32AndSolaris64Test.sh b/test/com/sun/jdi/Solaris32AndSolaris64Test.sh index c1b4491a706f33f824641a824161cd08da91f818..c70dd465c3aed3b83d436cee6b3452d094ff6019 100644 --- a/test/com/sun/jdi/Solaris32AndSolaris64Test.sh +++ b/test/com/sun/jdi/Solaris32AndSolaris64Test.sh @@ -164,10 +164,10 @@ fi if [ -n "${STANDALONE}" ] ; then #if running standalone, compile the support files ${TESTJAVA}/bin/javac -d ${TESTCLASSES} \ - -classpath "$TESTJAVA/lib/tools.jar${PATHSEP}." \ + -classpath "$TESTJAVA/lib/tools.jar${PATHSEP}${TESTSRC}" \ TestScaffold.java VMConnection.java TargetListener.java TargetAdapter.java ${TESTJAVA}/bin/javac -d ${TESTCLASSES} \ - -classpath "$TESTJAVA/lib/tools.jar${PATHSEP}." -g \ + -classpath "$TESTJAVA/lib/tools.jar${PATHSEP}${TESTSRC}" -g \ FetchLocals.java DataModelTest.java fi diff --git a/test/com/sun/jdi/VMConnection.java b/test/com/sun/jdi/VMConnection.java index 5d5f9e13bb679b7f94e47c2fa816c5d30af091f0..bc07e034691a3818209f6c041db0b1b8186be1a4 100644 --- a/test/com/sun/jdi/VMConnection.java +++ b/test/com/sun/jdi/VMConnection.java @@ -57,6 +57,7 @@ class VMConnection { if (testClasses == null) { return retVal; } + retVal += "-classpath " + testClasses + " "; File myFile = new File(testClasses, "@debuggeeVMOptions"); if (!myFile.canRead()) { @@ -97,7 +98,7 @@ class VMConnection { if (line.length() != 0 && !line.startsWith("#")) { System.out.println("-- Added debuggeeVM options from file " + wholePath + ": " + line); - retVal = line; + retVal += line; break; } // Else, read he next line. diff --git a/test/com/sun/jdi/connect/spi/DebugUsingCustomConnector.java b/test/com/sun/jdi/connect/spi/DebugUsingCustomConnector.java index d8c939e58c44c1f97b5ea6e768777f45e2bed475..3073093f7405b537d2f3371c9bfbe67b29ab43c3 100644 --- a/test/com/sun/jdi/connect/spi/DebugUsingCustomConnector.java +++ b/test/com/sun/jdi/connect/spi/DebugUsingCustomConnector.java @@ -28,7 +28,7 @@ * This tests launches a debuggee using a custom LaunchingConnector. * * @build DebugUsingCustomConnector SimpleLaunchingConnector Foo NullTransportService - * @run main DebugUsingCustomConnector + * @run main/othervm DebugUsingCustomConnector */ import com.sun.jdi.*; import com.sun.jdi.connect.*; diff --git a/test/com/sun/jdi/connect/spi/GeneratedConnectors.java b/test/com/sun/jdi/connect/spi/GeneratedConnectors.java index d4926396ebed05a34bf2122e4dc2e27b92aa6a2b..e9dba8332ff259e58ed07c72aad7aca83a37fbdd 100644 --- a/test/com/sun/jdi/connect/spi/GeneratedConnectors.java +++ b/test/com/sun/jdi/connect/spi/GeneratedConnectors.java @@ -31,7 +31,7 @@ * created and that they have an "address" argument. * * @build GeneratedConnectors NullTransportService - * @run main GeneratedConnectors + * @run main/othervm GeneratedConnectors */ import com.sun.jdi.*; diff --git a/test/com/sun/jdi/connect/spi/SimpleLaunchingConnector.java b/test/com/sun/jdi/connect/spi/SimpleLaunchingConnector.java index 86154d5091df90d7ce53ecf0b92d56716010cb2c..82bc3b07b9696cbc7a25f4f6b37ee65b608d9e57 100644 --- a/test/com/sun/jdi/connect/spi/SimpleLaunchingConnector.java +++ b/test/com/sun/jdi/connect/spi/SimpleLaunchingConnector.java @@ -145,13 +145,18 @@ public class SimpleLaunchingConnector implements LaunchingConnector { String exe = System.getProperty("java.home") + File.separator + "bin" + File.separator; String arch = System.getProperty("os.arch"); - if (arch.equals("sparcv9")) { + String osname = System.getProperty("os.name"); + if (osname.equals("SunOS") && arch.equals("sparcv9")) { exe += "sparcv9/java"; + } else if (osname.equals("SunOS") && arch.equals("amd64")) { + exe += "amd64/java"; } else { exe += "java"; } String cmd = exe + " -Xdebug -Xrunjdwp:transport=dt_socket,timeout=15000,address=" + - key.address() + "" + className; + key.address() + + " -classpath " + System.getProperty("test.classes") + + " " + className; Process process = Runtime.getRuntime().exec(cmd); Connection conn = ts.accept(key, 30*1000, 9*1000); ts.stopListening(key); diff --git a/test/com/sun/jdi/redefine/RedefineTest.java b/test/com/sun/jdi/redefine/RedefineTest.java index e5980d59fd658bd52f1a8cc186bf569fada954a7..809e9db1b84980e971e7c83b449393a99e4c3434 100644 --- a/test/com/sun/jdi/redefine/RedefineTest.java +++ b/test/com/sun/jdi/redefine/RedefineTest.java @@ -34,7 +34,7 @@ * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g RedefineTest.java * @run shell RedefineSetUp.sh - * @run main RedefineTest + * @run main/othervm RedefineTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff --git a/test/com/sun/tracing/BasicWithSecurityMgr.java b/test/com/sun/tracing/BasicWithSecurityMgr.java new file mode 100644 index 0000000000000000000000000000000000000000..547eb09445b52d168ce9464bc52ed0989ce8dc59 --- /dev/null +++ b/test/com/sun/tracing/BasicWithSecurityMgr.java @@ -0,0 +1,149 @@ +/* + * Copyright 2008 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 6899605 + * @summary Basic unit test for tracing framework with security manager + * enabled + */ + +import com.sun.tracing.*; +import java.lang.reflect.Method; + +@ProviderName("NamedProvider") +interface BasicProvider extends Provider { + void plainProbe(); + void probeWithArgs(int a, float f, String s, Long l); + @ProbeName("namedProbe") void probeWithName(); + void overloadedProbe(); + void overloadedProbe(int i); +} + +interface InvalidProvider extends Provider { + int nonVoidProbe(); +} + +public class BasicWithSecurityMgr { + + public static ProviderFactory factory; + public static BasicProvider bp; + + public static void main(String[] args) throws Exception { + // enable security manager + System.setSecurityManager(new SecurityManager()); + + factory = ProviderFactory.getDefaultFactory(); + if (factory != null) { + bp = factory.createProvider(BasicProvider.class); + } + + testProviderFactory(); + testProbe(); + testProvider(); + } + + static void fail(String s) throws Exception { + throw new Exception(s); + } + + static void testProviderFactory() throws Exception { + if (factory == null) { + fail("ProviderFactory.getDefaultFactory: Did not create factory"); + } + if (bp == null) { + fail("ProviderFactory.createProvider: Did not create provider"); + } + try { + factory.createProvider(null); + fail("ProviderFactory.createProvider: Did not throw NPE for null"); + } catch (NullPointerException e) {} + + try { + factory.createProvider(InvalidProvider.class); + fail("Factory.createProvider: Should error with non-void probes"); + } catch (IllegalArgumentException e) {} + } + + public static void testProvider() throws Exception { + + // These just shouldn't throw any exeptions: + bp.plainProbe(); + bp.probeWithArgs(42, (float)3.14, "spam", new Long(2L)); + bp.probeWithArgs(42, (float)3.14, null, null); + bp.probeWithName(); + bp.overloadedProbe(); + bp.overloadedProbe(42); + + Method m = BasicProvider.class.getMethod("plainProbe"); + Probe p = bp.getProbe(m); + if (p == null) { + fail("Provider.getProbe: Did not return probe"); + } + + Method m2 = BasicWithSecurityMgr.class.getMethod("testProvider"); + p = bp.getProbe(m2); + if (p != null) { + fail("Provider.getProbe: Got probe with invalid spec"); + } + + bp.dispose(); + // These just shouldn't throw any exeptions: + bp.plainProbe(); + bp.probeWithArgs(42, (float)3.14, "spam", new Long(2L)); + bp.probeWithArgs(42, (float)3.14, null, null); + bp.probeWithName(); + bp.overloadedProbe(); + bp.overloadedProbe(42); + + if (bp.getProbe(m) != null) { + fail("Provider.getProbe: Should return null after dispose()"); + } + + bp.dispose(); // just to make sure nothing bad happens + } + + static void testProbe() throws Exception { + Method m = BasicProvider.class.getMethod("plainProbe"); + Probe p = bp.getProbe(m); + p.isEnabled(); // just make sure it doesn't do anything bad + p.trigger(); + + try { + p.trigger(0); + fail("Probe.trigger: too many arguments not caught"); + } catch (IllegalArgumentException e) {} + + p = bp.getProbe(BasicProvider.class.getMethod( + "probeWithArgs", int.class, float.class, String.class, Long.class)); + try { + p.trigger(); + fail("Probe.trigger: too few arguments not caught"); + } catch (IllegalArgumentException e) {} + + try { + p.trigger((float)3.14, (float)3.14, "", new Long(0L)); + fail("Probe.trigger: wrong type primitive arguments not caught"); + } catch (IllegalArgumentException e) {} + } +} diff --git a/test/demo/jvmti/hprof/CpuOldTest.java b/test/demo/jvmti/hprof/CpuOldTest.java index 378083a2561ec70939619b21b8ba4c4ad9beedae..252aa05be1688b7d07fe59d2a52e3d9713634692 100644 --- a/test/demo/jvmti/hprof/CpuOldTest.java +++ b/test/demo/jvmti/hprof/CpuOldTest.java @@ -26,7 +26,7 @@ * @bug 5012882 6299047 * @summary Test jvmti hprof * - * @compile -source 1.5 -g HelloWorld.java ../DemoRun.java + * @compile -g HelloWorld.java ../DemoRun.java * @build CpuOldTest * @run main CpuOldTest HelloWorld */ diff --git a/test/demo/jvmti/hprof/CpuSamplesTest.java b/test/demo/jvmti/hprof/CpuSamplesTest.java index 0c5317184ec42b2b9ac1f3716da0f25e8e9d1b09..d06d4cff3321d44dedfd80e0f80ce8caab8e08b5 100644 --- a/test/demo/jvmti/hprof/CpuSamplesTest.java +++ b/test/demo/jvmti/hprof/CpuSamplesTest.java @@ -26,7 +26,7 @@ * @bug 5012882 * @summary Test jvmti hprof * - * @compile -source 1.5 -g:lines HelloWorld.java ../DemoRun.java + * @compile -g:lines HelloWorld.java ../DemoRun.java * @build CpuSamplesTest * @run main CpuSamplesTest HelloWorld */ diff --git a/test/demo/jvmti/hprof/CpuTimesDefineClassTest.java b/test/demo/jvmti/hprof/CpuTimesDefineClassTest.java index 5a1b7d08b37c195cf6ec2a4b7945646acfc21e7c..63cfcb3e5c45c0eae865941ecef7a4e3cffeffdc 100644 --- a/test/demo/jvmti/hprof/CpuTimesDefineClassTest.java +++ b/test/demo/jvmti/hprof/CpuTimesDefineClassTest.java @@ -26,7 +26,7 @@ * @bug 5097131 6299047 * @summary Test jvmti hprof * - * @compile -source 1.5 -g HelloWorld.java DefineClass.java ../DemoRun.java + * @compile -g HelloWorld.java DefineClass.java ../DemoRun.java * @build CpuTimesDefineClassTest * @run main CpuTimesDefineClassTest DefineClass * diff --git a/test/demo/jvmti/hprof/CpuTimesTest.java b/test/demo/jvmti/hprof/CpuTimesTest.java index 7a9d10e8159e1c246a01ac043d96ae0111ef878f..a99d384494b7ed9ec24a75ed6bc50fbf14d9e9be 100644 --- a/test/demo/jvmti/hprof/CpuTimesTest.java +++ b/test/demo/jvmti/hprof/CpuTimesTest.java @@ -26,7 +26,7 @@ * @bug 5012882 6299047 * @summary Test jvmti hprof * - * @compile -source 1.5 -g HelloWorld.java ../DemoRun.java + * @compile -g HelloWorld.java ../DemoRun.java * @build CpuTimesTest * @run main CpuTimesTest HelloWorld */ diff --git a/test/demo/jvmti/hprof/HeapAllTest.java b/test/demo/jvmti/hprof/HeapAllTest.java index ce4431f5032da4cc72ddbf0157d8f874a1b09f8d..8de8714a02cea3db94fdafb127b579a2f9d64ca9 100644 --- a/test/demo/jvmti/hprof/HeapAllTest.java +++ b/test/demo/jvmti/hprof/HeapAllTest.java @@ -26,7 +26,7 @@ * @bug 5012882 6299047 * @summary Test jvmti hprof * - * @compile -source 1.5 -g HelloWorld.java ../DemoRun.java + * @compile -g HelloWorld.java ../DemoRun.java * @build HeapAllTest * @run main HeapAllTest HelloWorld */ diff --git a/test/demo/jvmti/hprof/HeapBinaryFormatTest.java b/test/demo/jvmti/hprof/HeapBinaryFormatTest.java index 5f4f7b92b33c35cc4be13fa7105790a11c2f43e6..1d3366cfd9f4e30dd8a974bfab9a2fce030c4abe 100644 --- a/test/demo/jvmti/hprof/HeapBinaryFormatTest.java +++ b/test/demo/jvmti/hprof/HeapBinaryFormatTest.java @@ -26,7 +26,7 @@ * @bug 4965057 6313381 * @summary Test jvmti hprof format=b * - * @compile -source 1.5 -g:source HelloWorld.java ../DemoRun.java + * @compile -g:source HelloWorld.java ../DemoRun.java * @build HeapBinaryFormatTest * @run main HeapBinaryFormatTest HelloWorld */ diff --git a/test/demo/jvmti/hprof/HeapDumpTest.java b/test/demo/jvmti/hprof/HeapDumpTest.java index 1faca7ee6a949df6c8846f49f256b193a4e826a0..01cce6083130437c7b02910f1cd7663d80c157a0 100644 --- a/test/demo/jvmti/hprof/HeapDumpTest.java +++ b/test/demo/jvmti/hprof/HeapDumpTest.java @@ -26,7 +26,7 @@ * @bug 5012882 6299047 * @summary Test jvmti hprof * - * @compile -source 1.5 -g:source HelloWorld.java ../DemoRun.java + * @compile -g:source HelloWorld.java ../DemoRun.java * @build HeapDumpTest * @run main HeapDumpTest HelloWorld */ diff --git a/test/demo/jvmti/hprof/HeapSitesTest.java b/test/demo/jvmti/hprof/HeapSitesTest.java index 31a3d7ef02dfd751a73972e01c9acaa041d60bb0..c0205e237769e954cc89878ef7b54402242fe05f 100644 --- a/test/demo/jvmti/hprof/HeapSitesTest.java +++ b/test/demo/jvmti/hprof/HeapSitesTest.java @@ -26,7 +26,7 @@ * @bug 5012882 6299047 * @summary Test jvmti hprof * - * @compile -source 1.5 -g:vars HelloWorld.java ../DemoRun.java + * @compile -g:vars HelloWorld.java ../DemoRun.java * @build HeapSitesTest * @run main HeapSitesTest HelloWorld */ diff --git a/test/demo/jvmti/hprof/OptionsTest.java b/test/demo/jvmti/hprof/OptionsTest.java index eae8276fcf5ef6efbf84fb37a1d155e3ac616ff5..e1cac9ccd56113607f9e01b1d8f2b007e002b979 100644 --- a/test/demo/jvmti/hprof/OptionsTest.java +++ b/test/demo/jvmti/hprof/OptionsTest.java @@ -26,7 +26,7 @@ * @bug 5083441 6299047 * @summary Test jvmti hprof * - * @compile -source 1.5 -g:lines HelloWorld.java ../DemoRun.java + * @compile -g:lines HelloWorld.java ../DemoRun.java * @build OptionsTest * @run main OptionsTest HelloWorld */ diff --git a/test/java/io/Serializable/enum/array/Test.java b/test/java/io/Serializable/enum/array/Test.java index 705de3a44df068575e45ceeb4f0e74bd3108c871..95d9cac890d7a25158ad43958aa4c727f71b7ba0 100644 --- a/test/java/io/Serializable/enum/array/Test.java +++ b/test/java/io/Serializable/enum/array/Test.java @@ -25,9 +25,6 @@ * @bug 4838379 * @summary Verify that serialization of enum constant arrays functions * properly. - * - * @compile -source 1.5 Test.java - * @run main Test */ import java.io.*; diff --git a/test/java/io/Serializable/enum/badResolve/Write.java b/test/java/io/Serializable/enum/badResolve/Write.java index 24e0242d5fa4080fe4ef34a8b6ebd98662b36ab9..dcdd5fa5aa64752d20c2d1e7e9746879d1b9a59a 100644 --- a/test/java/io/Serializable/enum/badResolve/Write.java +++ b/test/java/io/Serializable/enum/badResolve/Write.java @@ -26,10 +26,10 @@ * @summary Verify that enum classes present in a serialization stream cannot * be resolved by the receiver to non-enum classes, and vice-versa. * - * @compile -source 1.5 Write.java + * @compile Write.java * @run main Write * @clean Write - * @compile -source 1.5 Read.java + * @compile Read.java * @run main Read * @clean Read */ diff --git a/test/java/io/Serializable/enum/basic/Test.java b/test/java/io/Serializable/enum/basic/Test.java index b8677750bb9305eb9b510b7e01c08b7d81ba9f99..5e8e8679c5ace1919113eb75f245af8e7b2406e7 100644 --- a/test/java/io/Serializable/enum/basic/Test.java +++ b/test/java/io/Serializable/enum/basic/Test.java @@ -25,9 +25,6 @@ * @bug 4838379 * @summary Verify that basic serialization of non-specialized enum constants * functions properly. - * - * @compile -source 1.5 Test.java - * @run main Test */ import java.io.*; diff --git a/test/java/io/Serializable/enum/classObject/Test.java b/test/java/io/Serializable/enum/classObject/Test.java index e0f6ea2bd966176dae5288f5e1bbab8d633089c4..8d341c0447001af0f8439e4c044c7fed24c47925 100644 --- a/test/java/io/Serializable/enum/classObject/Test.java +++ b/test/java/io/Serializable/enum/classObject/Test.java @@ -25,9 +25,6 @@ * @bug 4838379 * @summary Verify that serialization of Class objects for enum types works * properly. - * - * @compile -source 1.5 Test.java - * @run main Test */ import java.io.*; diff --git a/test/java/io/Serializable/enum/constantSubclasses/Write.java b/test/java/io/Serializable/enum/constantSubclasses/Write.java index 18dcfb56854e675f3e94301997fc96f41b1b3028..349125cc9e5d0b3d4520226d5223c1ddac6637f8 100644 --- a/test/java/io/Serializable/enum/constantSubclasses/Write.java +++ b/test/java/io/Serializable/enum/constantSubclasses/Write.java @@ -26,10 +26,10 @@ * @summary Verify that serialization of enum constants that are instances of * constant-specific subclasses functions properly. * - * @compile -source 1.5 Write.java + * @compile Write.java * @run main Write * @clean Write - * @compile -source 1.5 Read.java + * @compile Read.java * @run main Read * @clean Read */ diff --git a/test/java/io/Serializable/enum/ignoreSerializationFields/Test.java b/test/java/io/Serializable/enum/ignoreSerializationFields/Test.java index 2780a283e57d6c41ccacfdb29b365aaed9b68836..d5326af0d2e83baf061bf69a499cb8268865135b 100644 --- a/test/java/io/Serializable/enum/ignoreSerializationFields/Test.java +++ b/test/java/io/Serializable/enum/ignoreSerializationFields/Test.java @@ -25,9 +25,6 @@ * @bug 4838379 * @summary Verify that serialVersionUID and serialPersistentFields * declarations made by enum types and constants are ignored. - * - * @compile -source 1.5 Test.java - * @run main Test */ import java.io.*; diff --git a/test/java/io/Serializable/enum/ignoreSerializationMethods/Test.java b/test/java/io/Serializable/enum/ignoreSerializationMethods/Test.java index 39bde6e255bc40ad23e0d530b25fba1cf16512db..a1f9bbc6c746f86697987ceb68f36c5239cba0a2 100644 --- a/test/java/io/Serializable/enum/ignoreSerializationMethods/Test.java +++ b/test/java/io/Serializable/enum/ignoreSerializationMethods/Test.java @@ -25,9 +25,6 @@ * @bug 4838379 * @summary Verify that custom serialization methods defined by enum types are * not invoked during serialization or deserialization. - * - * @compile -source 1.5 Test.java - * @run main Test */ import java.io.*; diff --git a/test/java/io/Serializable/enum/mismatchedTypecode/Test.java b/test/java/io/Serializable/enum/mismatchedTypecode/Test.java index f050cd964de1a9e39c6072b7147971ad566ef0b8..7197581700be91db4be7d946ba781b675cd68074 100644 --- a/test/java/io/Serializable/enum/mismatchedTypecode/Test.java +++ b/test/java/io/Serializable/enum/mismatchedTypecode/Test.java @@ -26,9 +26,6 @@ * @summary Verify that TC_OBJECT followed by a class descriptor for an enum * class results in an InvalidClassException, as does TC_ENUM followed * by a class descriptor for a non-enum class. - * - * @compile -source 1.5 Test.java - * @run main Test */ import java.io.*; diff --git a/test/java/io/Serializable/enum/missingConstant/Write.java b/test/java/io/Serializable/enum/missingConstant/Write.java index 2939520636a79ba205e19b6ac86d182e5d8845f9..fb66b4ce4da726da1836974e784a7a892ad87087 100644 --- a/test/java/io/Serializable/enum/missingConstant/Write.java +++ b/test/java/io/Serializable/enum/missingConstant/Write.java @@ -26,10 +26,10 @@ * @summary Verify that deserialization of an enum constant that does not exist * on the receiving side results in an InvalidObjectException. * - * @compile -source 1.5 Write.java + * @compile Write.java * @run main Write * @clean Write - * @compile -source 1.5 Read.java + * @compile Read.java * @run main Read * @clean Read */ diff --git a/test/java/io/Serializable/enum/unshared/Test.java b/test/java/io/Serializable/enum/unshared/Test.java index c4bdde9bc015c78071ba64949308d9069e0f814f..036e6e8b8ac75b7741213d6884f29442801ba1c0 100644 --- a/test/java/io/Serializable/enum/unshared/Test.java +++ b/test/java/io/Serializable/enum/unshared/Test.java @@ -25,9 +25,6 @@ * @bug 4838379 * @summary Verify that unshared write and read operations work properly with * enum constants. - * - * @compile -source 1.5 Test.java - * @run main Test */ import java.io.*; diff --git a/test/java/lang/Boolean/MakeBooleanComparable.java b/test/java/lang/Boolean/MakeBooleanComparable.java index b84a4a27f59a4bbbc3e239c955d966e0d717b3c2..21840de3924654b3fcb01fb9dd58b8401680b630 100644 --- a/test/java/lang/Boolean/MakeBooleanComparable.java +++ b/test/java/lang/Boolean/MakeBooleanComparable.java @@ -26,9 +26,6 @@ * @bug 4329937 * @summary Basic test for making Boolean implement Comparable * @author Josh Bloch - * - * @compile -source 1.5 MakeBooleanComparable.java - * @run main MakeBooleanComparable */ import java.util.*; diff --git a/test/java/lang/Class/Cast.java b/test/java/lang/Class/Cast.java index 0f57c221c46a24924c0166ffa66171afd1cc7a4b..ec413f044e567d498c3931b4fb30accbeb08f5c1 100644 --- a/test/java/lang/Class/Cast.java +++ b/test/java/lang/Class/Cast.java @@ -25,9 +25,6 @@ * @test * @bug 4881275 * @summary (reflect) Class.cast() - typesafe cast desired - * - * @compile -source 1.5 Cast.java - * @run main Cast */ public class Cast { diff --git a/test/java/lang/Class/IsEnum.java b/test/java/lang/Class/IsEnum.java index 1b4ccb705116c06acda3e5d84ab2a42c44411b57..08d1e58d78b9907ffff8c6e65abf94efde232244 100644 --- a/test/java/lang/Class/IsEnum.java +++ b/test/java/lang/Class/IsEnum.java @@ -26,8 +26,6 @@ * @bug 4891872 4989735 4990789 5020490 * @summary Check isEnum() method * @author Joseph D. Darcy - * @compile -source 1.5 IsEnum.java - * @run main IsEnum */ import java.lang.annotation.*; diff --git a/test/java/lang/Class/asSubclass/BasicUnit.java b/test/java/lang/Class/asSubclass/BasicUnit.java index 68cf1c36bfd2cc0423289809d3e59f18f7edb321..e9e8b68e8539e20257878111920047b77001cb90 100644 --- a/test/java/lang/Class/asSubclass/BasicUnit.java +++ b/test/java/lang/Class/asSubclass/BasicUnit.java @@ -27,7 +27,7 @@ * @summary please add a typesafe cast for Class types * @author gafter * - * @compile -Xlint:unchecked -Werror -source 1.5 BasicUnit.java + * @compile -Xlint:unchecked -Werror BasicUnit.java * @run main BasicUnit */ diff --git a/test/java/lang/ClassLoader/Assert.sh b/test/java/lang/ClassLoader/Assert.sh index 4744defce37b42580ad9619ae3704a893bf751c5..95dd51f1465accde373d45487f6dbb3662d879ad 100644 --- a/test/java/lang/ClassLoader/Assert.sh +++ b/test/java/lang/ClassLoader/Assert.sh @@ -47,7 +47,7 @@ cp ${TESTSRC}/Assert.java . cp -R ${TESTSRC}/package1 . cp -R ${TESTSRC}/package2 . -${TESTJAVA}/bin/javac -source 1.4 Assert.java +${TESTJAVA}/bin/javac Assert.java ${TESTJAVA}/bin/java Assert diff --git a/test/java/lang/Integer/BitTwiddle.java b/test/java/lang/Integer/BitTwiddle.java index 4904ea5aa3db5c6a5032cc22e1193dc5dbbb310e..35d61efd3a533817411a826b22b52fb94f21ee71 100644 --- a/test/java/lang/Integer/BitTwiddle.java +++ b/test/java/lang/Integer/BitTwiddle.java @@ -26,9 +26,6 @@ * @bug 4495754 * @summary Basic test for int bit twiddling * @author Josh Bloch - * - * @compile -source 1.5 BitTwiddle.java - * @run main BitTwiddle */ import java.util.Random; diff --git a/test/java/lang/Long/BitTwiddle.java b/test/java/lang/Long/BitTwiddle.java index fb1affd41ddcbe6e4d97202f60bf027ac1653948..eefa9e83282dae685664cea1c49c9231cedeaecb 100644 --- a/test/java/lang/Long/BitTwiddle.java +++ b/test/java/lang/Long/BitTwiddle.java @@ -26,9 +26,6 @@ * @bug 4495754 * @summary Basic test for long bit twiddling * @author Josh Bloch - * - * @compile -source 1.5 BitTwiddle.java - * @run main BitTwiddle */ import java.util.Random; diff --git a/test/java/lang/Math/Atan2Tests.java b/test/java/lang/Math/Atan2Tests.java index 0660ff3744ced5d9c345f829d2fe2dfed0c59445..ed81283b36d829d5146b81bfef885e7faa7a473e 100644 --- a/test/java/lang/Math/Atan2Tests.java +++ b/test/java/lang/Math/Atan2Tests.java @@ -25,8 +25,6 @@ * @test * @bug 4984407 * @summary Tests for {Math, StrictMath}.atan2 - * @compile -source 1.5 Atan2Tests.java - * @run main Atan2Tests * @author Joseph D. Darcy */ diff --git a/test/java/lang/Math/IeeeRecommendedTests.java b/test/java/lang/Math/IeeeRecommendedTests.java index 4123451ed5dc75be8b0bd0926f2f748fa907bec2..f35d76ef3b8e410168fac983ad42a91b88e25fb7 100644 --- a/test/java/lang/Math/IeeeRecommendedTests.java +++ b/test/java/lang/Math/IeeeRecommendedTests.java @@ -26,8 +26,6 @@ * @bug 4860891 4826732 4780454 4939441 4826652 * @summary Tests for IEEE 754[R] recommended functions and similar methods * @author Joseph D. Darcy - * @compile -source 1.5 IeeeRecommendedTests.java - * @run main IeeeRecommendedTests */ import sun.misc.FpUtils; diff --git a/test/java/lang/Math/PowTests.java b/test/java/lang/Math/PowTests.java index 79764765e33793d283b5453c739cb8ee4d5aa302..872de407d139a4a50c3fd6d44307b311c18a3395 100644 --- a/test/java/lang/Math/PowTests.java +++ b/test/java/lang/Math/PowTests.java @@ -25,8 +25,6 @@ * @test * @bug 4984407 5033578 * @summary Tests for {Math, StrictMath}.pow - * @compile -source 1.5 PowTests.java - * @run main PowTests * @author Joseph D. Darcy */ diff --git a/test/java/lang/Math/TanTests.java b/test/java/lang/Math/TanTests.java index f603fb872a0f4a1f73baff1681a7a4e9ee7d080d..75d44631cd251cdd0e33fed8c7f45f42f0ad88dc 100644 --- a/test/java/lang/Math/TanTests.java +++ b/test/java/lang/Math/TanTests.java @@ -25,8 +25,6 @@ * @test * @bug 5033578 * @summary Tests for {Math, StrictMath}.tan - * @compile -source 1.5 TanTests.java - * @run main TanTests * @author Joseph D. Darcy */ diff --git a/test/java/lang/Runtime/exec/WinCommand.java b/test/java/lang/Runtime/exec/WinCommand.java index 37e17a1f31644cb9eaa082e91fab448cb90c96ad..b51489b76adb2ae1c37fe2debfb8696f2fc9f9ab 100644 --- a/test/java/lang/Runtime/exec/WinCommand.java +++ b/test/java/lang/Runtime/exec/WinCommand.java @@ -25,9 +25,6 @@ * @bug 5006520 * @summary Check many different ways to run Windows programs * @author Martin Buchholz - * - * @compile -source 1.5 WinCommand.java - * @run main WinCommand */ import java.io.*; diff --git a/test/java/lang/Thread/GenerifyStackTraces.java b/test/java/lang/Thread/GenerifyStackTraces.java index e10080c004f71c87648ebdf55c97c54a38bd32cb..632228cf82c4b4b2c82a4f28cd770808bd087364 100644 --- a/test/java/lang/Thread/GenerifyStackTraces.java +++ b/test/java/lang/Thread/GenerifyStackTraces.java @@ -26,9 +26,6 @@ * @bug 4919105 * @summary Generified basic unit test of Thread.getAllStackTraces() * @author Mandy Chung - * - * @compile -source 1.5 GenerifyStackTraces.java - * @run main GenerifyStackTraces */ import java.util.*; diff --git a/test/java/lang/Thread/UncaughtExceptions.sh b/test/java/lang/Thread/UncaughtExceptions.sh index 43b56c8e6fe3a7891750f0d3c926ed22f1f166f9..51aa0c58935c5332d22c32df3112e058e8fcff88 100644 --- a/test/java/lang/Thread/UncaughtExceptions.sh +++ b/test/java/lang/Thread/UncaughtExceptions.sh @@ -121,7 +121,7 @@ public class Seppuku extends Thread implements Runnable { } EOJAVA - Sys "$javac" "-source" "1.5" "Seppuku.java" + Sys "$javac" "Seppuku.java" CheckCommandResults "$expectedRC" "$expectedOut" "$expectedErr" \ "$java" "Seppuku" Cleanup diff --git a/test/java/lang/annotation/UnitTest.java b/test/java/lang/annotation/UnitTest.java index ed8b05c3cc0a05ae6032c15b53779ba8b09110e4..160ebe683a75d622bb983f9cef48d065e695a9dd 100644 --- a/test/java/lang/annotation/UnitTest.java +++ b/test/java/lang/annotation/UnitTest.java @@ -26,8 +26,6 @@ * @bug 4906359 4963461 4965058 4965039 4986770 * @summary Unit test for annotation reading * @author Josh Bloch - * @compile -source 1.5 UnitTest.java - * @run main UnitTest */ import static java.lang.annotation.RetentionPolicy.RUNTIME; diff --git a/test/java/lang/annotation/package-info.java b/test/java/lang/annotation/package-info.java index 78afb3f6c0a0455ace6e7b3785ec6fb98980b70b..d2bef02dde067aa465755c6a4195529c583d4166 100644 --- a/test/java/lang/annotation/package-info.java +++ b/test/java/lang/annotation/package-info.java @@ -27,7 +27,7 @@ * @summary Package annotations * @author gafter * - * @compile -source 1.5 package-info.java PackageMain.java + * @compile package-info.java PackageMain.java * @run main PackageMain */ diff --git a/test/java/lang/management/CompositeData/MemoryNotifInfoCompositeData.java b/test/java/lang/management/CompositeData/MemoryNotifInfoCompositeData.java index d833e5eb9aba5f4026134fe2edc3dac8af60f52c..8002188024ad788f06431bbe43a848960914d4fe 100644 --- a/test/java/lang/management/CompositeData/MemoryNotifInfoCompositeData.java +++ b/test/java/lang/management/CompositeData/MemoryNotifInfoCompositeData.java @@ -29,7 +29,7 @@ * the input CompositeData is invalid. * @author Mandy Chung * - * @compile -source 1.5 OpenTypeConverter.java + * @compile OpenTypeConverter.java * @build MemoryNotifInfoCompositeData * @run main MemoryNotifInfoCompositeData */ diff --git a/test/java/lang/management/CompositeData/ThreadInfoCompositeData.java b/test/java/lang/management/CompositeData/ThreadInfoCompositeData.java index 6c3cb0d044ad980d7b7c71218efaee6c7c892ba6..31be3a1596aa7e41426724f9a5ae421c88cd304b 100644 --- a/test/java/lang/management/CompositeData/ThreadInfoCompositeData.java +++ b/test/java/lang/management/CompositeData/ThreadInfoCompositeData.java @@ -29,7 +29,7 @@ * the input CompositeData is invalid. * @author Mandy Chung * - * @compile -source 1.5 OpenTypeConverter.java + * @compile OpenTypeConverter.java * @build ThreadInfoCompositeData * @run main ThreadInfoCompositeData */ diff --git a/test/java/lang/management/ManagementFactory/MXBeanProxyTest.java b/test/java/lang/management/ManagementFactory/MXBeanProxyTest.java index afd6618e62aece0628df0627ff53e7adfe0b6165..4a829fe76debf1bfa7036f8540da2768a8498fbc 100644 --- a/test/java/lang/management/ManagementFactory/MXBeanProxyTest.java +++ b/test/java/lang/management/ManagementFactory/MXBeanProxyTest.java @@ -26,9 +26,6 @@ * @bug 5024531 * @summary Basic Test for ManagementFactory.newPlatformMXBean(). * @author Mandy Chung - * - * @compile -source 1.5 MXBeanProxyTest.java - * @run main MXBeanProxyTest */ import javax.management.*; import java.lang.management.ClassLoadingMXBean; diff --git a/test/java/lang/management/ManagementFactory/PlatformMBeanServerTest.java b/test/java/lang/management/ManagementFactory/PlatformMBeanServerTest.java index 7deb892569a77e69877f5bc9a9600c940c4da545..939ac86a764bf5f60f50bc72b92cde11a2d01519 100644 --- a/test/java/lang/management/ManagementFactory/PlatformMBeanServerTest.java +++ b/test/java/lang/management/ManagementFactory/PlatformMBeanServerTest.java @@ -26,9 +26,6 @@ * @bug 4947536 * @summary Basic unit test of ManagementFactory.getPlatformMBeanServer() * @author Mandy Chung - * - * @compile -source 1.5 PlatformMBeanServerTest.java - * @run main PlatformMBeanServerTest */ import java.lang.management.*; diff --git a/test/java/lang/management/ManagementFactory/ProxyExceptions.java b/test/java/lang/management/ManagementFactory/ProxyExceptions.java index 5be25106827eff80b70304031fc41175903cd6ac..1feba9e13f68323dce431f5a0206017713d97635 100644 --- a/test/java/lang/management/ManagementFactory/ProxyExceptions.java +++ b/test/java/lang/management/ManagementFactory/ProxyExceptions.java @@ -27,9 +27,6 @@ * @summary Test type mapping of the platform MXBean proxy * returned from Management.newPlatformMXBeanProxy(). * @author Mandy Chung - * - * @compile -source 1.5 ProxyExceptions.java - * @run main ProxyExceptions */ import java.lang.management.*; import javax.management.*; diff --git a/test/java/lang/management/ManagementFactory/ProxyTypeMapping.java b/test/java/lang/management/ManagementFactory/ProxyTypeMapping.java index eb48825736c4270311192fa04c04f285801056ba..a4111b2e6ef9edfafd89650bfe17561372843d88 100644 --- a/test/java/lang/management/ManagementFactory/ProxyTypeMapping.java +++ b/test/java/lang/management/ManagementFactory/ProxyTypeMapping.java @@ -28,7 +28,7 @@ * returned from Management.newPlatformMXBeanProxy(). * @author Mandy Chung * - * @compile -source 1.5 ProxyTypeMapping.java + * @compile ProxyTypeMapping.java * @run main/othervm -verbose:gc ProxyTypeMapping */ import java.lang.management.*; diff --git a/test/java/lang/management/ManagementFactory/ValidateOpenTypes.java b/test/java/lang/management/ManagementFactory/ValidateOpenTypes.java index 68d5304b91c72d0ce6957b50aafa718156ed6b56..d4fd4ea4a9410aa2fa5cceee98d34de0c170b89a 100644 --- a/test/java/lang/management/ManagementFactory/ValidateOpenTypes.java +++ b/test/java/lang/management/ManagementFactory/ValidateOpenTypes.java @@ -28,7 +28,7 @@ * MBeanServer. * @author Mandy Chung * - * @compile -source 1.5 ValidateOpenTypes.java + * @compile ValidateOpenTypes.java * @run main/othervm -verbose:gc ValidateOpenTypes */ import java.lang.management.*; diff --git a/test/java/lang/management/RuntimeMXBean/GetSystemProperties.java b/test/java/lang/management/RuntimeMXBean/GetSystemProperties.java index 5a655378462943edd3fbae7bdc555765d999713c..c411192f080665fa7d1bdb57e9e99f9c1e4b5328 100644 --- a/test/java/lang/management/RuntimeMXBean/GetSystemProperties.java +++ b/test/java/lang/management/RuntimeMXBean/GetSystemProperties.java @@ -26,9 +26,6 @@ * @bug 4990512 * @summary Basic Test for RuntimeMXBean.getSystemProperties(). * @author Mandy Chung - * - * @compile -source 1.5 GetSystemProperties.java - * @run main GetSystemProperties */ import java.lang.management.ManagementFactory; diff --git a/test/java/lang/management/RuntimeMXBean/TestInputArgument.sh b/test/java/lang/management/RuntimeMXBean/TestInputArgument.sh index f1fb705f3770fa459c2f24860bc50693e66dd571..e38817ec3fcbea0ce46f94618ebea21991267410 100644 --- a/test/java/lang/management/RuntimeMXBean/TestInputArgument.sh +++ b/test/java/lang/management/RuntimeMXBean/TestInputArgument.sh @@ -27,7 +27,7 @@ # @summary # @author Mandy Chung # -# @run compile -source 1.5 InputArgument.java +# @run compile InputArgument.java # @run shell TestInputArgument.sh # diff --git a/test/java/lang/reflect/Constructor/GenericStringTest.java b/test/java/lang/reflect/Constructor/GenericStringTest.java index 49709884f5605c9e359786a07f15b67085c432a0..59ed2dbfa95f2a8aea67d8238619c1f8529e4f3e 100644 --- a/test/java/lang/reflect/Constructor/GenericStringTest.java +++ b/test/java/lang/reflect/Constructor/GenericStringTest.java @@ -26,8 +26,6 @@ * @bug 5033583 6316717 6470106 * @summary Check toGenericString() and toString() methods * @author Joseph D. Darcy - * @compile -source 1.5 GenericStringTest.java - * @run main GenericStringTest */ import java.lang.reflect.*; diff --git a/test/java/lang/reflect/Field/GenericStringTest.java b/test/java/lang/reflect/Field/GenericStringTest.java index f25a6ca36f2d65afcdc0e4a0d691c164af0a0d3c..148e69a70680e59202472e702c5b549bf5ffd442 100644 --- a/test/java/lang/reflect/Field/GenericStringTest.java +++ b/test/java/lang/reflect/Field/GenericStringTest.java @@ -26,8 +26,6 @@ * @bug 5033583 * @summary Check toGenericString() method * @author Joseph D. Darcy - * @compile -source 1.5 GenericStringTest.java - * @run main GenericStringTest */ import java.lang.reflect.*; diff --git a/test/java/lang/reflect/Generics/StringsAndBounds.java b/test/java/lang/reflect/Generics/StringsAndBounds.java index d49a5ea628e8403edf8faa22641a1d17de1f34a8..dac18fb7cb2330e7e3d8caa3a0d4491f20f26a7d 100644 --- a/test/java/lang/reflect/Generics/StringsAndBounds.java +++ b/test/java/lang/reflect/Generics/StringsAndBounds.java @@ -26,8 +26,6 @@ * @bug 5015676 4987888 4997464 * @summary Testing upper bounds and availability of toString methods * @author Joseph D. Darcy - * @compile -source 1.5 StringsAndBounds.java - * @run main StringsAndBounds */ import java.lang.reflect.*; diff --git a/test/java/lang/reflect/Generics/TestC1.java b/test/java/lang/reflect/Generics/TestC1.java index 756a4c63ec20f5edf2c19581f097cf8ff5d8c564..8a9fbe37031284a9fe6766c3148ecb4667efff40 100644 --- a/test/java/lang/reflect/Generics/TestC1.java +++ b/test/java/lang/reflect/Generics/TestC1.java @@ -26,7 +26,7 @@ * @bug 4891872 * @summary Some tests for the generic core reflection api. * @author Gilad Bracha -* @compile -source 1.5 TestC1.java +* @compile TestC1.java * @run main/othervm -ea TestC1 */ diff --git a/test/java/lang/reflect/Generics/TestC2.java b/test/java/lang/reflect/Generics/TestC2.java index d42671b3d3d8266e95b5e89438684a50ee7e8cfe..c2e574a2fa51d8f9fc55e6f37fdb9e25729c7977 100644 --- a/test/java/lang/reflect/Generics/TestC2.java +++ b/test/java/lang/reflect/Generics/TestC2.java @@ -26,7 +26,7 @@ * @bug 4891872 * @summary Some tests for the generic core reflection api. * @author Gilad Bracha -* @compile -source 1.5 TestC2.java +* @compile TestC2.java * @run main/othervm -ea TestC2 */ diff --git a/test/java/lang/reflect/Generics/TestN1.java b/test/java/lang/reflect/Generics/TestN1.java index d2dc8b253f7309321a6a65f3643d86c4872db611..014a09f956d2a4135585e2b181a4a16e88107309 100644 --- a/test/java/lang/reflect/Generics/TestN1.java +++ b/test/java/lang/reflect/Generics/TestN1.java @@ -26,7 +26,7 @@ * @bug 4891872 * @summary Some tests for the generic core reflection api. * @author Gilad Bracha -* @compile -source 1.5 TestN1.java +* @compile TestN1.java * @run main/othervm -ea TestN1 */ diff --git a/test/java/lang/reflect/Generics/exceptionCauseTest.java b/test/java/lang/reflect/Generics/exceptionCauseTest.java index 1427563f85e825426e27a452d9b309bbcedb2a62..77a71013fbf62a038138c4d6f7c0befec9985bc9 100644 --- a/test/java/lang/reflect/Generics/exceptionCauseTest.java +++ b/test/java/lang/reflect/Generics/exceptionCauseTest.java @@ -26,8 +26,6 @@ * @bug 4981727 * @summary * @author Joseph D. Darcy - * @compile -source 1.5 exceptionCauseTest.java - * @run main exceptionCauseTest */ import java.io.PrintStream; diff --git a/test/java/lang/reflect/Generics/getAnnotationTest.java b/test/java/lang/reflect/Generics/getAnnotationTest.java index d7f5d6de7da6d1d10335153a3c5cd4a5587229b2..f7a60f26d692eaf7e6bbb5eb46888e2555710b75 100644 --- a/test/java/lang/reflect/Generics/getAnnotationTest.java +++ b/test/java/lang/reflect/Generics/getAnnotationTest.java @@ -26,8 +26,6 @@ * @bug 4979440 * @summary Test for signature parsing corner case * @author Joseph D. Darcy - * @compile -source 1.5 getAnnotationTest.java - * @run main getAnnotationTest */ import java.lang.reflect.*; diff --git a/test/java/lang/reflect/Method/Equals.java b/test/java/lang/reflect/Method/Equals.java index 2bcb4ecf4e3c647d8d52f8e931aa8395e83bcd36..7f7bd70f32f449d10b94fc848f8580ae82470832 100644 --- a/test/java/lang/reflect/Method/Equals.java +++ b/test/java/lang/reflect/Method/Equals.java @@ -27,7 +27,7 @@ * @summary Generic framework to test Method.equals. * * @clean A - * @compile -source 1.5 Equals.java + * @compile Equals.java * @run main Equals */ diff --git a/test/java/lang/reflect/Method/GenericStringTest.java b/test/java/lang/reflect/Method/GenericStringTest.java index 361e3db8c7a4e79f1c2405f9982bcdf167b1bac7..3894252a52f5b56ce1985f21f2031631c8839be6 100644 --- a/test/java/lang/reflect/Method/GenericStringTest.java +++ b/test/java/lang/reflect/Method/GenericStringTest.java @@ -26,8 +26,6 @@ * @bug 5033583 6316717 6470106 * @summary Check toGenericString() and toString() methods * @author Joseph D. Darcy - * @compile -source 1.5 GenericStringTest.java - * @run main GenericStringTest */ import java.lang.reflect.*; diff --git a/test/java/math/BigDecimal/DivideTests.java b/test/java/math/BigDecimal/DivideTests.java index 7d04a60ca4b85e068b111804a606743f1076ea2b..5265f6d32f88a30c04d751f12f951aa7397f19df 100644 --- a/test/java/math/BigDecimal/DivideTests.java +++ b/test/java/math/BigDecimal/DivideTests.java @@ -26,8 +26,6 @@ * @bug 4851776 4907265 6177836 6876282 * @summary Some tests for the divide methods. * @author Joseph D. Darcy - * @compile -source 1.5 DivideTests.java - * @run main DivideTests */ import java.math.*; diff --git a/test/java/math/BigDecimal/IntegralDivisionTests.java b/test/java/math/BigDecimal/IntegralDivisionTests.java index 100eca40cce547e479f2afaa43f9dc02cff887bd..6ce5a900453d0c160abfe19b4b09f48a9b1461ba 100644 --- a/test/java/math/BigDecimal/IntegralDivisionTests.java +++ b/test/java/math/BigDecimal/IntegralDivisionTests.java @@ -25,8 +25,6 @@ * @bug 4904082 4917089 6337226 * @summary Tests that integral division and related methods return the proper result and scale. * @author Joseph D. Darcy - * @compile -source 1.5 IntegralDivisionTests.java - * @run main IntegralDivisionTests */ import java.math.*; public class IntegralDivisionTests { diff --git a/test/java/math/BigDecimal/PowTests.java b/test/java/math/BigDecimal/PowTests.java index 9623b70bc117f1ff455b7fcd217c9e6162b2fd2f..78b3b6a570229960f09e253f5adf0deb94969305 100644 --- a/test/java/math/BigDecimal/PowTests.java +++ b/test/java/math/BigDecimal/PowTests.java @@ -26,8 +26,6 @@ * @bug 4916097 * @summary Some exponent over/undeflow tests for the pow method * @author Joseph D. Darcy - * @compile -source 1.5 PowTests.java - * @run main PowTests */ import java.math.*; diff --git a/test/java/math/BigDecimal/ToPlainStringTests.java b/test/java/math/BigDecimal/ToPlainStringTests.java index aca745b7e4b943458a64f0fdc2c2e4b5516d7177..9343b0dbab112db0ecc9db19f6ff2280dd695338 100644 --- a/test/java/math/BigDecimal/ToPlainStringTests.java +++ b/test/java/math/BigDecimal/ToPlainStringTests.java @@ -26,8 +26,6 @@ * @bug 4984872 * @summary Basic tests of toPlainString method * @author Joseph D. Darcy - * @compile -source 1.5 ToPlainStringTests.java - * @run main ToPlainStringTests */ import java.math.*; diff --git a/test/java/math/BigDecimal/ZeroScalingTests.java b/test/java/math/BigDecimal/ZeroScalingTests.java index a48e005a4b151f820b66ca011e7226480b2c5b18..abd5451e0681ae35d7366a598f5ca6b39eca19a0 100644 --- a/test/java/math/BigDecimal/ZeroScalingTests.java +++ b/test/java/math/BigDecimal/ZeroScalingTests.java @@ -26,8 +26,6 @@ * @bug 4902952 4905407 4916149 * @summary Tests that the scale of zero is propagated properly and has the proper effect. * @author Joseph D. Darcy - * @compile -source 1.5 ZeroScalingTests.java - * @run main ZeroScalingTests */ import java.math.*; diff --git a/test/java/math/RoundingMode/RoundingModeTests.java b/test/java/math/RoundingMode/RoundingModeTests.java index 03fd5e7ac806e601b6544093766680eb3bfe43ce..8a7cd1aa0c9dfd2b295b614d6b49a236f1fc1bec 100644 --- a/test/java/math/RoundingMode/RoundingModeTests.java +++ b/test/java/math/RoundingMode/RoundingModeTests.java @@ -26,8 +26,6 @@ * @bug 4851776 4891522 4905335 * @summary Basic tests for the RoundingMode class. * @author Joseph D. Darcy - * @compile -source 1.5 RoundingModeTests.java - * @run main RoundingModeTests */ import java.math.RoundingMode; diff --git a/test/java/net/CookieHandler/TestHttpCookie.java b/test/java/net/CookieHandler/TestHttpCookie.java index f1f89f8daab06db686d807c8374274afbf624210..df0dd74cdb7f780bf77b821083dfefa7b96872a7 100644 --- a/test/java/net/CookieHandler/TestHttpCookie.java +++ b/test/java/net/CookieHandler/TestHttpCookie.java @@ -24,7 +24,7 @@ /** * @test * @summary Unit test for java.net.HttpCookie - * @bug 6244040 6277796 6277801 6277808 6294071 6692802 6790677 + * @bug 6244040 6277796 6277801 6277808 6294071 6692802 6790677 6901170 * @author Edward Wang */ @@ -335,6 +335,9 @@ public class TestHttpCookie { // bug 6277801 test("set-cookie: CUSTOMER=WILE_E_COYOTE; path=/; expires=Wednesday, 09-Nov-99 23:12:40 GMT; path=\"/acme\"") .n("CUSTOMER").v("WILE_E_COYOTE").p("/").ver(0); + + // bug 6901170 + test("set-cookie: CUSTOMER=WILE_E_COYOTE; version='1'").ver(1); } static void misc() { diff --git a/test/java/net/ProxySelector/ProxyTest.java b/test/java/net/ProxySelector/ProxyTest.java index 869eb3fab277e7e82186ad79696278e499867916..18be010f619c61a40d26fd0be67e699355f38830 100644 --- a/test/java/net/ProxySelector/ProxyTest.java +++ b/test/java/net/ProxySelector/ProxyTest.java @@ -27,7 +27,7 @@ * @summary HTTP client: Improve proxy server configuration and selection * @library ../../../sun/net/www/httptest/ * @build ClosedChannelList HttpServer HttpTransaction HttpCallback - * @compile -source 1.5 ProxyTest.java + * @compile ProxyTest.java * @run main/othervm -Dhttp.proxyHost=inexistant -Dhttp.proxyPort=8080 ProxyTest */ diff --git a/test/java/net/URL/PerConnectionProxy.java b/test/java/net/URL/PerConnectionProxy.java index 0640ec4bb87de061e51509ca8aa5899a93b12946..9a8cdf2616f83e2127b19e46e76ce511146140f3 100644 --- a/test/java/net/URL/PerConnectionProxy.java +++ b/test/java/net/URL/PerConnectionProxy.java @@ -26,7 +26,7 @@ * @summary Needs per connection proxy support for URLs * @library ../../../sun/net/www/httptest/ * @build ClosedChannelList HttpServer HttpTransaction HttpCallback - * @compile -source 1.5 PerConnectionProxy.java + * @compile PerConnectionProxy.java * @run main/othervm -Dhttp.proxyHost=inexistant -Dhttp.proxyPort=8080 PerConnectionProxy */ diff --git a/test/java/security/cert/PKIXBuilderParameters/InvalidParameters.java b/test/java/security/cert/PKIXBuilderParameters/InvalidParameters.java index 14b8b0698ebefdaded070cd478960a9d32daeccf..b9f172fb2f6201c945016f4a644288f95ce78aea 100644 --- a/test/java/security/cert/PKIXBuilderParameters/InvalidParameters.java +++ b/test/java/security/cert/PKIXBuilderParameters/InvalidParameters.java @@ -24,7 +24,7 @@ /** * @test * @test 4422738 - * @compile -source 1.4 -target 1.4 InvalidParameters.java + * @compile -source 1.4 InvalidParameters.java * @run main InvalidParameters * @summary Make sure PKIXBuilderParameters(Set) detects invalid * parameters and throws correct exceptions diff --git a/test/java/security/cert/PKIXParameters/InvalidParameters.java b/test/java/security/cert/PKIXParameters/InvalidParameters.java index d3e3c5ab786d8c04aa6e060fbb5f075ef4befbf8..01946d6e2e07132992e2919a9d3f354af236e035 100644 --- a/test/java/security/cert/PKIXParameters/InvalidParameters.java +++ b/test/java/security/cert/PKIXParameters/InvalidParameters.java @@ -24,7 +24,7 @@ /** * @test * @test 4422738 - * @compile -source 1.4 -target 1.4 InvalidParameters.java + * @compile -source 1.4 InvalidParameters.java * @run main InvalidParameters * @summary Make sure PKIXParameters(Set) and setTrustAnchors() detects invalid * parameters and throws correct exceptions diff --git a/test/java/util/AbstractList/CheckForComodification.java b/test/java/util/AbstractList/CheckForComodification.java index 156c78982703a1a9ddb9ba24a62fd9cb594e95ad..790a4bb6c4e18d9e9506a2a646731646df49e9a8 100644 --- a/test/java/util/AbstractList/CheckForComodification.java +++ b/test/java/util/AbstractList/CheckForComodification.java @@ -28,8 +28,6 @@ * @author Josh Bloch * * @ignore Bug fix temporarily removed as it uncovered other bugs (4992226) - * @compile -source 1.5 CheckForComodification.java - * @run main CheckForComodification */ import java.util.*; diff --git a/test/java/util/Collections/AddAll.java b/test/java/util/Collections/AddAll.java index ef66b007591b35ca6dad549b62eb403437bb83f2..48bbc799a5d5f5702b7b54b138b707edae2db615 100644 --- a/test/java/util/Collections/AddAll.java +++ b/test/java/util/Collections/AddAll.java @@ -26,9 +26,6 @@ * @bug 4822887 * @summary Basic test for Collections.addAll * @author Josh Bloch - * - * @compile -source 1.5 AddAll.java - * @run main AddAll */ import java.util.*; diff --git a/test/java/util/Collections/Disjoint.java b/test/java/util/Collections/Disjoint.java index 8d820f10015ff69e9b1b0dd6699766b6172ebec8..ada965efa6a7a535966f2092df11185f4200666a 100644 --- a/test/java/util/Collections/Disjoint.java +++ b/test/java/util/Collections/Disjoint.java @@ -26,9 +26,6 @@ * @bug 4339792 * @summary Basic test for Collections.disjoint * @author Josh Bloch - * - * @compile -source 1.5 Disjoint.java - * @run main Disjoint */ import java.util.*; diff --git a/test/java/util/Collections/Frequency.java b/test/java/util/Collections/Frequency.java index a21265720f3b5057400f87c051844c2318611bf2..71938c561cf755b29d56e2bf2341cb4283878f73 100644 --- a/test/java/util/Collections/Frequency.java +++ b/test/java/util/Collections/Frequency.java @@ -26,9 +26,6 @@ * @bug 4193200 * @summary Basic test for Collections.frequency * @author Josh Bloch - * - * @compile -source 1.5 Frequency.java - * @run main Frequency */ import java.util.*; diff --git a/test/java/util/EnumMap/EnumMapBash.java b/test/java/util/EnumMap/EnumMapBash.java index 4dd51b1332761737301fb3efd8bfc16f2a7916ae..1182bf6c446e61cb735ee3c697c6cf0b65d7ec33 100644 --- a/test/java/util/EnumMap/EnumMapBash.java +++ b/test/java/util/EnumMap/EnumMapBash.java @@ -27,9 +27,6 @@ * @summary Unit test for EnumMap * @author Josh Bloch * @author Yo Yo Ma - * - * @compile -source 1.5 EnumMapBash.java - * @run main EnumMapBash */ import java.util.*; diff --git a/test/java/util/EnumSet/AllOf.java b/test/java/util/EnumSet/AllOf.java index 712fbc377190603adb737c1f2dc2bdffd96e58b5..28e471b0bfe26948d3e7d6f2e79b598db8ddb1ee 100644 --- a/test/java/util/EnumSet/AllOf.java +++ b/test/java/util/EnumSet/AllOf.java @@ -26,9 +26,6 @@ * @bug 4946090 * @summary AllOf static factory is broken in Regular and Jumbo enum set * @author Josh Bloch - * - * @compile -source 1.5 AllOf.java - * @run main AllOf */ import java.util.*; diff --git a/test/java/util/EnumSet/ComplementOf.java b/test/java/util/EnumSet/ComplementOf.java index 35251792eeda467e0fa0c8367336731c606bb58d..3a9fe377a4eadd1b4ea861620043cb355ab83657 100644 --- a/test/java/util/EnumSet/ComplementOf.java +++ b/test/java/util/EnumSet/ComplementOf.java @@ -26,9 +26,6 @@ * @bug 4946096 * @summary ComplementOf static factory is broken in Regular and Jumbo enum set * @author Josh Bloch - * - * @compile -source 1.5 ComplementOf.java - * @run main ComplementOf */ import java.util.*; diff --git a/test/java/util/EnumSet/EnumSetBash.java b/test/java/util/EnumSet/EnumSetBash.java index fd61f119755e750d4bb2cbf6d21cde4a4d8078ac..51dd8cbfef6257dc3a865f1f3d1aaa1d699c1ffc 100644 --- a/test/java/util/EnumSet/EnumSetBash.java +++ b/test/java/util/EnumSet/EnumSetBash.java @@ -28,9 +28,6 @@ * @author Josh Bloch * @author Neal Gafter * @author Yo Ma Ma - * - * @compile -source 1.5 EnumSetBash.java - * @run main EnumSetBash */ import java.util.*; diff --git a/test/java/util/EnumSet/JumboRange.java b/test/java/util/EnumSet/JumboRange.java index eec956572344c11908d0076c99ccec20782b8aab..55be9784dc649fc38d86b808964f8c09f98a9859 100644 --- a/test/java/util/EnumSet/JumboRange.java +++ b/test/java/util/EnumSet/JumboRange.java @@ -26,9 +26,6 @@ * @bug 4958003 * @summary Range static factory fails to compute size in Jumbo enum set * @author Josh Bloch - * - * @compile -source 1.5 JumboRange.java - * @run main JumboRange */ import java.util.*; diff --git a/test/java/util/EnumSet/Range.java b/test/java/util/EnumSet/Range.java index 2a0301b68bc00308a8cea0e87186f984269f05af..ad4ab959c3f02441108e6b121f3fc376132b368a 100644 --- a/test/java/util/EnumSet/Range.java +++ b/test/java/util/EnumSet/Range.java @@ -26,9 +26,6 @@ * @bug 4952736 * @summary Range static factory is broken in Regular and Jumbo enum set * @author Josh Bloch - * - * @compile -source 1.5 Range.java - * @run main Range */ import java.util.*; diff --git a/test/java/util/Formattable/StockName.java b/test/java/util/Formattable/StockName.java index 30a06da82171567b289c8f7e96d908bcb9629ed5..d4b092e802ab7180a92446977dafbfff608af6b8 100644 --- a/test/java/util/Formattable/StockName.java +++ b/test/java/util/Formattable/StockName.java @@ -21,11 +21,9 @@ * have any questions. */ -/** +/* * @test * @bug 4965770 4992540 5030716 - * @compile -source 1.5 StockName.java - * @run main StockName */ import java.nio.CharBuffer; diff --git a/test/java/util/Formatter/Basic-X.java b/test/java/util/Formatter/Basic-X.java.template similarity index 100% rename from test/java/util/Formatter/Basic-X.java rename to test/java/util/Formatter/Basic-X.java.template diff --git a/test/java/util/Formatter/genBasic.sh b/test/java/util/Formatter/genBasic.sh index 2c352ad39cf0b817718bd06f76a0963ef18206b3..819afe7cd392558172ea668b3a9f003b5a7bdad7 100644 --- a/test/java/util/Formatter/genBasic.sh +++ b/test/java/util/Formatter/genBasic.sh @@ -27,10 +27,10 @@ javac -d . ../../../../make/tools/src/build/tools/spp/Spp.java gen() { # if [ $3 = "true" ] -# then $SPP -K$1 -Dtype=$1 -DType=$2 -KprimBasic$2.java -# else $SPP -K$1 -Dtype=$1 -DType=$2 -K$3 Basic$2.java +# then $SPP -K$1 -Dtype=$1 -DType=$2 -KprimBasic$2.java +# else $SPP -K$1 -Dtype=$1 -DType=$2 -K$3 Basic$2.java # fi - java build.tools.spp.Spp -K$1 -Dtype=$1 -DType=$2 -K$3 -K$4 -K$5 -K$6 Basic$2.java + java build.tools.spp.Spp -K$1 -Dtype=$1 -DType=$2 -K$3 -K$4 -K$5 -K$6 Basic$2.java } gen boolean Boolean prim "" "" "" diff --git a/test/java/util/IdentityHashMap/ToString.java b/test/java/util/IdentityHashMap/ToString.java index 794ccb9982b43dfde29eaa9a03bb1b05b28d748c..8b22e3013f369d15da39f87bd1f5f0883854edce 100644 --- a/test/java/util/IdentityHashMap/ToString.java +++ b/test/java/util/IdentityHashMap/ToString.java @@ -26,9 +26,6 @@ * @bug 4973432 * @summary Test that toString on entrySet Iterator/Entry behaves reasonably * @author Josh Bloch - * - * @compile -source 1.5 ToString.java - * @run main ToString */ diff --git a/test/java/util/Locale/Bug4175998Test.java b/test/java/util/Locale/Bug4175998Test.java index 96335255d0f4da4911a0d6ac1593b14e95652ba8..37ebee4860e5021934138f10da3cb008918768f9 100644 --- a/test/java/util/Locale/Bug4175998Test.java +++ b/test/java/util/Locale/Bug4175998Test.java @@ -23,7 +23,7 @@ /* @test @summary test ISO639-2 language codes - @compile -encoding ascii -source 1.4 -target 1.4 Bug4175998Test.java + @compile -encoding ascii -source 5 Bug4175998Test.java @run main Bug4175998Test @bug 4175998 */ diff --git a/test/java/util/UUID/UUIDTest.java b/test/java/util/UUID/UUIDTest.java index c71f6a410620c3f0a72b8e93b4bb6fbce862da26..2dde63c655cbf2a9f6e5b61d917d93d5e892023c 100644 --- a/test/java/util/UUID/UUIDTest.java +++ b/test/java/util/UUID/UUIDTest.java @@ -23,8 +23,6 @@ /* @test * @bug 4173528 5068772 - * @compile -source 1.4 -target 1.4 UUIDTest.java - * @run main UUIDTest * @summary Unit tests for java.util.UUID */ diff --git a/test/java/util/concurrent/BlockingQueue/CancelledProducerConsumerLoops.java b/test/java/util/concurrent/BlockingQueue/CancelledProducerConsumerLoops.java index 98ac5d744e2101628993c6b383d1ff632c3f8305..b704bb12c35fef5e45ed3e58c9d788d379b1bf99 100644 --- a/test/java/util/concurrent/BlockingQueue/CancelledProducerConsumerLoops.java +++ b/test/java/util/concurrent/BlockingQueue/CancelledProducerConsumerLoops.java @@ -34,7 +34,7 @@ /* * @test * @bug 4486658 - * @compile -source 1.5 CancelledProducerConsumerLoops.java + * @compile CancelledProducerConsumerLoops.java * @run main/timeout=7000 CancelledProducerConsumerLoops * @summary Checks for responsiveness of blocking queues to cancellation. * Runs under the assumption that ITERS computations require more than diff --git a/test/java/util/concurrent/BlockingQueue/MultipleProducersSingleConsumerLoops.java b/test/java/util/concurrent/BlockingQueue/MultipleProducersSingleConsumerLoops.java index 8b7db5a945d706885b50b6e4051e8ae0f51bc6da..31db3a1dde13fa3b1a5813ecc31d3cc450067151 100644 --- a/test/java/util/concurrent/BlockingQueue/MultipleProducersSingleConsumerLoops.java +++ b/test/java/util/concurrent/BlockingQueue/MultipleProducersSingleConsumerLoops.java @@ -34,7 +34,7 @@ /* * @test * @bug 4486658 - * @compile -source 1.5 MultipleProducersSingleConsumerLoops.java + * @compile MultipleProducersSingleConsumerLoops.java * @run main/timeout=3600 MultipleProducersSingleConsumerLoops * @summary multiple producers and single consumer using blocking queues */ diff --git a/test/java/util/concurrent/BlockingQueue/ProducerConsumerLoops.java b/test/java/util/concurrent/BlockingQueue/ProducerConsumerLoops.java index 761990d3a925c8b16e6472bb7d18a6310180ca52..c6ca42e9ffcf2bb4d745a9e336f8f1ede345683b 100644 --- a/test/java/util/concurrent/BlockingQueue/ProducerConsumerLoops.java +++ b/test/java/util/concurrent/BlockingQueue/ProducerConsumerLoops.java @@ -34,7 +34,7 @@ /* * @test * @bug 4486658 - * @compile -source 1.5 ProducerConsumerLoops.java + * @compile ProducerConsumerLoops.java * @run main/timeout=3600 ProducerConsumerLoops * @summary multiple producers and consumers using blocking queues */ diff --git a/test/java/util/concurrent/BlockingQueue/SingleProducerMultipleConsumerLoops.java b/test/java/util/concurrent/BlockingQueue/SingleProducerMultipleConsumerLoops.java index c99a664b7878deeea4e9cec0c8db76da115819e1..f365dea71a6d4c88d93ca3c43fa09fb179709f2b 100644 --- a/test/java/util/concurrent/BlockingQueue/SingleProducerMultipleConsumerLoops.java +++ b/test/java/util/concurrent/BlockingQueue/SingleProducerMultipleConsumerLoops.java @@ -34,7 +34,7 @@ /* * @test * @bug 4486658 - * @compile -source 1.5 SingleProducerMultipleConsumerLoops.java + * @compile SingleProducerMultipleConsumerLoops.java * @run main/timeout=600 SingleProducerMultipleConsumerLoops * @summary check ordering for blocking queues with 1 producer and multiple consumers */ diff --git a/test/java/util/concurrent/ConcurrentHashMap/MapCheck.java b/test/java/util/concurrent/ConcurrentHashMap/MapCheck.java index 1c77f5bb16679060bc2f5590a0b6e7beeee63557..9a4761943623f350eebe253b7c669f3f366cf7a1 100644 --- a/test/java/util/concurrent/ConcurrentHashMap/MapCheck.java +++ b/test/java/util/concurrent/ConcurrentHashMap/MapCheck.java @@ -34,7 +34,7 @@ /* * @test * @bug 4486658 - * @compile -source 1.5 MapCheck.java + * @compile MapCheck.java * @run main/timeout=240 MapCheck * @summary Times and checks basic map operations */ diff --git a/test/java/util/concurrent/ConcurrentHashMap/MapLoops.java b/test/java/util/concurrent/ConcurrentHashMap/MapLoops.java index e6c310ff157b8515fd8311a573da129fff3f988c..f7aeab10f810feb8aeb60065bd0d23909d41f8c2 100644 --- a/test/java/util/concurrent/ConcurrentHashMap/MapLoops.java +++ b/test/java/util/concurrent/ConcurrentHashMap/MapLoops.java @@ -34,7 +34,7 @@ /* * @test * @bug 4486658 - * @compile -source 1.5 MapLoops.java + * @compile MapLoops.java * @run main/timeout=1600 MapLoops * @summary Exercise multithreaded maps, by default ConcurrentHashMap. * Multithreaded hash table test. Each thread does a random walk diff --git a/test/java/util/concurrent/Exchanger/ExchangeLoops.java b/test/java/util/concurrent/Exchanger/ExchangeLoops.java index 53f987381cc8c53250eef2d79e7c7fa7872d4ff3..43763426a0aa420a1cc5feeba008a1b736b31cf2 100644 --- a/test/java/util/concurrent/Exchanger/ExchangeLoops.java +++ b/test/java/util/concurrent/Exchanger/ExchangeLoops.java @@ -34,7 +34,7 @@ /* * @test * @bug 4486658 - * @compile -source 1.5 ExchangeLoops.java + * @compile ExchangeLoops.java * @run main/timeout=720 ExchangeLoops * @summary checks to make sure a pipeline of exchangers passes data. */ diff --git a/test/java/util/concurrent/ExecutorCompletionService/ExecutorCompletionServiceLoops.java b/test/java/util/concurrent/ExecutorCompletionService/ExecutorCompletionServiceLoops.java index fe713fe0791004197204ef2bc55a3756b39e08e0..35e183395aaea3d48ab581e2f870d13aadce1294 100644 --- a/test/java/util/concurrent/ExecutorCompletionService/ExecutorCompletionServiceLoops.java +++ b/test/java/util/concurrent/ExecutorCompletionService/ExecutorCompletionServiceLoops.java @@ -34,7 +34,7 @@ /* * @test * @bug 4965960 - * @compile -source 1.5 ExecutorCompletionServiceLoops.java + * @compile ExecutorCompletionServiceLoops.java * @run main/timeout=3600 ExecutorCompletionServiceLoops * @summary Exercise ExecutorCompletionServiceLoops */ diff --git a/test/java/util/concurrent/FutureTask/CancelledFutureLoops.java b/test/java/util/concurrent/FutureTask/CancelledFutureLoops.java index a3d1536d11d0deafa06d1a5ee65d598c7051b07e..c05dd0bcda020ec7a98fd04f15b2836d8dc107af 100644 --- a/test/java/util/concurrent/FutureTask/CancelledFutureLoops.java +++ b/test/java/util/concurrent/FutureTask/CancelledFutureLoops.java @@ -34,7 +34,7 @@ /* * @test * @bug 4486658 - * @compile -source 1.5 CancelledFutureLoops.java + * @compile CancelledFutureLoops.java * @run main/timeout=2000 CancelledFutureLoops * @summary Checks for responsiveness of futures to cancellation. * Runs under the assumption that ITERS computations require more than diff --git a/test/java/util/concurrent/atomic/VMSupportsCS8.java b/test/java/util/concurrent/atomic/VMSupportsCS8.java index 42a7587dbe2b46c88a05a3b31fc9af6c59d56ca4..055d0259dc3636a51f75ac83c0eb5d60d6b868fe 100644 --- a/test/java/util/concurrent/atomic/VMSupportsCS8.java +++ b/test/java/util/concurrent/atomic/VMSupportsCS8.java @@ -24,8 +24,6 @@ /* * @test * @bug 4992443 4994819 - * @compile -source 1.5 VMSupportsCS8.java - * @run main VMSupportsCS8 * @summary Checks that the value of VMSupportsCS8 matches system properties. */ diff --git a/test/java/util/concurrent/locks/ReentrantLock/CancelledLockLoops.java b/test/java/util/concurrent/locks/ReentrantLock/CancelledLockLoops.java index fb1c7b5b5caec284828930db36959fd90fe8e81d..fc98478117b61b4f51c9ce60a3d6b0d1e9b7fb7d 100644 --- a/test/java/util/concurrent/locks/ReentrantLock/CancelledLockLoops.java +++ b/test/java/util/concurrent/locks/ReentrantLock/CancelledLockLoops.java @@ -34,7 +34,7 @@ /* * @test * @bug 4486658 - * @compile -source 1.5 CancelledLockLoops.java + * @compile CancelledLockLoops.java * @run main/timeout=2800 CancelledLockLoops * @summary tests lockInterruptibly. * Checks for responsiveness of locks to interrupts. Runs under that diff --git a/test/java/util/concurrent/locks/ReentrantLock/LockOncePerThreadLoops.java b/test/java/util/concurrent/locks/ReentrantLock/LockOncePerThreadLoops.java index 444c55e82f8fe1c2fb09b0af655c5181287214b5..361ea1a372de936fe4f7a8c8c8198d170bb40534 100644 --- a/test/java/util/concurrent/locks/ReentrantLock/LockOncePerThreadLoops.java +++ b/test/java/util/concurrent/locks/ReentrantLock/LockOncePerThreadLoops.java @@ -34,7 +34,7 @@ /* * @test * @bug 4486658 - * @compile -source 1.5 LockOncePerThreadLoops.java + * @compile LockOncePerThreadLoops.java * @run main/timeout=15000 LockOncePerThreadLoops * @summary Checks for missed signals by locking and unlocking each of an array of locks once per thread */ diff --git a/test/java/util/concurrent/locks/ReentrantLock/SimpleReentrantLockLoops.java b/test/java/util/concurrent/locks/ReentrantLock/SimpleReentrantLockLoops.java index ead5c960f15690594bca9bb7d39cc3322b463b10..37641686ef0a8d0a24642e4ddf69a3af018f0ccc 100644 --- a/test/java/util/concurrent/locks/ReentrantLock/SimpleReentrantLockLoops.java +++ b/test/java/util/concurrent/locks/ReentrantLock/SimpleReentrantLockLoops.java @@ -34,7 +34,7 @@ /* * @test * @bug 4486658 - * @compile -source 1.5 SimpleReentrantLockLoops.java + * @compile SimpleReentrantLockLoops.java * @run main/timeout=4500 SimpleReentrantLockLoops * @summary multiple threads using a single lock */ diff --git a/test/java/util/concurrent/locks/ReentrantLock/TimeoutLockLoops.java b/test/java/util/concurrent/locks/ReentrantLock/TimeoutLockLoops.java index d1edcc911d03ace6b9eeba7d7e843e6fa8d307f0..d0df653fb8fe7734a82c4f05dae910542ed6f75b 100644 --- a/test/java/util/concurrent/locks/ReentrantLock/TimeoutLockLoops.java +++ b/test/java/util/concurrent/locks/ReentrantLock/TimeoutLockLoops.java @@ -34,8 +34,6 @@ /* * @test * @bug 4486658 5031862 - * @compile -source 1.5 TimeoutLockLoops.java - * @run main TimeoutLockLoops * @summary Checks for responsiveness of locks to timeouts. * Runs under the assumption that ITERS computations require more than * TIMEOUT msecs to complete, which seems to be a safe assumption for diff --git a/test/java/util/concurrent/locks/ReentrantReadWriteLock/MapLoops.java b/test/java/util/concurrent/locks/ReentrantReadWriteLock/MapLoops.java index a6e710b0b289e52b4d9b75db234d7419e0befbe5..6596ed5a7dc49f610c2c295958b764da87ecbddb 100644 --- a/test/java/util/concurrent/locks/ReentrantReadWriteLock/MapLoops.java +++ b/test/java/util/concurrent/locks/ReentrantReadWriteLock/MapLoops.java @@ -34,7 +34,7 @@ /* * @test * @bug 4486658 - * @compile -source 1.5 MapLoops.java + * @compile MapLoops.java * @run main/timeout=4700 MapLoops * @summary Exercise multithreaded maps, by default ConcurrentHashMap. * Multithreaded hash table test. Each thread does a random walk diff --git a/test/sun/management/AgentCheckTest.java b/test/sun/management/AgentCheckTest.java index 8d3f17edd9a4410d0be22ba80937b2a2b6dd20a1..d480f5b0226db58801750d1761078b5248fd9754 100644 --- a/test/sun/management/AgentCheckTest.java +++ b/test/sun/management/AgentCheckTest.java @@ -27,9 +27,6 @@ * @summary Localize log messages from the management agents * * @author Tim Bell - * - * @run compile -source 1.5 -g AgentCheckTest.java - * @run main AgentCheckTest */ import sun.management.Agent; diff --git a/test/tools/launcher/libraryCaller.java b/test/sun/security/jgss/spnego/NoSpnegoAsDefMech.java similarity index 60% rename from test/tools/launcher/libraryCaller.java rename to test/sun/security/jgss/spnego/NoSpnegoAsDefMech.java index f938a2fce233ce4dfdad84513cb1d0d0849d1437..2f23de385fe1f8f432ddc33f5fbe2540415b6c66 100644 --- a/test/tools/launcher/libraryCaller.java +++ b/test/sun/security/jgss/spnego/NoSpnegoAsDefMech.java @@ -1,5 +1,5 @@ /* - * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * 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 @@ -21,26 +21,23 @@ * have any questions. */ - /* - * - * - * Used by SolarisRunpath.sh to help test if the launcher fully - * respects Solaris LD_LIBRARY_PATH semantics. The ./lib directory is - * structured so that the results of the dynamically linked number - * method varies depending on the value the data model dependent - * LD_LIBRARY_PATH variable. + * @test + * @bug 6770883 + * @summary Infinite loop if SPNEGO specified as sun.security.jgss.mechanism */ +import org.ietf.jgss.*; +import sun.security.jgss.*; +public class NoSpnegoAsDefMech { -class libraryCaller { - static { - System.loadLibrary("library"); - } - static native int number(); - - public static void main(String argv[]) { - System.out.println(number()); + public static void main(String[] argv) throws Exception { + System.setProperty("sun.security.jgss.mechanism", GSSUtil.GSS_SPNEGO_MECH_OID.toString()); + try { + GSSManager.getInstance().createName("service@host", GSSName.NT_HOSTBASED_SERVICE, new Oid("1.3.6.1.5.5.2")); + } catch (GSSException e) { + // This is OK, for example, krb5.conf is missing or other problems + } } } diff --git a/test/sun/security/krb5/auto/Context.java b/test/sun/security/krb5/auto/Context.java index 140623f83103117ee371be9a3f6904800fcc1f47..3187e99d87e2ff87c883086ab39ca8d8cb93bb43 100644 --- a/test/sun/security/krb5/auto/Context.java +++ b/test/sun/security/krb5/auto/Context.java @@ -72,7 +72,7 @@ import com.sun.security.jgss.AuthorizationDataEntry; public class Context { private Subject s; - private GSSContext x; + private ExtendedGSSContext x; private boolean f; // context established? private String name; private GSSCredential cred; // see static method delegated(). @@ -147,8 +147,8 @@ public class Context { @Override public byte[] run(Context me, byte[] dummy) throws Exception { GSSManager m = GSSManager.getInstance(); - me.x = m.createContext( - target.indexOf('@') < 0 ? + me.x = (ExtendedGSSContext)m.createContext( + target.indexOf('@') < 0 ? m.createName(target, null) : m.createName(target, GSSName.NT_HOSTBASED_SERVICE), mech, @@ -170,7 +170,7 @@ public class Context { @Override public byte[] run(Context me, byte[] dummy) throws Exception { GSSManager m = GSSManager.getInstance(); - me.x = m.createContext(m.createCredential( + me.x = (ExtendedGSSContext)m.createContext(m.createCredential( null, GSSCredential.INDEFINITE_LIFETIME, mech, @@ -193,7 +193,7 @@ public class Context { * * @return the GSSContext object */ - public GSSContext x() { + public ExtendedGSSContext x() { return x; } @@ -255,6 +255,11 @@ public class Context { if (x.getSequenceDetState()) { sb.append("seq det, "); } + if (x instanceof ExtendedGSSContext) { + if (((ExtendedGSSContext)x).getDelegPolicyState()) { + sb.append("deleg policy, "); + } + } System.out.println("Context status of " + name + ": " + sb.toString()); System.out.println(x.getSrcName() + " -> " + x.getTargName()); } catch (Exception e) { diff --git a/test/sun/security/krb5/auto/KDC.java b/test/sun/security/krb5/auto/KDC.java index 586d8b23e61d71aad61b70d4a1eb2695ba34baec..169094c779ba8a9421826a5d7db9dc232d31aea4 100644 --- a/test/sun/security/krb5/auto/KDC.java +++ b/test/sun/security/krb5/auto/KDC.java @@ -63,6 +63,14 @@ import sun.security.util.DerValue; * settings after calling a KDC method, call Config.refresh() to * make sure your changes are reflected in the Config object. * + * System properties recognized: + *
    + *
  • test.kdc.save.ccache + *
+ * Support policies: + *
    + *
  • ok-as-delegate + *
* Issues and TODOs: *
    *
  1. Generates krb5.conf to be used on another machine, currently the kdc is @@ -151,7 +159,7 @@ public class KDC { * A standalone KDC server. */ public static void main(String[] args) throws Exception { - KDC kdc = create("RABBIT.HOLE", "kdc.rabbit,hole", 0, false); + KDC kdc = create("RABBIT.HOLE", "kdc.rabbit.hole", 0, false); kdc.addPrincipal("dummy", "bogus".toCharArray()); kdc.addPrincipal("foo", "bar".toCharArray()); kdc.addPrincipalRandKey("krbtgt/RABBIT.HOLE"); @@ -426,14 +434,17 @@ public class KDC { * @throws sun.security.krb5.KrbException when the principal is not inside * the database. */ - private char[] getPassword(PrincipalName p) throws KrbException { + private char[] getPassword(PrincipalName p, boolean server) + throws KrbException { String pn = p.toString(); if (p.getRealmString() == null) { pn = pn + "@" + getRealm(); } char[] pass = passwords.get(pn); if (pass == null) { - throw new KrbException(Krb5.KDC_ERR_C_PRINCIPAL_UNKNOWN); + throw new KrbException(server? + Krb5.KDC_ERR_S_PRINCIPAL_UNKNOWN: + Krb5.KDC_ERR_C_PRINCIPAL_UNKNOWN); } return pass; } @@ -457,10 +468,12 @@ public class KDC { * Returns the key for a given principal of the given encryption type * @param p the principal * @param etype the encryption type + * @param server looking for a server principal? * @return the key * @throws sun.security.krb5.KrbException for unknown/unsupported etype */ - private EncryptionKey keyForUser(PrincipalName p, int etype) throws KrbException { + private EncryptionKey keyForUser(PrincipalName p, int etype, boolean server) + throws KrbException { try { // Do not call EncryptionKey.acquireSecretKeys(), otherwise // the krb5.conf config file would be loaded. @@ -469,22 +482,71 @@ public class KDC { Integer kvno = null; // For service whose password ending with a number, use it as kvno if (p.toString().indexOf('/') >= 0) { - char[] pass = getPassword(p); + char[] pass = getPassword(p, server); if (Character.isDigit(pass[pass.length-1])) { kvno = pass[pass.length-1] - '0'; } } return new EncryptionKey((byte[]) stringToKey.invoke( - null, getPassword(p), getSalt(p), null, etype), + null, getPassword(p, server), getSalt(p), null, etype), etype, kvno); } catch (InvocationTargetException ex) { KrbException ke = (KrbException)ex.getCause(); throw ke; + } catch (KrbException ke) { + throw ke; } catch (Exception e) { throw new RuntimeException(e); // should not happen } } + private Map policies = new HashMap(); + + public void setPolicy(String rule, String value) { + if (value == null) { + policies.remove(rule); + } else { + policies.put(rule, value); + } + } + /** + * If the provided client/server pair matches a rule + * + * A system property named test.kdc.policy.RULE will be consulted. + * If it's unset, returns false. If its value is "", any pair is + * matched. Otherwise, it should contains the server name matched. + * + * TODO: client name is not used currently. + * + * @param c client name + * @param s server name + * @param rule rule name + * @return if a match is found + */ + private boolean configMatch(String c, String s, String rule) { + String policy = policies.get(rule); + boolean result = false; + if (policy == null) { + result = false; + } else if (policy.length() == 0) { + result = true; + } else { + String[] names = policy.split("\\s+"); + for (String name: names) { + if (name.equals(s)) { + result = true; + break; + } + } + } + if (result) { + System.out.printf(">>>> Policy match result (%s vs %s on %s) %b\n", + c, s, rule, result); + } + return result; + } + + /** * Processes an incoming request and generates a response. * @param in the request @@ -530,7 +592,7 @@ public class KDC { tkt = apReq.ticket; etype = tkt.encPart.getEType(); tkt.sname.setRealm(tkt.realm); - EncryptionKey kkey = keyForUser(tkt.sname, etype); + EncryptionKey kkey = keyForUser(tkt.sname, etype, true); byte[] bb = tkt.encPart.decrypt(kkey, KeyUsage.KU_TICKET); DerInputStream derIn = new DerInputStream(bb); DerValue der = derIn.getDerValue(); @@ -541,7 +603,7 @@ public class KDC { throw new KrbException(Krb5.KDC_ERR_PADATA_TYPE_NOSUPP); } } - EncryptionKey skey = keyForUser(body.sname, etype); + EncryptionKey skey = keyForUser(body.sname, etype, true); if (skey == null) { throw new KrbException(Krb5.KDC_ERR_SUMTYPE_NOSUPP); // TODO } @@ -581,6 +643,10 @@ public class KDC { if (body.kdcOptions.get(KDCOptions.ALLOW_POSTDATE)) { bFlags[Krb5.TKT_OPTS_MAY_POSTDATE] = true; } + + if (configMatch("", body.sname.getNameString(), "ok-as-delegate")) { + bFlags[Krb5.TKT_OPTS_DELEGATE] = true; + } bFlags[Krb5.TKT_OPTS_INITIAL] = true; TicketFlags tFlags = new TicketFlags(bFlags); @@ -671,8 +737,8 @@ public class KDC { eTypes = (int[])f.get(body); int eType = eTypes[0]; - EncryptionKey ckey = keyForUser(body.cname, eType); - EncryptionKey skey = keyForUser(body.sname, eType); + EncryptionKey ckey = keyForUser(body.cname, eType, false); + EncryptionKey skey = keyForUser(body.sname, eType, true); if (ckey == null) { throw new KrbException(Krb5.KDC_ERR_ETYPE_NOSUPP); } diff --git a/test/sun/security/krb5/auto/OkAsDelegate.java b/test/sun/security/krb5/auto/OkAsDelegate.java new file mode 100644 index 0000000000000000000000000000000000000000..fee677b536b8a39f603afe93fa5696a35176296f --- /dev/null +++ b/test/sun/security/krb5/auto/OkAsDelegate.java @@ -0,0 +1,104 @@ +/* + * 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. + */ + +import com.sun.security.jgss.ExtendedGSSContext; +import org.ietf.jgss.GSSCredential; +import org.ietf.jgss.GSSException; +import org.ietf.jgss.Oid; +import sun.security.jgss.GSSUtil; +import sun.security.krb5.Config; + +public class OkAsDelegate { + + public static void main(String[] args) + throws Exception { + OkAsDelegate ok = new OkAsDelegate(); + ok.go( + Boolean.valueOf(args[0]), // FORWARDABLE in krb5.conf on? + Boolean.valueOf(args[1]), // requestDelegState + Boolean.valueOf(args[2]), // requestDelegPolicyState + Boolean.valueOf(args[3]), // DelegState in response + Boolean.valueOf(args[4]), // DelegPolicyState in response + Boolean.valueOf(args[5]) // getDelegCred OK? + ); + } + + void go( + boolean forwardable, + boolean requestDelegState, + boolean requestDelegPolicyState, + boolean delegState, + boolean delegPolicyState, + boolean delegated + ) throws Exception { + OneKDC kdc = new OneKDC(null); + kdc.setPolicy("ok-as-delegate", + System.getProperty("test.kdc.policy.ok-as-delegate")); + kdc.writeJAASConf(); + if (!forwardable) { + // The default OneKDC always includes "forwardable = true" + // in krb5.conf, override it. + KDC.saveConfig(OneKDC.KRB5_CONF, kdc, + "default_keytab_name = " + OneKDC.KTAB); + Config.refresh(); + } + + Context c, s; + c = Context.fromJAAS("client"); + s = Context.fromJAAS("server"); + + Oid mech = GSSUtil.GSS_KRB5_MECH_OID; + if (System.getProperty("test.spnego") != null) { + mech = GSSUtil.GSS_SPNEGO_MECH_OID; + } + c.startAsClient(OneKDC.SERVER, mech); + ExtendedGSSContext cx = (ExtendedGSSContext)c.x(); + cx.requestCredDeleg(requestDelegState); + cx.requestDelegPolicy(requestDelegPolicyState); + s.startAsServer(mech); + ExtendedGSSContext sx = (ExtendedGSSContext)s.x(); + + Context.handshake(c, s); + + if (cx.getCredDelegState() != delegState) { + throw new Exception("Initiator cred state error"); + } + if (sx.getCredDelegState() != delegState) { + throw new Exception("Acceptor cred state error"); + } + if (cx.getDelegPolicyState() != delegPolicyState) { + throw new Exception("Initiator cred policy state error"); + } + + GSSCredential cred = null; + try { + cred = s.x().getDelegCred(); + } catch (GSSException e) { + // leave cred as null + } + + if (delegated != (cred != null)) { + throw new Exception("get cred error"); + } + } +} diff --git a/test/sun/security/krb5/auto/OkAsDelegateXRealm.java b/test/sun/security/krb5/auto/OkAsDelegateXRealm.java new file mode 100644 index 0000000000000000000000000000000000000000..54c181fc8f61f93e785e4a7628ec338b5efb0761 --- /dev/null +++ b/test/sun/security/krb5/auto/OkAsDelegateXRealm.java @@ -0,0 +1,156 @@ +/* + * 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. + */ + +import com.sun.security.jgss.ExtendedGSSContext; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.security.Security; +import javax.security.auth.callback.Callback; +import javax.security.auth.callback.CallbackHandler; +import javax.security.auth.callback.NameCallback; +import javax.security.auth.callback.PasswordCallback; +import javax.security.auth.callback.UnsupportedCallbackException; +import org.ietf.jgss.GSSContext; +import org.ietf.jgss.GSSCredential; +import org.ietf.jgss.GSSException; +import org.ietf.jgss.GSSManager; +import org.ietf.jgss.GSSName; +import sun.security.jgss.GSSUtil; +import sun.security.krb5.Config; + +public class OkAsDelegateXRealm implements CallbackHandler { + + /** + * @param args boolean if the program should succeed + */ + public static void main(String[] args) + throws Exception { + + // Create and start the KDCs. Here we have 3 realms: R1, R2 and R3. + // R1 is trusted by R2, and R2 trusted by R3. + KDC kdc1 = KDC.create("R1"); + kdc1.setPolicy("ok-as-delegate", + System.getProperty("test.kdc.policy.ok-as-delegate")); + kdc1.addPrincipal("dummy", "bogus".toCharArray()); + kdc1.addPrincipalRandKey("krbtgt/R1"); + kdc1.addPrincipal("krbtgt/R2@R1", "r1->r2".toCharArray()); + + KDC kdc2 = KDC.create("R2"); + kdc2.setPolicy("ok-as-delegate", + System.getProperty("test.kdc.policy.ok-as-delegate")); + kdc2.addPrincipalRandKey("krbtgt/R2"); + kdc2.addPrincipal("krbtgt/R2@R1", "r1->r2".toCharArray()); + kdc2.addPrincipal("krbtgt/R3@R2", "r2->r3".toCharArray()); + + KDC kdc3 = KDC.create("R3"); + kdc3.setPolicy("ok-as-delegate", + System.getProperty("test.kdc.policy.ok-as-delegate")); + kdc3.addPrincipalRandKey("krbtgt/R3"); + kdc3.addPrincipal("krbtgt/R3@R2", "r2->r3".toCharArray()); + kdc3.addPrincipalRandKey("host/host.r3.local"); + + KDC.saveConfig("krb5-localkdc.conf", kdc1, kdc2, kdc3, + "forwardable=true", + "[capaths]", + "R1 = {", + " R2 = .", + " R3 = R2", + "}", + "[domain_realm]", + ".r3.local=R3" + ); + + System.setProperty("java.security.krb5.conf", "krb5-localkdc.conf"); + kdc3.writeKtab("localkdc.ktab"); + + FileOutputStream fos = new FileOutputStream("jaas-localkdc.conf"); + + // Defines the client and server on R1 and R3 respectively. + fos.write(("com.sun.security.jgss.krb5.initiate {\n" + + " com.sun.security.auth.module.Krb5LoginModule\n" + + " required\n" + + " principal=dummy\n" + + " doNotPrompt=false\n" + + " useTicketCache=false\n" + + " ;\n};\n" + + "com.sun.security.jgss.krb5.accept {\n" + + " com.sun.security.auth.module.Krb5LoginModule required\n" + + " principal=\"host/host.r3.local@R3\"\n" + + " useKeyTab=true\n" + + " keyTab=localkdc.ktab\n" + + " isInitiator=false\n" + + " storeKey=true;\n};\n" + + "\n").getBytes()); + fos.close(); + + Security.setProperty("auth.login.defaultCallbackHandler", + "OkAsDelegateXRealm"); + + System.setProperty("java.security.auth.login.config", "jaas-localkdc.conf"); + + new File("krb5-localkdc.conf").deleteOnExit(); + new File("localkdc.ktab").deleteOnExit(); + new File("jaas-localkdc.conf").deleteOnExit(); + Config.refresh(); + + Context c = Context.fromJAAS("com.sun.security.jgss.krb5.initiate"); + Context s = Context.fromJAAS("com.sun.security.jgss.krb5.accept"); + + // Test twice. The frist time the whole cross realm process is tried, + // the second time the cached service ticket is used. This is to make sure + // the behaviors are the same, especailly for the case when one of the + // cross-realm TGTs does not have OK-AS-DELEGATE on. + + for (int i=0; i<2; i++) { + c.startAsClient("host@host.r3.local", GSSUtil.GSS_KRB5_MECH_OID); + s.startAsServer(GSSUtil.GSS_KRB5_MECH_OID); + c.x().requestDelegPolicy(true); + + Context.handshake(c, s); + boolean succeed = true; + try { + s.x().getDelegCred(); + } catch (GSSException gsse) { + succeed = false; + } + if (succeed != Boolean.parseBoolean(args[0])) { + throw new Exception("Test fail at round #" + i); + } + } + } + + @Override + public void handle(Callback[] callbacks) + throws IOException, UnsupportedCallbackException { + for (Callback callback : callbacks) { + if (callback instanceof NameCallback) { + ((NameCallback) callback).setName("dummy"); + } + if (callback instanceof PasswordCallback) { + ((PasswordCallback) callback).setPassword("bogus".toCharArray()); + } + } + } +} + diff --git a/test/sun/security/krb5/auto/SSL.java b/test/sun/security/krb5/auto/SSL.java index 44a80a60ae92e3020681f50589a3b41140ac80b2..d8e361a00e00cb2f11cf0db794a05c9c297aa8c6 100644 --- a/test/sun/security/krb5/auto/SSL.java +++ b/test/sun/security/krb5/auto/SSL.java @@ -36,33 +36,32 @@ import sun.security.jgss.GSSUtil; public class SSL { private static final String KRB5_CIPHER = "TLS_KRB5_WITH_3DES_EDE_CBC_SHA"; - private static final int PORT = 4569; private static final int LOOP_LIMIT = 1; private static final char[] PASS = "secret".toCharArray(); private static int loopCount = 0; - - private static String SERVER; + private static volatile String server; + private static volatile int port; public static void main(String[] args) throws Exception { KDC kdc = KDC.create(OneKDC.REALM); // Run this after KDC, so our own DNS service can be started try { - SERVER = InetAddress.getLocalHost().getHostName(); + server = InetAddress.getLocalHost().getHostName().toLowerCase(); } catch (java.net.UnknownHostException e) { - SERVER = "localhost"; + server = "localhost"; } kdc.addPrincipal(OneKDC.USER, OneKDC.PASS); kdc.addPrincipalRandKey("krbtgt/" + OneKDC.REALM); - kdc.addPrincipal("host/" + SERVER, PASS); + kdc.addPrincipal("host/" + server, PASS); KDC.saveConfig(OneKDC.KRB5_CONF, kdc); System.setProperty("java.security.krb5.conf", OneKDC.KRB5_CONF); final Context c = Context.fromUserPass(OneKDC.USER, OneKDC.PASS, false); - final Context s = Context.fromUserPass("host/" + SERVER, PASS, true); + final Context s = Context.fromUserPass("host/" + server, PASS, true); - c.startAsClient("host/" + SERVER, GSSUtil.GSS_KRB5_MECH_OID); + c.startAsClient("host/" + server, GSSUtil.GSS_KRB5_MECH_OID); s.startAsServer(GSSUtil.GSS_KRB5_MECH_OID); new Thread(new Runnable() { @@ -87,7 +86,7 @@ public class SSL { public byte[] run(Context s, byte[] input) throws Exception { SSLSocketFactory sslsf = (SSLSocketFactory) SSLSocketFactory.getDefault(); - SSLSocket sslSocket = (SSLSocket) sslsf.createSocket(SERVER, PORT); + SSLSocket sslSocket = (SSLSocket) sslsf.createSocket(server, port); // Enable only a KRB5 cipher suite. String enabledSuites[] = {KRB5_CIPHER}; @@ -124,7 +123,8 @@ public class SSL { SSLServerSocketFactory sslssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); SSLServerSocket sslServerSocket = - (SSLServerSocket) sslssf.createServerSocket(PORT); + (SSLServerSocket) sslssf.createServerSocket(0); // any port + port = sslServerSocket.getLocalPort(); // Enable only a KRB5 cipher suite. String enabledSuites[] = {KRB5_CIPHER}; diff --git a/test/sun/security/krb5/auto/ok-as-delegate-xrealm.sh b/test/sun/security/krb5/auto/ok-as-delegate-xrealm.sh new file mode 100644 index 0000000000000000000000000000000000000000..850dae3e443f7fcb197762c9105b794a08e01515 --- /dev/null +++ b/test/sun/security/krb5/auto/ok-as-delegate-xrealm.sh @@ -0,0 +1,79 @@ +# +# 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 6853328 +# @summary Support OK-AS-DELEGATE flag +# @run shell/timeout=600 ok-as-delegate-xrealm.sh +# + +if [ "${TESTSRC}" = "" ] ; then + TESTSRC=`dirname $0` +fi + +if [ "${TESTJAVA}" = "" ] ; then + JAVAC_CMD=`which javac` + TESTJAVA=`dirname $JAVAC_CMD`/.. +fi + +# set platform-dependent variables +OS=`uname -s` +case "$OS" in + Windows_* ) + FS="\\" + SEP=";" + ;; + CYGWIN* ) + FS="/" + SEP=";" + ;; + * ) + FS="/" + SEP=":" + ;; +esac + +${TESTJAVA}${FS}bin${FS}javac -XDignore.symbol.file -d . \ + ${TESTSRC}${FS}OkAsDelegateXRealm.java \ + ${TESTSRC}${FS}KDC.java \ + ${TESTSRC}${FS}OneKDC.java \ + ${TESTSRC}${FS}Action.java \ + ${TESTSRC}${FS}Context.java \ + || exit 10 + +# Add $TESTSRC to classpath so that customized nameservice can be used +J="${TESTJAVA}${FS}bin${FS}java -cp $TESTSRC${SEP}." + +# KDC no OK-AS-DELEGATE, fail +$J OkAsDelegateXRealm false || exit 1 + +# KDC set OK-AS-DELEGATE for all, succeed +$J -Dtest.kdc.policy.ok-as-delegate OkAsDelegateXRealm true || exit 2 + +# KDC set OK-AS-DELEGATE for host/host.r3.local only, fail +$J -Dtest.kdc.policy.ok-as-delegate=host/host.r3.local OkAsDelegateXRealm false || exit 3 + +# KDC set OK-AS-DELEGATE for all, succeed +$J "-Dtest.kdc.policy.ok-as-delegate=host/host.r3.local krbtgt/R2 krbtgt/R3" OkAsDelegateXRealm true || exit 4 + +exit 0 diff --git a/test/sun/security/krb5/auto/ok-as-delegate.sh b/test/sun/security/krb5/auto/ok-as-delegate.sh new file mode 100644 index 0000000000000000000000000000000000000000..1647e1561f54b61def80b9461654e59c6ba2f783 --- /dev/null +++ b/test/sun/security/krb5/auto/ok-as-delegate.sh @@ -0,0 +1,118 @@ +# +# 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 6853328 +# @summary Support OK-AS-DELEGATE flag +# @run shell/timeout=600 ok-as-delegate.sh +# + +if [ "${TESTSRC}" = "" ] ; then + TESTSRC=`dirname $0` +fi + +if [ "${TESTJAVA}" = "" ] ; then + JAVAC_CMD=`which javac` + TESTJAVA=`dirname $JAVAC_CMD`/.. +fi + +# set platform-dependent variables +OS=`uname -s` +case "$OS" in + Windows_* ) + FS="\\" + SEP=";" + ;; + CYGWIN* ) + FS="/" + SEP=";" + ;; + * ) + FS="/" + SEP=":" + ;; +esac + +${TESTJAVA}${FS}bin${FS}javac -XDignore.symbol.file -d . \ + ${TESTSRC}${FS}OkAsDelegate.java \ + ${TESTSRC}${FS}KDC.java \ + ${TESTSRC}${FS}OneKDC.java \ + ${TESTSRC}${FS}Action.java \ + ${TESTSRC}${FS}Context.java \ + || exit 10 + +# Testing Kerberos 5 + +# Add $TESTSRC to classpath so that customized nameservice can be used +J="${TESTJAVA}${FS}bin${FS}java -cp $TESTSRC${SEP}. OkAsDelegate" +JOK="${TESTJAVA}${FS}bin${FS}java -cp $TESTSRC${SEP}. -Dtest.kdc.policy.ok-as-delegate OkAsDelegate" + +# FORWARDABLE ticket not allowed, always fail +$J false true true false false false || exit 1 + +# Service ticket no OK-AS-DELEGATE + +# Request nothing, gain nothing +$J true false false false false false || exit 2 +# Request deleg policy, gain nothing +$J true false true false false false || exit 3 +# Request deleg, granted +$J true true false true false true || exit 4 +# Request deleg and deleg policy, granted, with info not by policy +$J true true true true false true || exit 5 + +# Service ticket has OK-AS-DELEGATE + +# Request deleg policy, granted +$JOK true false true true true true || exit 6 +# Request deleg and deleg policy, granted, with info by policy +$JOK true true true true true true || exit 7 + +# Testing SPNEGO + +# Add $TESTSRC to classpath so that customized nameservice can be used +J="${TESTJAVA}${FS}bin${FS}java -cp $TESTSRC${SEP}. -Dtest.spnego OkAsDelegate" +JOK="${TESTJAVA}${FS}bin${FS}java -cp $TESTSRC${SEP}. -Dtest.spnego -Dtest.kdc.policy.ok-as-delegate OkAsDelegate" + +# FORWARDABLE ticket not allowed, always fail +$J false true true false false false || exit 11 + +# Service ticket no OK-AS-DELEGATE + +# Request nothing, gain nothing +$J true false false false false false || exit 12 +# Request deleg policy, gain nothing +$J true false true false false false || exit 13 +# Request deleg, granted +$J true true false true false true || exit 14 +# Request deleg and deleg policy, granted, with info not by policy +$J true true true true false true || exit 15 + +# Service ticket has OK-AS-DELEGATE + +# Request deleg policy, granted +$JOK true false true true true true || exit 16 +# Request deleg and deleg policy, granted, with info by policy +$JOK true true true true true true || exit 17 + +exit 0 diff --git a/test/sun/security/util/Oid/S11N.sh b/test/sun/security/util/Oid/S11N.sh index 77341e8a91bb60fafb76f5aa4cd6c67b428a0840..081cd52298fc315e08e358b5c4994fc456b9c3d2 100644 --- a/test/sun/security/util/Oid/S11N.sh +++ b/test/sun/security/util/Oid/S11N.sh @@ -99,7 +99,7 @@ esac # the test code -${TESTJAVA}${FS}bin${FS}javac -source 1.3 -target 1.3 -d . ${TESTSRC}${FS}SerialTest.java || exit 10 +${TESTJAVA}${FS}bin${FS}javac -d . ${TESTSRC}${FS}SerialTest.java || exit 10 OLDJAVA=" /java/re/j2se/1.6.0/latest/binaries/${PF} diff --git a/test/sun/tools/jconsole/ResourceCheckTest.sh b/test/sun/tools/jconsole/ResourceCheckTest.sh index d2a34bb2a89cbafc11dd6b5f38d4efef674b12db..a5d211d5141bf359e37e462de4cf28021fc12c4a 100644 --- a/test/sun/tools/jconsole/ResourceCheckTest.sh +++ b/test/sun/tools/jconsole/ResourceCheckTest.sh @@ -98,7 +98,7 @@ env set -vx # #Compile. jconsole.jar is required on the classpath. -${TESTJAVA}/bin/javac -source 1.5 -d "${TESTCLASSES}" ${CP} -g \ +${TESTJAVA}/bin/javac -d "${TESTCLASSES}" ${CP} -g \ "${TESTSRC}"/"${TARGETCLASS}".java # #Run the test class, again with the classpath we need: diff --git a/test/sun/tools/jhat/HatRun.java b/test/sun/tools/jhat/HatRun.java index cac66e57d8c2c67b023410ff8c4d7cf05dc7cce0..cb1e41b248ec5903ce921060f6e3217f6be0b85d 100644 --- a/test/sun/tools/jhat/HatRun.java +++ b/test/sun/tools/jhat/HatRun.java @@ -186,11 +186,13 @@ public class HatRun { */ int nvm_options = 0; if ( vm_options != null ) nvm_options = vm_options.length; - String cmd[] = new String[1 + (d64?1:0) + 5 + nvm_options]; + String cmd[] = new String[1 + (d64?1:0) + 7 + nvm_options]; int i,j; i = 0; cmd[i++] = java; + cmd[i++] = "-cp"; + cmd[i++] = cdir; cmd[i++] = "-Dtest.classes=" + cdir; if ( d64 ) { cmd[i++] = "-d64"; diff --git a/test/sun/tools/native2ascii/NativeErrors.java b/test/sun/tools/native2ascii/NativeErrors.java index 460a9f158cf12f6448e15c3da40f3c8842a5fe1d..c0fbad160e07e5ab196724831508fd74d1b7950d 100644 --- a/test/sun/tools/native2ascii/NativeErrors.java +++ b/test/sun/tools/native2ascii/NativeErrors.java @@ -59,15 +59,28 @@ public class NativeErrors { in = new BufferedReader(new InputStreamReader(p.getInputStream())); checkResult(in, "err.bad.arg"); - command = getComString("test123"); + File f0 = new File(System.getProperty("test.src", "."), "test123"); + String path0 = f0.getPath(); + if ( f0.exists() ) { + throw new Error("Input file should not exist: " + path0); + } + + command = getComString(path0); p = Runtime.getRuntime().exec(command); in = new BufferedReader(new InputStreamReader(p.getInputStream())); checkResult(in, "err.cannot.read"); File f1 = new File(System.getProperty("test.src", "."), "test1"); - File f2 = new File(System.getProperty("test.src", "."), "test2"); + File f2 = File.createTempFile("test2", ".tmp"); String path1 = f1.getPath(); String path2 = f2.getPath(); + if ( !f1.exists() ) { + throw new Error("Missing input file: " + path1); + } + if ( !f2.setWritable(false) ) { + throw new Error("Output file cannot be made read only: " + path2); + } + f2.deleteOnExit(); command = getComString(path1, path2); p = Runtime.getRuntime().exec(command); @@ -80,7 +93,9 @@ public class NativeErrors { throws Exception { String errorReceived; errorReceived = in.readLine(); + assert errorReceived != null : "First readline cannot be null"; errorExpected = rsrc.getString(errorExpected); + assert errorExpected != null : "Expected message cannot be null"; StringBuffer error = new StringBuffer(errorExpected); int start = errorExpected.indexOf("{0}"); if (start >= 0) { @@ -128,6 +143,7 @@ public class NativeErrors { f = new File(path); if (!f.exists()) throw new RuntimeException("Cannot find native2ascii at "+path); + System.out.println("Using native2ascii at "+path); } return path; } diff --git a/test/sun/tools/native2ascii/test2 b/test/sun/tools/native2ascii/test2 deleted file mode 100644 index 9a669e9ced5f3476d59c5e1b331c77155bc162e0..0000000000000000000000000000000000000000 --- a/test/sun/tools/native2ascii/test2 +++ /dev/null @@ -1 +0,0 @@ -This file exists as a non-writable placeholder for NativeErrors.java diff --git a/test/tools/launcher/Arrrghs.java b/test/tools/launcher/Arrrghs.java index 4853b90516624ea19d4ef20ecde3b558fbc3f86f..b7ba2737dfa2aba2126e3a19b2c8245d1f7888e1 100644 --- a/test/tools/launcher/Arrrghs.java +++ b/test/tools/launcher/Arrrghs.java @@ -25,7 +25,7 @@ * @test * @bug 5030233 6214916 6356475 6571029 6684582 6742159 4459600 6758881 * @summary Argument parsing validation. - * @compile Arrrghs.java TestHelper.java + * @compile -XDignore.symbol.file Arrrghs.java TestHelper.java * @run main Arrrghs */ diff --git a/test/tools/launcher/ExecutionEnvironment.java b/test/tools/launcher/ExecutionEnvironment.java new file mode 100644 index 0000000000000000000000000000000000000000..217de4670e0ea6765de946522fc98b66ce6dc605 --- /dev/null +++ b/test/tools/launcher/ExecutionEnvironment.java @@ -0,0 +1,358 @@ +/* + * 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 4780570 4731671 6354700 6367077 6670965 4882974 + * @summary Checks for LD_LIBRARY_PATH and execution on *nixes + * @compile -XDignore.symbol.file ExecutionEnvironment.java TestHelper.java + * @run main ExecutionEnvironment + */ + +/* + * This test tests for various things as follows: + * Ensures that: + * 1. uneccessary execs do not occur + * 2. the environment is pristine, users environment variable wrt. + * LD_LIBRARY_PATH if set are not modified in any way. + * 3. the correct vm is chosen with -server and -client options + * 4. the VM on Solaris correctly interprets the LD_LIBRARY_PATH32 + * and LD_LIBRARY_PATH64 variables if set by the user, ie. + * i. on 32 bit systems: + * a. if LD_LIBRARY_PATH32 is set it will override LD_LIBRARY_PATH + * b. LD_LIBRARY_PATH64 is ignored if set + * ii. on 64 bit systems: + * a. if LD_LIBRARY_PATH64 is set it will override LD_LIBRARY_PATH + * b. LD_LIBRARY_PATH32 is ignored if set + * 5. no extra symlink exists on Solaris ie. + * jre/lib/$arch/libjvm.so -> client/libjvm.so + * TODO: + * a. perhaps we need to add a test to audit all environment variables are + * in pristine condition after the launch, there may be a few that the + * launcher may add as implementation details. + * b. add a pldd for solaris to ensure only one libjvm.so is linked + */ +import java.io.File; +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +public class ExecutionEnvironment { + static final String LD_LIBRARY_PATH = "LD_LIBRARY_PATH"; + static final String LD_LIBRARY_PATH_32 = LD_LIBRARY_PATH + "_32"; + static final String LD_LIBRARY_PATH_64 = LD_LIBRARY_PATH + "_64"; + + // Note: these paths need not exist on the filesytem + static final String LD_LIBRARY_PATH_VALUE = "/Bridge/On/The/River/Kwai"; + static final String LD_LIBRARY_PATH_32_VALUE = "/Lawrence/Of/Arabia"; + static final String LD_LIBRARY_PATH_64_VALUE = "/A/Passage/To/India"; + + static final String JLDEBUG_KEY = "_JAVA_LAUNCHER_DEBUG"; + static final String EXPECTED_MARKER = "TRACER_MARKER:About to EXEC"; + + static final String[] LD_PATH_STRINGS = { + LD_LIBRARY_PATH + "=" + LD_LIBRARY_PATH_VALUE, + LD_LIBRARY_PATH_32 + "=" + LD_LIBRARY_PATH_32_VALUE, + LD_LIBRARY_PATH_64 + "=" + LD_LIBRARY_PATH_64_VALUE + }; + + static final File testJarFile = new File("EcoFriendly.jar"); + + static int errors = 0; + static int passes = 0; + + private static void createTestJar() { + try { + List codeList = new ArrayList(); + codeList.add("static void printValue(String name, boolean property) {\n"); + codeList.add(" String value = (property) ? System.getProperty(name) : System.getenv(name);\n"); + codeList.add(" System.out.println(name + \"=\" + value);\n"); + codeList.add("}\n"); + codeList.add("public static void main(String... args) {\n"); + codeList.add(" System.out.println(\"Execute test:\");\n"); + codeList.add(" printValue(\"os.name\", true);\n"); + codeList.add(" printValue(\"os.arch\", true);\n"); + codeList.add(" printValue(\"os.version\", true);\n"); + codeList.add(" printValue(\"sun.arch.data.model\", true);\n"); + codeList.add(" printValue(\"java.library.path\", true);\n"); + codeList.add(" printValue(\"" + LD_LIBRARY_PATH + "\", false);\n"); + codeList.add(" printValue(\"" + LD_LIBRARY_PATH_32 + "\", false);\n"); + codeList.add(" printValue(\"" + LD_LIBRARY_PATH_64 + "\", false);\n"); + codeList.add("}\n"); + String[] clist = new String[codeList.size()]; + TestHelper.createJar(testJarFile, codeList.toArray(clist)); + } catch (FileNotFoundException fnfe) { + throw new RuntimeException(fnfe); + } + } + + /* + * tests if the launcher pollutes the LD_LIBRARY_PATH variables ie. there + * should not be any new variables or pollution/mutations of any kind, the + * environment should be pristine. + */ + private static void ensureEcoFriendly() { + TestHelper.TestResult tr = null; + + Map env = new HashMap(); + for (String x : LD_PATH_STRINGS) { + String pairs[] = x.split("="); + env.put(pairs[0], pairs[1]); + } + + tr = TestHelper.doExec(env, TestHelper.javaCmd, "-jar", + testJarFile.getAbsolutePath()); + + if (!tr.isNotZeroOutput()) { + throw new RuntimeException("Error: No output at all. Did the test execute ?"); + } + + for (String x : LD_PATH_STRINGS) { + if (!tr.contains(x)) { + System.out.println("FAIL: did not get <" + x + ">"); + System.out.println(tr); + errors++; + } else { + passes++; + } + } + } + + /* + * ensures that there are no execs as long as we are in the same + * data model + */ + static void ensureNoExec() { + Map env = new HashMap(); + env.put(JLDEBUG_KEY, "true"); + TestHelper.TestResult tr = + TestHelper.doExec(env, TestHelper.javaCmd, "-version"); + if (tr.testOutput.contains(EXPECTED_MARKER)) { + System.out.println("FAIL: EnsureNoExecs: found expected warning <" + + EXPECTED_MARKER + + "> the process execing ?"); + errors++; + } else { + passes++; + } + return; + } + + /* + * This test ensures that LD_LIBRARY_PATH* values are interpreted by the VM + * and the expected java.library.path behaviour. + * For Generic platforms (All *nixes): + * * All LD_LIBRARY_PATH variable should be on java.library.path + * For Solaris 32-bit + * * The LD_LIBRARY_PATH_32 should override LD_LIBRARY_PATH if specified + * For Solaris 64-bit + * * The LD_LIBRARY_PATH_64 should override LD_LIBRARY_PATH if specified + */ + + static void verifyJavaLibraryPath() { + TestHelper.TestResult tr = null; + + Map env = new HashMap(); + + + if (TestHelper.isLinux) { + for (String x : LD_PATH_STRINGS) { + String pairs[] = x.split("="); + env.put(pairs[0], pairs[1]); + } + + tr = TestHelper.doExec(env, TestHelper.javaCmd, "-jar", + testJarFile.getAbsolutePath()); + verifyJavaLibraryPathGeneric(tr); + } else { + // no override + env.clear(); + env.put(LD_LIBRARY_PATH, LD_LIBRARY_PATH_VALUE); + tr = TestHelper.doExec(env, TestHelper.javaCmd, "-jar", + testJarFile.getAbsolutePath()); + verifyJavaLibraryPathGeneric(tr); + + env.clear(); + for (String x : LD_PATH_STRINGS) { + String pairs[] = x.split("="); + env.put(pairs[0], pairs[1]); + } + + // verify the override occurs, since we know the invocation always + // uses by default is 32-bit, therefore we also set the test + // expectation to be the same. + tr = TestHelper.doExec(env, TestHelper.javaCmd, "-jar", + testJarFile.getAbsolutePath()); + verifyJavaLibraryPathOverride(tr, true); + + // try changing the model from 32 to 64 bit + if (TestHelper.java64Cmd != null && TestHelper.is32Bit) { + // verify the override occurs + env.clear(); + for (String x : LD_PATH_STRINGS) { + String pairs[] = x.split("="); + env.put(pairs[0], pairs[1]); + } + tr = TestHelper.doExec(env, TestHelper.javaCmd, "-d64", "-jar", + testJarFile.getAbsolutePath()); + verifyJavaLibraryPathOverride(tr, false); + + // no override + env.clear(); + env.put(LD_LIBRARY_PATH, LD_LIBRARY_PATH_VALUE); + tr = TestHelper.doExec(env, TestHelper.javaCmd, "-jar", + testJarFile.getAbsolutePath()); + verifyJavaLibraryPathGeneric(tr); + } + + // try changing the model from 64 to 32 bit + if (TestHelper.java64Cmd != null && TestHelper.is64Bit) { + // verify the override occurs + env.clear(); + for (String x : LD_PATH_STRINGS) { + String pairs[] = x.split("="); + env.put(pairs[0], pairs[1]); + } + tr = TestHelper.doExec(env, TestHelper.java64Cmd, "-d32", "-jar", + testJarFile.getAbsolutePath()); + verifyJavaLibraryPathOverride(tr, true); + + // no override + env.clear(); + env.put(LD_LIBRARY_PATH, LD_LIBRARY_PATH_VALUE); + tr = TestHelper.doExec(env, TestHelper.java64Cmd, "-d32", "-jar", + testJarFile.getAbsolutePath()); + verifyJavaLibraryPathGeneric(tr); + } + } + } + + private static void verifyJavaLibraryPathGeneric(TestHelper.TestResult tr) { + if (!tr.matches("java.library.path=.*" + LD_LIBRARY_PATH_VALUE + ".*")) { + System.out.print("FAIL: verifyJavaLibraryPath: "); + System.out.println(" java.library.path does not contain " + + LD_LIBRARY_PATH_VALUE); + System.out.println(tr); + errors++; + } else { + passes++; + } + } + + private static void verifyJavaLibraryPathOverride(TestHelper.TestResult tr, + boolean is32Bit) { + // make sure the 32/64 bit value exists + if (!tr.matches("java.library.path=.*" + + (is32Bit ? LD_LIBRARY_PATH_32_VALUE : LD_LIBRARY_PATH_64_VALUE) + ".*")) { + System.out.print("FAIL: verifyJavaLibraryPathOverride: "); + System.out.println(" java.library.path does not contain " + + (is32Bit ? LD_LIBRARY_PATH_32_VALUE : LD_LIBRARY_PATH_64_VALUE)); + System.out.println(tr); + errors++; + } else { + passes++; + } + // make sure the generic value is absent + if (tr.matches("java.library.path=.*" + LD_LIBRARY_PATH_VALUE + ".*")) { + System.out.print("FAIL: verifyJavaLibraryPathOverride: "); + System.out.println(" java.library.path contains " + + LD_LIBRARY_PATH_VALUE); + System.out.println(tr); + errors++; + } else { + passes++; + } + } + + /* + * ensures we have indeed exec'ed the correct vm of choice, all VMs support + * -server, however 32-bit VMs support -client and -server. + */ + static void verifyVmSelection() { + + TestHelper.TestResult tr = null; + + if (TestHelper.is32Bit) { + tr = TestHelper.doExec(TestHelper.javaCmd, "-client", "-version"); + if (!tr.matches("Java.*Client VM.*")) { + System.out.println("FAIL: the expected vm -client did launch"); + System.out.println(tr); + errors++; + } else { + passes++; + } + } + tr = TestHelper.doExec(TestHelper.javaCmd, "-server", "-version"); + if (!tr.matches("Java.*Server VM.*")) { + System.out.println("FAIL: the expected vm -server did launch"); + System.out.println(tr); + errors++; + } else { + passes++; + } + } + + /* + * checks to see there is no extra libjvm.so than needed + */ + static void verifyNoSymLink() { + if (TestHelper.is64Bit) { + return; + } + + File symLink = null; + String libPathPrefix = TestHelper.isSDK ? "jre/lib" : "/lib"; + symLink = new File(TestHelper.JAVAHOME, libPathPrefix + + TestHelper.getJreArch() + "/libjvm.so"); + if (symLink.exists()) { + System.out.println("FAIL: The symlink exists " + + symLink.getAbsolutePath()); + errors++; + } else { + passes++; + } + } + + public static void main(String... args) throws Exception { + if (TestHelper.isWindows) { + System.out.println("Warning: noop on windows"); + return; + } + // create our test jar first + createTestJar(); + ensureNoExec(); + verifyVmSelection(); + ensureEcoFriendly(); + verifyJavaLibraryPath(); + verifyNoSymLink(); + if (errors > 0) { + throw new Exception("ExecutionEnvironment: FAIL: with " + + errors + " errors and passes " + passes ); + } else { + System.out.println("ExecutionEnvironment: PASS " + passes); + } + } +} diff --git a/test/tools/launcher/SolarisDataModel.sh b/test/tools/launcher/SolarisDataModel.sh deleted file mode 100644 index 36398d7fe3913f7fe5f650591aa5f8aeee1a262c..0000000000000000000000000000000000000000 --- a/test/tools/launcher/SolarisDataModel.sh +++ /dev/null @@ -1,219 +0,0 @@ -# Copyright 2007 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 4780570 -# @run shell SolarisDataModel.sh -# @summary Verify Solaris SPARC -d32 and -d64 options work with preset LD_LIBRARY_PATH -# @author Joseph D. Darcy - -# Test to see if presetting LD_LIBRARY_PATH affects the treatment of -# -d32 and -d64 options; also checks that -d options result in the -# desired data model. - -# If the test is not being run on a Solaris SPARC box SPARC the test -# succeeds immediately. - -OS=`uname -s`; - -case "$OS" in - SunOS ) - # ARCH should be sparc or i386 - ARCH=`uname -p` - case "$ARCH" in - sparc) - PATHSEP=":" - ;; - - * ) - echo "Non-SPARC Solaris environment; test vacuously succeeds." - exit 0 - esac - ;; - - * ) - echo "Not a Solaris SPARC environment; test vacuously succeeds." - exit 0; - ;; -esac - - -# Verify directory context variables are set -if [ "${TESTJAVA}" = "" ] -then - echo "TESTJAVA not set. Test cannot execute. Failed." - exit 1 -fi - -if [ "${TESTSRC}" = "" ] -then - echo "TESTSRC not set. Test cannot execute. Failed." - exit 1 -fi - - -if [ "${TESTCLASSES}" = "" ] -then - echo "TESTCLASSES not set. Test cannot execute. Failed." - exit 1 -fi - - -JAVAC="$TESTJAVA/bin/javac" - -# Create our little Java tests on the fly -( printf "public class GetDataModel {" - printf " public static void main(String argv[]) {" - printf " System.out.println(System.getProperty(\"sun.arch.data.model\", \"none\"));" - printf " }" - printf "}" -) > GetDataModel.java - -$JAVAC GetDataModel.java - -( printf "public class GetLdLibraryPath {" - printf " public static void main(String argv[]) {" - printf " System.out.println(System.getProperty(\"java.library.path\"));" - printf " }" - printf "}" -) > GetLdLibraryPath.java - -$JAVAC GetLdLibraryPath.java - - - -# All preconditions are met; run the tests - - -# Construct path to 32-bit Java executable -JAVA="$TESTJAVA/bin/java -classpath $TESTCLASSES${PATHSEP}." - - -# Construct path to 64-bit Java executable, might not exist -JAVA64="$TESTJAVA/bin/sparcv9/java -classpath $TESTCLASSES${PATHSEP}." -JAVA64FILE="$TESTJAVA/bin/sparcv9/java" - - -# java -d32 tests - -LD_LIBRARY_PATH="" -export LD_LIBRARY_PATH - -DM=`$JAVA -d32 GetDataModel` -case "$DM" in - 32 ) - ;; - - * ) - echo "The combination \"java -d32\" failed." - echo $DM - exit 1 -esac - -# Rerun test with LD_LIBRARY_PATH preset -LD_LIBRARY_PATH=`$JAVA GetLdLibraryPath`; -DM=`$JAVA -d32 GetDataModel` -case "$DM" in - 32 ) - ;; - - * ) - echo "The combination \"java -d32\" failed with preset LD_LIBRARY_PATH." - echo $DM - exit 1 -esac - -# Reset LD_LIBRARY_PATH -LD_LIBRARY_PATH= - - -# Test for 64-bit executable - -if [ -f $JAVA64FILE ]; then - - DM=`$JAVA -d64 GetDataModel` - case "$DM" in - 64 ) - ;; - - * ) - echo "The combination \"java -d64\" failed." - exit 1 - esac - - DM=`$JAVA64 -d32 GetDataModel` - case "$DM" in - 32 ) - ;; - - * ) - echo "The combination \"sparcv9/java -d32\" failed." - exit 1 - esac - - DM=`$JAVA64 -d64 GetDataModel` - case "$DM" in - 64 ) - ;; - - * ) - echo "The combination \"sparcv9/java -d64\" failed." - exit 1 - esac - - # Rerun tests with LD_LIBRARY_PATH preset - LD_LIBRARY_PATH=`$JAVA GetLdLibraryPath`; - echo "Presetting LD_LIBRARY_PATH" - - DM=`$JAVA -d64 GetDataModel` - case "$DM" in - 64 ) - ;; - - * ) - echo "The combination \"java -d64\" failed with preset LD_LIBRARY_PATH." - exit 1 - esac - - DM=`$JAVA64 -d32 GetDataModel` - case "$DM" in - 32 ) - ;; - - * ) - echo "The combination \"sparcv9/java -d32\" failed with preset LD_LIBRARY_PATH." - exit 1 - esac - - DM=`$JAVA64 -d64 GetDataModel` - case "$DM" in - 64 ) - ;; - - * ) - echo "The combination \"sparcv9/java -d64\" failed with preset LD_LIBRARY_PATH." - exit 1 - esac - -else - echo "Warning: no 64-bit components found; only java -d32 tests have been run." -fi -exit 0; diff --git a/test/tools/launcher/SolarisRunpath.sh b/test/tools/launcher/SolarisRunpath.sh deleted file mode 100644 index 26dd964f6548709bc267b13977865ceebfd722f4..0000000000000000000000000000000000000000 --- a/test/tools/launcher/SolarisRunpath.sh +++ /dev/null @@ -1,221 +0,0 @@ -# Copyright 2007 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 4731671 -# @build libraryCaller -# @run shell SolarisRunpath.sh -# @summary Verify that Solaris LD_LIBRARY_PATH rules are followed -# @author Joseph D. Darcy - -# The launcher has been updated to properly take account of Solaris -# LD_LIBRARY_PATH rules when constructing the runpath for the Java -# executable. That is, data model dependent LD_LIBRARY_PATH variables -# are tested for and override LD_LIBRARY_PATH if present. The current -# launcher design relies on LD_LIBRARY_PATH settings to ensure the -# proper jre/jdk libraries are opening during program execution. In -# the future, this dependence might be removed by having the vm -# explicitly dlopen the needed files. If that change occurs, this -# test will be harmless but no long relevant. - -# A more robust test for Solaris SPARC would set the different -# LD_LIBRARY_PATH variables while also varying the -d[32|64] options -# to make sure the LD_LIBRARY_PATH of the *target* data model were -# being respected. That is "java -d64" should use the 64-bit -# LD_LIBRARY_PATH while "java -d32" should use the 32-bit -# LD_LIBRARY_PATH regardless of the data model of the "java" binary. -# However, by default builds do not contain both 32 and 64 bit -# components so such a test would often not be applicable. - - -# If the test is not being run on a Solaris box, SPARC or x86, the -# test succeeds immediately. - -OS=`uname -s`; - -case "$OS" in - SunOS ) - PATHSEP=":" - ;; - - * ) - echo "Not a Solaris environment; test vacuously succeeds." - exit 0; - ;; -esac - -# Verify directory context variables are set -if [ "${TESTJAVA}" = "" ] -then - echo "TESTJAVA not set. Test cannot execute. Failed." - exit 1 -fi - -if [ "${TESTSRC}" = "" ] -then - echo "TESTSRC not set. Test cannot execute. Failed." - exit 1 -fi - - -if [ "${TESTCLASSES}" = "" ] -then - echo "TESTCLASSES not set. Test cannot execute. Failed." - exit 1 -fi - -# Construct paths to default Java executables -JAVAC="$TESTJAVA/bin/javac" - - -# Create our little Java test on the fly -( printf "public class GetDataModel {" - printf " public static void main(String argv[]) {" - printf " System.out.println(System.getProperty(\"sun.arch.data.model\", \"none\"));" - printf " }" - printf "}" -) > GetDataModel.java - -$JAVAC GetDataModel.java - - -# ARCH should be sparc or i386 -ARCH=`uname -p` -case "$ARCH" in - sparc | i386 ) - ;; - - * ) - echo "Unrecognized architecture; test fails." - exit 1 -esac - -# The following construction may not work as desired in a -# 64-bit build. -JAVA="$TESTJAVA/bin/java -classpath $TESTCLASSES${PATHSEP}." - -# Determine data model -DM=`$JAVA GetDataModel` - -# verify DM is 32 or 64 -case "$DM" in - 32 ) - ODM=64; - ;; - - 64 ) - ODM=32; - ;; - - * ) - echo "Unknown data model \"$DM\"; test fails." - exit 1 -esac - -# -------------------- Test 1 -------------------- - -LD_LIBRARY_PATH=$TESTSRC/lib/$ARCH/lib$DM -export LD_LIBRARY_PATH -unset LD_LIBRARY_PATH_32 -unset LD_LIBRARY_PATH_64 - -# With plain LD_LIBRARY_PATH, result should always be 0 -RESULT=`$JAVA libraryCaller` -if [ "${RESULT}" != "0" ]; -then - echo "Not using LD_LIBRARY_PATH; test fails." - exit 1 -fi - -# The following two tests sets both data model dependent -# LD_LIBRARY_PATH variables individually. - -# -------------------- Test 2 -------------------- - -# Set opposite data model variable; should return same result -# as plain LD_LIBRARY_PATH. - -if [ "${DM}" = "32" ]; then - LD_LIBRARY_PATH_64=$TESTSRC/lib/$ARCH/lib$DM/lib$DM - export LD_LIBRARY_PATH_64 -else - LD_LIBRARY_PATH_32=$TESTSRC/lib/$ARCH/lib$DM/lib$DM - export LD_LIBRARY_PATH_32 -fi - -RESULT=`$JAVA libraryCaller` -if [ "${RESULT}" != "0" ]; -then - echo "Using LD_LIBRARY_PATH_$ODM for $DM binary;" - echo "test fails." - exit 1 -fi - -unset LD_LIBRARY_PATH_32 -unset LD_LIBRARY_PATH_64 - -# -------------------- Test 3 -------------------- - -# Set appropriate data model variable; result should match -# data model. -if [ "${DM}" = "32" ]; then - LD_LIBRARY_PATH_32=$TESTSRC/lib/$ARCH/lib$DM/lib$DM - export LD_LIBRARY_PATH_32 -else - LD_LIBRARY_PATH_64=$TESTSRC/lib/$ARCH/lib$DM/lib$DM - export LD_LIBRARY_PATH_64 -fi - -RESULT=`$JAVA libraryCaller` -if [ "${RESULT}" != "$DM" ]; -then - echo "Data model dependent LD_LIBRARY_PATH_$DM" - echo "not overriding LD_LIBRARY_PATH; test fails." - exit 1 -fi - -unset LD_LIBRARY_PATH -unset LD_LIBRARY_PATH_32 -unset LD_LIBRARY_PATH_64 - -# -------------------- Test 4 -------------------- - -# Have only data model dependent LD_LIBRARY_PATH set; result -# should match data model. - -if [ "${DM}" = "32" ]; then - LD_LIBRARY_PATH_32=$TESTSRC/lib/$ARCH/lib$DM/lib$DM - export LD_LIBRARY_PATH_32 -else - LD_LIBRARY_PATH_64=$TESTSRC/lib/$ARCH/lib$DM/lib$DM - export LD_LIBRARY_PATH_64 -fi - -RESULT=`$JAVA libraryCaller` -if [ "${RESULT}" != "$DM" ]; -then - echo "Not using data-model dependent LD_LIBRARY_PATH; test fails." - exit 1 -fi - -# All tests have passed -exit 0 diff --git a/test/tools/launcher/TestHelper.java b/test/tools/launcher/TestHelper.java index fb63114b6d582864263766e257506e0b139fcdf3..da7b084dfd7c48e02d9e635ed125e63a391dd6a3 100644 --- a/test/tools/launcher/TestHelper.java +++ b/test/tools/launcher/TestHelper.java @@ -39,18 +39,36 @@ import javax.tools.JavaCompiler; */ public enum TestHelper { INSTANCE; - static final String JAVAHOME = System.getProperty("java.home", "."); + static final String JAVAHOME = System.getProperty("java.home"); static final boolean isSDK = JAVAHOME.endsWith("jre"); static final String javaCmd; + static final String java64Cmd; static final String javacCmd; static final JavaCompiler compiler; - static final boolean debug = Boolean.getBoolean("Arrrghs.Debug"); + static final boolean debug = Boolean.getBoolean("TestHelper.Debug"); static final boolean isWindows = System.getProperty("os.name", "unknown").startsWith("Windows"); + static final boolean is64Bit = + System.getProperty("sun.arch.data.model").equals("64"); + static final boolean is32Bit = + System.getProperty("sun.arch.data.model").equals("32"); + static final boolean isSolaris = + System.getProperty("os.name", "unknown").startsWith("SunOS"); + static final boolean isLinux = + System.getProperty("os.name", "unknown").startsWith("Linux"); + static final boolean isDualMode = isSolaris; + static final boolean isSparc = System.getProperty("os.arch").startsWith("sparc"); + static int testExitValue = 0; static { + if (is64Bit && is32Bit) { + throw new RuntimeException("arch model cannot be both 32 and 64 bit"); + } + if (!is64Bit && !is32Bit) { + throw new RuntimeException("arch model is not 32 or 64 bit ?"); + } compiler = ToolProvider.getSystemJavaCompiler(); File binDir = (isSDK) ? new File((new File(JAVAHOME)).getParentFile(), "bin") : new File(JAVAHOME, "bin"); @@ -69,6 +87,33 @@ public enum TestHelper { if (!javacCmdFile.canExecute()) { throw new RuntimeException("java <" + javacCmd + "> must exist"); } + if (isSolaris) { + File sparc64BinDir = new File(binDir,isSparc ? "sparcv9" : "amd64"); + File java64CmdFile= new File(sparc64BinDir, "java"); + if (java64CmdFile.exists() && java64CmdFile.canExecute()) { + java64Cmd = java64CmdFile.getAbsolutePath(); + } else { + java64Cmd = null; + } + } else { + java64Cmd = null; + } + } + + /* + * usually the jre/lib/arch-name is the same as os.arch, except for x86. + */ + static String getJreArch() { + String arch = System.getProperty("os.arch"); + return arch.equals("x86") ? "i386" : arch; + } + + /* + * A convenience method to create a jar with jar file name and defs + */ + static void createJar(File jarName, String... mainDefs) + throws FileNotFoundException{ + createJar(null, jarName, new File("Foo"), mainDefs); } /* @@ -123,16 +168,23 @@ public enum TestHelper { } } + static TestResult doExec(String...cmds) { + return doExec(null, cmds); + } + /* * A method which executes a java cmd and returns the results in a container */ - static TestResult doExec(String...cmds) { + static TestResult doExec(Map envToSet, String...cmds) { String cmdStr = ""; for (String x : cmds) { cmdStr = cmdStr.concat(x + " "); } ProcessBuilder pb = new ProcessBuilder(cmds); Map env = pb.environment(); + if (envToSet != null) { + env.putAll(envToSet); + } BufferedReader rdr = null; try { List outputList = new ArrayList(); @@ -163,21 +215,25 @@ public enum TestHelper { List testOutput; public TestResult(String str, int rv, List oList) { - status = new StringBuilder(str); + status = new StringBuilder("Executed command: " + str + "\n"); exitValue = rv; testOutput = oList; } + void appendStatus(String x) { + status = status.append(" " + x + "\n"); + } + void checkNegative() { if (exitValue == 0) { - status = status.append(" Error: test must not return 0 exit value"); + appendStatus("Error: test must not return 0 exit value"); testExitValue++; } } void checkPositive() { if (exitValue != 0) { - status = status.append(" Error: test did not return 0 exit value"); + appendStatus("Error: test did not return 0 exit value"); testExitValue++; } } @@ -188,7 +244,7 @@ public enum TestHelper { boolean isZeroOutput() { if (!testOutput.isEmpty()) { - status = status.append(" Error: No message from cmd please"); + appendStatus("Error: No message from cmd please"); testExitValue++; return false; } @@ -197,19 +253,20 @@ public enum TestHelper { boolean isNotZeroOutput() { if (testOutput.isEmpty()) { - status = status.append(" Error: Missing message"); + appendStatus("Error: Missing message"); testExitValue++; return false; } return true; } + @Override public String toString() { - if (debug) { - for (String x : testOutput) { - status = status.append(x + "\n"); - } + status = status.append("++++Test Output Begin++++\n"); + for (String x : testOutput) { + appendStatus(x); } + status = status.append("++++Test Output End++++\n"); return status.toString(); } @@ -219,7 +276,18 @@ public enum TestHelper { return true; } } - status = status.append(" Error: string <" + str + "> not found "); + appendStatus("Error: string <" + str + "> not found"); + testExitValue++; + return false; + } + + boolean matches(String stringToMatch) { + for (String x : testOutput) { + if (x.matches(stringToMatch)) { + return true; + } + } + appendStatus("Error: string <" + stringToMatch + "> not found"); testExitValue++; return false; } diff --git a/test/tools/launcher/libraryCaller.c b/test/tools/launcher/libraryCaller.c deleted file mode 100644 index e77f402b799f86e02d2b65146f4c7f04a4e9c6a8..0000000000000000000000000000000000000000 --- a/test/tools/launcher/libraryCaller.c +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2007 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. - */ - -/* - * - * - * Indictly used by SolarisRunpath.sh; this file is used to generate - * the shared objects: - * - * ./lib/sparc/lib32/liblibrary.so - * ./lib/sparc/lib32/lib32/liblibrary.so - * - * ./lib/sparc/lib64/liblibrary.so - * ./lib/sparc/lib64/lib64/liblibrary.so - * - * ./lib/i386/lib32/liblibrary.so - * ./lib/i386/lib32/lib32/liblibrary.so - * - * The function defined below returns either 0 or the size of an - * integer in the data model used to compile the file (32 for ILP; 64 - * for LP). The libraries in ./lib/$ARCH/lib$DM return 0; those in - * ./lib/$ARCH/lib$DM/lib$DM return 32 or 64. - */ - - -#include -#include "libraryCaller.h" - -#ifndef RETURN_VALUE -#define RETURN_VALUE 0 -#endif - -JNIEXPORT jint JNICALL Java_libraryCaller_number -(JNIEnv *je, jclass jc) { - return RETURN_VALUE; -} diff --git a/test/tools/launcher/libraryCaller.h b/test/tools/launcher/libraryCaller.h deleted file mode 100644 index df2ce33f8b665934012580356ceeb8142b1c793f..0000000000000000000000000000000000000000 --- a/test/tools/launcher/libraryCaller.h +++ /dev/null @@ -1,46 +0,0 @@ - -/* - * Copyright 2007 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. - */ - -/* DO NOT EDIT THIS FILE - it is machine generated */ - -#include -/* Header for class libraryCaller */ - -#ifndef _Included_libraryCaller -#define _Included_libraryCaller -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: libraryCaller - * Method: number - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_libraryCaller_number - (JNIEnv *, jclass); - -#ifdef __cplusplus -} -#endif -#endif