# HG changeset patch # User lana # Date 1298327638 28800 # Node ID ce70b4ff64236a0ef750ad0c57da373cdf9767ab # Parent 0d231bdb78cf727e816c9328192c92406285de38# Parent 889f6ae1f0c90d183845e4fbc70fc7d62a9d8948 Merge diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/make/java/security/Makefile --- a/jdk/make/java/security/Makefile Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/make/java/security/Makefile Mon Feb 21 14:33:58 2011 -0800 @@ -1,5 +1,5 @@ # -# Copyright (c) 1996, 2010 Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1996, 2011 Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -65,6 +65,8 @@ ifndef OPENJDK BLACKLIST_SRC = $(CLOSED_SHARE_SRC)/lib/security/blacklist BLACKLIST_BUILD = $(LIBDIR)/security/blacklist + TRUSTEDLIBS_SRC = $(CLOSED_SHARE_SRC)/lib/security/trusted.libraries + TRUSTEDLIBS_BUILD = $(LIBDIR)/security/trusted.libraries endif FILES_class = $(FILES_java:%.java=$(CLASSBINDIR)/%.class) @@ -77,7 +79,7 @@ ifdef OPENJDK build: properties policy cacerts else -build: properties policy cacerts blacklist +build: properties policy cacerts blacklist trustedlibs endif install: all @@ -90,6 +92,8 @@ blacklist: classes $(BLACKLIST_BUILD) +trustedlibs: classes $(TRUSTEDLIBS_BUILD) + $(PROPS_BUILD): $(PROPS_SRC) $(install-file) @@ -102,9 +106,12 @@ $(BLACKLIST_BUILD): $(BLACKLIST_SRC) $(install-file) +$(TRUSTEDLIBS_BUILD): $(TRUSTEDLIBS_SRC) + $(install-file) + clean clobber:: .delete.classlist $(RM) -r $(CLASSBINDIR)/java/security - $(RM) $(PROPS_BUILD) $(POLICY_BUILD) $(CACERTS_BUILD) $(BLACKLIST_BUILD) + $(RM) $(PROPS_BUILD) $(POLICY_BUILD) $(CACERTS_BUILD) $(BLACKLIST_BUILD) $(TRUSTEDLIBS_BUILD) # Additional Rule for building sun.security.util $(CLASSBINDIR)/%.class: $(SHARE_SRC)/sun/%.java diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/src/share/classes/java/io/Console.java --- a/jdk/src/share/classes/java/io/Console.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/src/share/classes/java/io/Console.java Mon Feb 21 14:33:58 2011 -0800 @@ -308,17 +308,29 @@ char[] passwd = null; synchronized (writeLock) { synchronized(readLock) { - if (fmt.length() != 0) - pw.format(fmt, args); try { echoOff = echo(false); + } catch (IOException x) { + throw new IOError(x); + } + IOError ioe = null; + try { + if (fmt.length() != 0) + pw.format(fmt, args); passwd = readline(true); } catch (IOException x) { - throw new IOError(x); + ioe = new IOError(x); } finally { try { echoOff = echo(true); - } catch (IOException xx) {} + } catch (IOException x) { + if (ioe == null) + ioe = new IOError(x); + else + ioe.addSuppressed(x); + } + if (ioe != null) + throw ioe; } pw.println(); } diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/src/share/classes/java/lang/System.java --- a/jdk/src/share/classes/java/lang/System.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/src/share/classes/java/lang/System.java Mon Feb 21 14:33:58 2011 -0800 @@ -1102,6 +1102,18 @@ * Initialize the system class. Called after thread initialization. */ private static void initializeSystemClass() { + + // VM might invoke JNU_NewStringPlatform() to set those encoding + // sensitive properties (user.home, user.name, boot.class.path, etc.) + // during "props" initialization, in which it may need access, via + // System.getProperty(), to the related system encoding property that + // have been initialized (put into "props") at early stage of the + // initialization. So make sure the "props" is available at the + // very beginning of the initialization and all system properties to + // be put into it directly. + props = new Properties(); + initProperties(props); // initialized by the VM + // There are certain system configurations that may be controlled by // VM options such as the maximum amount of direct memory and // Integer cache size used to support the object identity semantics @@ -1112,7 +1124,12 @@ // // See java.lang.Integer.IntegerCache and the // sun.misc.VM.saveAndRemoveProperties method for example. - props = initSystemProperties(); + // + // Save a private copy of the system properties object that + // can only be accessed by the internal implementation. Remove + // certain system properties that are not intended for public access. + sun.misc.VM.saveAndRemoveProperties(props); + lineSeparator = props.getProperty("line.separator"); sun.misc.Version.init(); @@ -1123,7 +1140,6 @@ setIn0(new BufferedInputStream(fdIn)); setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true)); setErr0(new PrintStream(new BufferedOutputStream(fdErr, 128), true)); - // Load the zip library now in order to keep java.util.zip.ZipFile // from trying to use itself to load this library later. loadLibrary("zip"); @@ -1151,18 +1167,6 @@ setJavaLangAccess(); } - private static Properties initSystemProperties() { - Properties props = new Properties(); - initProperties(props); // initialized by the VM - - // Save a private copy of the system properties object that - // can only be accessed by the internal implementation. Remove - // certain system properties that are not intended for public access. - sun.misc.VM.saveAndRemoveProperties(props); - - return props; - } - private static void setJavaLangAccess() { // Allow privileged classes outside of java.lang sun.misc.SharedSecrets.setJavaLangAccess(new sun.misc.JavaLangAccess(){ diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/src/share/classes/java/lang/Thread.java --- a/jdk/src/share/classes/java/lang/Thread.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/src/share/classes/java/lang/Thread.java Mon Feb 21 14:33:58 2011 -0800 @@ -254,12 +254,6 @@ */ public final static int MAX_PRIORITY = 10; - /* If stop was called before start */ - private boolean stopBeforeStart; - - /* Remembered Throwable from stop before start */ - private Throwable throwableFromStop; - /** * Returns a reference to the currently executing thread object. * @@ -706,10 +700,6 @@ it will be passed up the call stack */ } } - - if (stopBeforeStart) { - stop0(throwableFromStop); - } } private native void start0(); @@ -820,12 +810,7 @@ */ @Deprecated public final void stop() { - // If the thread is already dead, return. - // A zero status value corresponds to "NEW". - if ((threadStatus != 0) && !isAlive()) { - return; - } - stop1(new ThreadDeath()); + stop(new ThreadDeath()); } /** @@ -879,36 +864,25 @@ */ @Deprecated public final synchronized void stop(Throwable obj) { - stop1(obj); - } + if (obj == null) + throw new NullPointerException(); - /** - * Common impl for stop() and stop(Throwable). - */ - private final synchronized void stop1(Throwable th) { SecurityManager security = System.getSecurityManager(); if (security != null) { checkAccess(); if ((this != Thread.currentThread()) || - (!(th instanceof ThreadDeath))) { + (!(obj instanceof ThreadDeath))) { security.checkPermission(SecurityConstants.STOP_THREAD_PERMISSION); } } - // A zero status value corresponds to "NEW" + // A zero status value corresponds to "NEW", it can't change to + // not-NEW because we hold the lock. if (threadStatus != 0) { resume(); // Wake up thread if it was suspended; no-op otherwise - stop0(th); - } else { + } - // Must do the null arg check that the VM would do with stop0 - if (th == null) { - throw new NullPointerException(); - } - - // Remember this stop attempt for if/when start is used - stopBeforeStart = true; - throwableFromStop = th; - } + // The VM can handle all thread states + stop0(obj); } /** diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/src/share/classes/java/util/Hashtable.java --- a/jdk/src/share/classes/java/util/Hashtable.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/src/share/classes/java/util/Hashtable.java Mon Feb 21 14:33:58 2011 -0800 @@ -845,24 +845,36 @@ * for each key-value mapping represented by the Hashtable * The key-value mappings are emitted in no particular order. */ - private synchronized void writeObject(java.io.ObjectOutputStream s) - throws IOException - { - // Write out the length, threshold, loadfactor - s.defaultWriteObject(); + private void writeObject(java.io.ObjectOutputStream s) + throws IOException { + Entry entryStack = null; + + synchronized (this) { + // Write out the length, threshold, loadfactor + s.defaultWriteObject(); + + // Write out length, count of elements + s.writeInt(table.length); + s.writeInt(count); - // Write out length, count of elements and then the key/value objects - s.writeInt(table.length); - s.writeInt(count); - for (int index = table.length-1; index >= 0; index--) { - Entry entry = table[index]; + // Stack copies of the entries in the table + for (int index = 0; index < table.length; index++) { + Entry entry = table[index]; - while (entry != null) { - s.writeObject(entry.key); - s.writeObject(entry.value); - entry = entry.next; + while (entry != null) { + entryStack = + new Entry<>(0, entry.key, entry.value, entryStack); + entry = entry.next; + } } } + + // Write out the key/value objects from the stacked entries + while (entryStack != null) { + s.writeObject(entryStack.key); + s.writeObject(entryStack.value); + entryStack = entryStack.next; + } } /** diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/src/share/classes/java/util/Vector.java --- a/jdk/src/share/classes/java/util/Vector.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/src/share/classes/java/util/Vector.java Mon Feb 21 14:33:58 2011 -0800 @@ -1050,13 +1050,21 @@ /** * Save the state of the {@code Vector} instance to a stream (that - * is, serialize it). This method is present merely for synchronization. - * It just calls the default writeObject method. + * is, serialize it). + * This method performs synchronization to ensure the consistency + * of the serialized data. */ - private synchronized void writeObject(java.io.ObjectOutputStream s) - throws java.io.IOException - { - s.defaultWriteObject(); + private void writeObject(java.io.ObjectOutputStream s) + throws java.io.IOException { + final java.io.ObjectOutputStream.PutField fields = s.putFields(); + final Object[] data; + synchronized (this) { + fields.put("capacityIncrement", capacityIncrement); + fields.put("elementCount", elementCount); + data = elementData.clone(); + } + fields.put("elementData", data); + s.writeFields(); } /** diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/src/share/classes/java/util/jar/JarFile.java --- a/jdk/src/share/classes/java/util/jar/JarFile.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/src/share/classes/java/util/jar/JarFile.java Mon Feb 21 14:33:58 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,11 +27,13 @@ import java.io.*; import java.lang.ref.SoftReference; +import java.net.URL; import java.util.*; import java.util.zip.*; import java.security.CodeSigner; import java.security.cert.Certificate; import java.security.AccessController; +import java.security.CodeSource; import sun.security.action.GetPropertyAction; import sun.security.util.ManifestEntryVerifier; import sun.misc.SharedSecrets; @@ -262,7 +264,7 @@ throw new RuntimeException(e); } if (certs == null && jv != null) { - certs = jv.getCerts(getName()); + certs = jv.getCerts(JarFile.this, this); } return certs == null ? null : certs.clone(); } @@ -273,7 +275,7 @@ throw new RuntimeException(e); } if (signers == null && jv != null) { - signers = jv.getCodeSigners(getName()); + signers = jv.getCodeSigners(JarFile.this, this); } return signers == null ? null : signers.clone(); } @@ -544,4 +546,191 @@ } return false; } + + private synchronized void ensureInitialization() { + try { + maybeInstantiateVerifier(); + } catch (IOException e) { + throw new RuntimeException(e); + } + if (jv != null && !jvInitialized) { + initializeVerifier(); + jvInitialized = true; + } + } + + JarEntry newEntry(ZipEntry ze) { + return new JarFileEntry(ze); + } + + Enumeration entryNames(CodeSource[] cs) { + ensureInitialization(); + if (jv != null) { + return jv.entryNames(this, cs); + } + + /* + * JAR file has no signed content. Is there a non-signing + * code source? + */ + boolean includeUnsigned = false; + for (int i = 0; i < cs.length; i++) { + if (cs[i].getCodeSigners() == null) { + includeUnsigned = true; + break; + } + } + if (includeUnsigned) { + return unsignedEntryNames(); + } else { + return new Enumeration() { + + public boolean hasMoreElements() { + return false; + } + + public String nextElement() { + throw new NoSuchElementException(); + } + }; + } + } + + /** + * Returns an enumeration of the zip file entries + * excluding internal JAR mechanism entries and including + * signed entries missing from the ZIP directory. + */ + Enumeration entries2() { + ensureInitialization(); + if (jv != null) { + return jv.entries2(this, super.entries()); + } + + // screen out entries which are never signed + final Enumeration enum_ = super.entries(); + return new Enumeration() { + + ZipEntry entry; + + public boolean hasMoreElements() { + if (entry != null) { + return true; + } + while (enum_.hasMoreElements()) { + ZipEntry ze = (ZipEntry) enum_.nextElement(); + if (JarVerifier.isSigningRelated(ze.getName())) { + continue; + } + entry = ze; + return true; + } + return false; + } + + public JarFileEntry nextElement() { + if (hasMoreElements()) { + ZipEntry ze = entry; + entry = null; + return new JarFileEntry(ze); + } + throw new NoSuchElementException(); + } + }; + } + + CodeSource[] getCodeSources(URL url) { + ensureInitialization(); + if (jv != null) { + return jv.getCodeSources(this, url); + } + + /* + * JAR file has no signed content. Is there a non-signing + * code source? + */ + Enumeration unsigned = unsignedEntryNames(); + if (unsigned.hasMoreElements()) { + return new CodeSource[]{JarVerifier.getUnsignedCS(url)}; + } else { + return null; + } + } + + private Enumeration unsignedEntryNames() { + final Enumeration entries = entries(); + return new Enumeration() { + + String name; + + /* + * Grab entries from ZIP directory but screen out + * metadata. + */ + public boolean hasMoreElements() { + if (name != null) { + return true; + } + while (entries.hasMoreElements()) { + String value; + ZipEntry e = (ZipEntry) entries.nextElement(); + value = e.getName(); + if (e.isDirectory() || JarVerifier.isSigningRelated(value)) { + continue; + } + name = value; + return true; + } + return false; + } + + public String nextElement() { + if (hasMoreElements()) { + String value = name; + name = null; + return value; + } + throw new NoSuchElementException(); + } + }; + } + + CodeSource getCodeSource(URL url, String name) { + ensureInitialization(); + if (jv != null) { + if (jv.eagerValidation) { + CodeSource cs = null; + JarEntry je = getJarEntry(name); + if (je != null) { + cs = jv.getCodeSource(url, this, je); + } else { + cs = jv.getCodeSource(url, name); + } + return cs; + } else { + return jv.getCodeSource(url, name); + } + } + + return JarVerifier.getUnsignedCS(url); + } + + void setEagerValidation(boolean eager) { + try { + maybeInstantiateVerifier(); + } catch (IOException e) { + throw new RuntimeException(e); + } + if (jv != null) { + jv.setEagerValidation(eager); + } + } + + List getManifestDigests() { + ensureInitialization(); + if (jv != null) { + return jv.getManifestDigests(); + } + return new ArrayList(); + } } diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/src/share/classes/java/util/jar/JarVerifier.java --- a/jdk/src/share/classes/java/util/jar/JarVerifier.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/src/share/classes/java/util/jar/JarVerifier.java Mon Feb 21 14:33:58 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,9 +26,11 @@ package java.util.jar; import java.io.*; +import java.net.URL; import java.util.*; import java.security.*; import java.security.cert.CertificateException; +import java.util.zip.ZipEntry; import sun.security.util.ManifestDigester; import sun.security.util.ManifestEntryVerifier; @@ -81,6 +83,15 @@ /** the bytes for the manDig object */ byte manifestRawBytes[] = null; + /** controls eager signature validation */ + boolean eagerValidation; + + /** makes code source singleton instances unique to us */ + private Object csdomain = new Object(); + + /** collect -DIGEST-MANIFEST values for blacklist */ + private List manifestDigests; + public JarVerifier(byte rawBytes[]) { manifestRawBytes = rawBytes; sigFileSigners = new Hashtable(); @@ -88,6 +99,7 @@ sigFileData = new Hashtable(11); pendingBlocks = new ArrayList(); baos = new ByteArrayOutputStream(); + manifestDigests = new ArrayList(); } /** @@ -247,7 +259,7 @@ } sfv.setSignatureFile(bytes); - sfv.process(sigFileSigners); + sfv.process(sigFileSigners, manifestDigests); } } return; @@ -290,7 +302,7 @@ sfv.setSignatureFile(bytes); } } - sfv.process(sigFileSigners); + sfv.process(sigFileSigners, manifestDigests); } catch (IOException ioe) { // e.g. sun.security.pkcs.ParsingException @@ -312,12 +324,18 @@ /** * Return an array of java.security.cert.Certificate objects for * the given file in the jar. + * @deprecated */ public java.security.cert.Certificate[] getCerts(String name) { return mapSignersToCertArray(getCodeSigners(name)); } + public java.security.cert.Certificate[] getCerts(JarFile jar, JarEntry entry) + { + return mapSignersToCertArray(getCodeSigners(jar, entry)); + } + /** * return an array of CodeSigner objects for * the given file in the jar. this array is not cloned. @@ -328,6 +346,28 @@ return (CodeSigner[])verifiedSigners.get(name); } + public CodeSigner[] getCodeSigners(JarFile jar, JarEntry entry) + { + String name = entry.getName(); + if (eagerValidation && sigFileSigners.get(name) != null) { + /* + * Force a read of the entry data to generate the + * verification hash. + */ + try { + InputStream s = jar.getInputStream(entry); + byte[] buffer = new byte[1024]; + int n = buffer.length; + while (n != -1) { + n = s.read(buffer, 0, buffer.length); + } + s.close(); + } catch (IOException e) { + } + } + return getCodeSigners(name); + } + /* * Convert an array of signers into an array of concatenated certificate * arrays. @@ -444,4 +484,393 @@ } } + + // Extended JavaUtilJarAccess CodeSource API Support + + private Map urlToCodeSourceMap = new HashMap(); + private Map signerToCodeSource = new HashMap(); + private URL lastURL; + private Map lastURLMap; + + /* + * Create a unique mapping from codeSigner cache entries to CodeSource. + * In theory, multiple URLs origins could map to a single locally cached + * and shared JAR file although in practice there will be a single URL in use. + */ + private synchronized CodeSource mapSignersToCodeSource(URL url, CodeSigner[] signers) { + Map map; + if (url == lastURL) { + map = lastURLMap; + } else { + map = (Map) urlToCodeSourceMap.get(url); + if (map == null) { + map = new HashMap(); + urlToCodeSourceMap.put(url, map); + } + lastURLMap = map; + lastURL = url; + } + CodeSource cs = (CodeSource) map.get(signers); + if (cs == null) { + cs = new VerifierCodeSource(csdomain, url, signers); + signerToCodeSource.put(signers, cs); + } + return cs; + } + + private CodeSource[] mapSignersToCodeSources(URL url, List signers, boolean unsigned) { + List sources = new ArrayList(); + + for (int i = 0; i < signers.size(); i++) { + sources.add(mapSignersToCodeSource(url, (CodeSigner[]) signers.get(i))); + } + if (unsigned) { + sources.add(mapSignersToCodeSource(url, null)); + } + return (CodeSource[]) sources.toArray(new CodeSource[sources.size()]); + } + private CodeSigner[] emptySigner = new CodeSigner[0]; + + /* + * Match CodeSource to a CodeSigner[] in the signer cache. + */ + private CodeSigner[] findMatchingSigners(CodeSource cs) { + if (cs instanceof VerifierCodeSource) { + VerifierCodeSource vcs = (VerifierCodeSource) cs; + if (vcs.isSameDomain(csdomain)) { + return ((VerifierCodeSource) cs).getPrivateSigners(); + } + } + + /* + * In practice signers should always be optimized above + * but this handles a CodeSource of any type, just in case. + */ + CodeSource[] sources = mapSignersToCodeSources(cs.getLocation(), getJarCodeSigners(), true); + List sourceList = new ArrayList(); + for (int i = 0; i < sources.length; i++) { + sourceList.add(sources[i]); + } + int j = sourceList.indexOf(cs); + if (j != -1) { + CodeSigner[] match; + match = ((VerifierCodeSource) sourceList.get(j)).getPrivateSigners(); + if (match == null) { + match = emptySigner; + } + return match; + } + return null; + } + + /* + * Instances of this class hold uncopied references to internal + * signing data that can be compared by object reference identity. + */ + private static class VerifierCodeSource extends CodeSource { + + URL vlocation; + CodeSigner[] vsigners; + java.security.cert.Certificate[] vcerts; + Object csdomain; + + VerifierCodeSource(Object csdomain, URL location, CodeSigner[] signers) { + super(location, signers); + this.csdomain = csdomain; + vlocation = location; + vsigners = signers; // from signerCache + } + + VerifierCodeSource(Object csdomain, URL location, java.security.cert.Certificate[] certs) { + super(location, certs); + this.csdomain = csdomain; + vlocation = location; + vcerts = certs; // from signerCache + } + + /* + * All VerifierCodeSource instances are constructed based on + * singleton signerCache or signerCacheCert entries for each unique signer. + * No CodeSigner<->Certificate[] conversion is required. + * We use these assumptions to optimize equality comparisons. + */ + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + if (obj instanceof VerifierCodeSource) { + VerifierCodeSource that = (VerifierCodeSource) obj; + + /* + * Only compare against other per-signer singletons constructed + * on behalf of the same JarFile instance. Otherwise, compare + * things the slower way. + */ + if (isSameDomain(that.csdomain)) { + if (that.vsigners != this.vsigners + || that.vcerts != this.vcerts) { + return false; + } + if (that.vlocation != null) { + return that.vlocation.equals(this.vlocation); + } else if (this.vlocation != null) { + return this.vlocation.equals(that.vlocation); + } else { // both null + return true; + } + } + } + return super.equals(obj); + } + + boolean isSameDomain(Object csdomain) { + return this.csdomain == csdomain; + } + + private CodeSigner[] getPrivateSigners() { + return vsigners; + } + + private java.security.cert.Certificate[] getPrivateCertificates() { + return vcerts; + } + } + private Map signerMap; + + private synchronized Map signerMap() { + if (signerMap == null) { + /* + * Snapshot signer state so it doesn't change on us. We care + * only about the asserted signatures. Verification of + * signature validity happens via the JarEntry apis. + */ + signerMap = new HashMap(verifiedSigners.size() + sigFileSigners.size()); + signerMap.putAll(verifiedSigners); + signerMap.putAll(sigFileSigners); + } + return signerMap; + } + + public synchronized Enumeration entryNames(JarFile jar, final CodeSource[] cs) { + final Map map = signerMap(); + final Iterator itor = map.entrySet().iterator(); + boolean matchUnsigned = false; + + /* + * Grab a single copy of the CodeSigner arrays. Check + * to see if we can optimize CodeSigner equality test. + */ + List req = new ArrayList(cs.length); + for (int i = 0; i < cs.length; i++) { + CodeSigner[] match = findMatchingSigners(cs[i]); + if (match != null) { + if (match.length > 0) { + req.add(match); + } else { + matchUnsigned = true; + } + } + } + + final List signersReq = req; + final Enumeration enum2 = (matchUnsigned) ? unsignedEntryNames(jar) : emptyEnumeration; + + return new Enumeration() { + + String name; + + public boolean hasMoreElements() { + if (name != null) { + return true; + } + + while (itor.hasNext()) { + Map.Entry e = (Map.Entry) itor.next(); + if (signersReq.contains((CodeSigner[]) e.getValue())) { + name = (String) e.getKey(); + return true; + } + } + while (enum2.hasMoreElements()) { + name = (String) enum2.nextElement(); + return true; + } + return false; + } + + public String nextElement() { + if (hasMoreElements()) { + String value = name; + name = null; + return value; + } + throw new NoSuchElementException(); + } + }; + } + + /* + * Like entries() but screens out internal JAR mechanism entries + * and includes signed entries with no ZIP data. + */ + public Enumeration entries2(final JarFile jar, Enumeration e) { + final Map map = new HashMap(); + map.putAll(signerMap()); + final Enumeration enum_ = e; + return new Enumeration() { + + Enumeration signers = null; + JarEntry entry; + + public boolean hasMoreElements() { + if (entry != null) { + return true; + } + while (enum_.hasMoreElements()) { + ZipEntry ze = (ZipEntry) enum_.nextElement(); + if (JarVerifier.isSigningRelated(ze.getName())) { + continue; + } + entry = jar.newEntry(ze); + return true; + } + if (signers == null) { + signers = Collections.enumeration(map.keySet()); + } + while (signers.hasMoreElements()) { + String name = (String) signers.nextElement(); + entry = jar.newEntry(new ZipEntry(name)); + return true; + } + + // Any map entries left? + return false; + } + + public JarEntry nextElement() { + if (hasMoreElements()) { + JarEntry je = entry; + map.remove(je.getName()); + entry = null; + return je; + } + throw new NoSuchElementException(); + } + }; + } + private Enumeration emptyEnumeration = new Enumeration() { + + public boolean hasMoreElements() { + return false; + } + + public String nextElement() { + throw new NoSuchElementException(); + } + }; + + // true if file is part of the signature mechanism itself + static boolean isSigningRelated(String name) { + name = name.toUpperCase(Locale.ENGLISH); + if (!name.startsWith("META-INF/")) { + return false; + } + name = name.substring(9); + if (name.indexOf('/') != -1) { + return false; + } + if (name.endsWith(".DSA") + || name.endsWith(".RSA") + || name.endsWith(".SF") + || name.endsWith(".EC") + || name.startsWith("SIG-") + || name.equals("MANIFEST.MF")) { + return true; + } + return false; + } + + private Enumeration unsignedEntryNames(JarFile jar) { + final Map map = signerMap(); + final Enumeration entries = jar.entries(); + return new Enumeration() { + + String name; + + /* + * Grab entries from ZIP directory but screen out + * metadata. + */ + public boolean hasMoreElements() { + if (name != null) { + return true; + } + while (entries.hasMoreElements()) { + String value; + ZipEntry e = (ZipEntry) entries.nextElement(); + value = e.getName(); + if (e.isDirectory() || isSigningRelated(value)) { + continue; + } + if (map.get(value) == null) { + name = value; + return true; + } + } + return false; + } + + public String nextElement() { + if (hasMoreElements()) { + String value = name; + name = null; + return value; + } + throw new NoSuchElementException(); + } + }; + } + private List jarCodeSigners; + + private synchronized List getJarCodeSigners() { + CodeSigner[] signers; + if (jarCodeSigners == null) { + HashSet set = new HashSet(); + set.addAll(signerMap().values()); + jarCodeSigners = new ArrayList(); + jarCodeSigners.addAll(set); + } + return jarCodeSigners; + } + + public synchronized CodeSource[] getCodeSources(JarFile jar, URL url) { + boolean hasUnsigned = unsignedEntryNames(jar).hasMoreElements(); + + return mapSignersToCodeSources(url, getJarCodeSigners(), hasUnsigned); + } + + public CodeSource getCodeSource(URL url, String name) { + CodeSigner[] signers; + + signers = (CodeSigner[]) signerMap().get(name); + return mapSignersToCodeSource(url, signers); + } + + public CodeSource getCodeSource(URL url, JarFile jar, JarEntry je) { + CodeSigner[] signers; + + return mapSignersToCodeSource(url, getCodeSigners(jar, je)); + } + + public void setEagerValidation(boolean eager) { + eagerValidation = eager; + } + + public synchronized List getManifestDigests() { + return Collections.unmodifiableList(manifestDigests); + } + + static CodeSource getUnsignedCS(URL url) { + return new VerifierCodeSource(null, url, (java.security.cert.Certificate[]) null); + } } diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/src/share/classes/java/util/jar/JavaUtilJarAccessImpl.java --- a/jdk/src/share/classes/java/util/jar/JavaUtilJarAccessImpl.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/src/share/classes/java/util/jar/JavaUtilJarAccessImpl.java Mon Feb 21 14:33:58 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,10 +26,38 @@ package java.util.jar; import java.io.IOException; +import java.net.URL; +import java.security.CodeSource; +import java.util.Enumeration; +import java.util.List; import sun.misc.JavaUtilJarAccess; class JavaUtilJarAccessImpl implements JavaUtilJarAccess { public boolean jarFileHasClassPathAttribute(JarFile jar) throws IOException { return jar.hasClassPathAttribute(); } + + public CodeSource[] getCodeSources(JarFile jar, URL url) { + return jar.getCodeSources(url); + } + + public CodeSource getCodeSource(JarFile jar, URL url, String name) { + return jar.getCodeSource(url, name); + } + + public Enumeration entryNames(JarFile jar, CodeSource[] cs) { + return jar.entryNames(cs); + } + + public Enumeration entries2(JarFile jar) { + return jar.entries2(); + } + + public void setEagerValidation(JarFile jar, boolean eager) { + jar.setEagerValidation(eager); + } + + public List getManifestDigests(JarFile jar) { + return jar.getManifestDigests(); + } } diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/src/share/classes/javax/script/ScriptEngineFactory.java --- a/jdk/src/share/classes/javax/script/ScriptEngineFactory.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/src/share/classes/javax/script/ScriptEngineFactory.java Mon Feb 21 14:33:58 2011 -0800 @@ -115,20 +115,19 @@ * with respect to concurrent execution of scripts and maintenance of state is also defined. * These values for the THREADING key are:

*
    - *

    null - The engine implementation is not thread safe, and cannot + *

  • null - The engine implementation is not thread safe, and cannot * be used to execute scripts concurrently on multiple threads. - *

    "MULTITHREADED" - The engine implementation is internally + *

  • "MULTITHREADED" - The engine implementation is internally * thread-safe and scripts may execute concurrently although effects of script execution * on one thread may be visible to scripts on other threads. - *

    "THREAD-ISOLATED" - The implementation satisfies the requirements + *

  • "THREAD-ISOLATED" - The implementation satisfies the requirements * of "MULTITHREADED", and also, the engine maintains independent values * for symbols in scripts executing on different threads. - *

    "STATELESS" - The implementation satisfies the requirements of - * "THREAD-ISOLATED". In addition, script executions do not alter the + *

  • "STATELESS" - The implementation satisfies the requirements of + *
  • "THREAD-ISOLATED". In addition, script executions do not alter the * mappings in the Bindings which is the engine scope of the * ScriptEngine. In particular, the keys in the Bindings * and their associated values are the same before and after the execution of the script. - *
  • *
*

* Implementations may define implementation-specific keys. @@ -145,22 +144,23 @@ * of the supported scripting language. For instance, an implementaton for a Javascript * engine might be; *

- *

+     * 
+     * 
      * public String getMethodCallSyntax(String obj,
      *                                   String m, String... args) {
      *      String ret = obj;
      *      ret += "." + m + "(";
      *      for (int i = 0; i < args.length; i++) {
      *          ret += args[i];
-     *          if (i == args.length - 1) {
-     *              ret += ")";
-     *          } else {
+     *          if (i < args.length - 1) {
      *              ret += ",";
      *          }
      *      }
+     *      ret += ")";
      *      return ret;
      * }
-     *
+ *
+ *
*

* * @param obj The name representing the object whose method is to be invoked. The diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/src/share/classes/javax/sql/rowset/serial/SerialClob.java --- a/jdk/src/share/classes/javax/sql/rowset/serial/SerialClob.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/src/share/classes/javax/sql/rowset/serial/SerialClob.java Mon Feb 21 14:33:58 2011 -0800 @@ -57,10 +57,10 @@ private char buf[]; /** - * Internal Clob representation if SerialClob is intialized with a - * Clob + * Internal Clob representation if SerialClob is initialized with a + * Clob. Null if SerialClob is initialized with a char[]. */ - private Clob clob; + private final Clob clob; /** * The length in characters of this SerialClob object's @@ -71,12 +71,12 @@ private long len; /** - * The original length in characters of tgus SerialClob - * objects internal array of characters. + * The original length in characters of this SerialClob + * object's internal array of characters. * * @serial */ - private long origLen; + private final long origLen; /** * Constructs a SerialClob object that is a serialized version of @@ -104,6 +104,7 @@ buf[i] = ch[i]; } origLen = len; + clob = null; } /** @@ -117,19 +118,19 @@ * the database. Otherwise, the new SerialClob object * object will contain no data. *

- * Note: The Clob object supplied to this constructor cannot - * return null for the Clob.getCharacterStream() + * Note: The Clob object supplied to this constructor must + * return non-null for both the Clob.getCharacterStream() * and Clob.getAsciiStream methods. This SerialClob - * constructor cannot serialize a Clob object in this instance + * constructor cannot serialize a Clob object in this instance * and will throw an SQLException object. * * @param clob the Clob object from which this * SerialClob object is to be constructed; cannot be null * @throws SerialException if an error occurs during serialization * @throws SQLException if a SQL error occurs in capturing the CLOB; - * if the Clob object is a null; or if both the + * if the Clob object is a null; or if either of the * Clob.getCharacterStream() and Clob.getAsciiStream() - * methods on the Clob return a null + * methods on the Clob returns a null * @see java.sql.Clob */ public SerialClob(Clob clob) throws SerialException, SQLException { @@ -144,19 +145,27 @@ int read = 0; int offset = 0; - BufferedReader reader; - if ( (((reader = new BufferedReader(clob.getCharacterStream())) == null)) && - (clob.getAsciiStream() == null)) { - throw new SQLException("Invalid Clob object. Calls to getCharacterStream " + - "and getAsciiStream return null which cannot be serialized."); - } + try (Reader charStream = clob.getCharacterStream()) { + if (charStream == null) { + throw new SQLException("Invalid Clob object. The call to getCharacterStream " + + "returned null which cannot be serialized."); + } - try { - do { - read = reader.read(buf, offset, (int)(len - offset)); - offset += read; - } while (read > 0); + // Note: get an ASCII stream in order to null-check it, + // even though we don't do anything with it. + try (InputStream asciiStream = clob.getAsciiStream()) { + if (asciiStream == null) { + throw new SQLException("Invalid Clob object. The call to getAsciiStream " + + "returned null which cannot be serialized."); + } + } + try (Reader reader = new BufferedReader(charStream)) { + do { + read = reader.read(buf, offset, (int)(len - offset)); + offset += read; + } while (read > 0); + } } catch (java.io.IOException ex) { throw new SerialException("SerialClob: " + ex.getMessage()); } @@ -207,13 +216,13 @@ * used to create this SerialClob object */ public java.io.InputStream getAsciiStream() throws SerialException, SQLException { - if (this.clob != null) { - return this.clob.getAsciiStream(); - } else { - throw new SerialException("Unsupported operation. SerialClob cannot " + + if (this.clob != null) { + return this.clob.getAsciiStream(); + } else { + throw new SerialException("Unsupported operation. SerialClob cannot " + "return a the CLOB value as an ascii stream, unless instantiated " + "with a fully implemented Clob object."); - } + } } /** diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/src/share/classes/javax/sql/rowset/spi/SyncFactory.java --- a/jdk/src/share/classes/javax/sql/rowset/spi/SyncFactory.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/src/share/classes/javax/sql/rowset/spi/SyncFactory.java Mon Feb 21 14:33:58 2011 -0800 @@ -32,6 +32,7 @@ import javax.sql.*; import java.io.FileInputStream; +import java.io.InputStream; import java.io.IOException; import java.io.FileNotFoundException; @@ -366,7 +367,9 @@ // Load user's implementation of SyncProvider // here. -Drowset.properties=/abc/def/pqr.txt ROWSET_PROPERTIES = strRowsetProperties; - properties.load(new FileInputStream(ROWSET_PROPERTIES)); + try (FileInputStream fis = new FileInputStream(ROWSET_PROPERTIES)) { + properties.load(fis); + } parseProperties(properties); } @@ -376,12 +379,19 @@ ROWSET_PROPERTIES = "javax" + strFileSep + "sql" + strFileSep + "rowset" + strFileSep + "rowset.properties"; - // properties.load( - // ClassLoader.getSystemResourceAsStream(ROWSET_PROPERTIES)); ClassLoader cl = Thread.currentThread().getContextClassLoader(); - properties.load(cl.getResourceAsStream(ROWSET_PROPERTIES)); + try (InputStream stream = + (cl == null) ? ClassLoader.getSystemResourceAsStream(ROWSET_PROPERTIES) + : cl.getResourceAsStream(ROWSET_PROPERTIES)) { + if (stream == null) { + throw new SyncFactoryException( + "Resource " + ROWSET_PROPERTIES + " not found"); + } + properties.load(stream); + } + parseProperties(properties); // removed else, has properties should sum together diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/src/share/classes/sun/misc/JarIndex.java --- a/jdk/src/share/classes/sun/misc/JarIndex.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/src/share/classes/sun/misc/JarIndex.java Mon Feb 21 14:33:58 2011 -0800 @@ -106,6 +106,19 @@ /** * Returns the jar index, or null if none. * + * This single parameter version of the method is retained + * for binary compatibility with earlier releases. + * + * @param jar the JAR file to get the index from. + * @exception IOException if an I/O error has occurred. + */ + public static JarIndex getJarIndex(JarFile jar) throws IOException { + return getJarIndex(jar, null); + } + + /** + * Returns the jar index, or null if none. + * * @param jar the JAR file to get the index from. * @exception IOException if an I/O error has occurred. */ diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/src/share/classes/sun/misc/JavaUtilJarAccess.java --- a/jdk/src/share/classes/sun/misc/JavaUtilJarAccess.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/src/share/classes/sun/misc/JavaUtilJarAccess.java Mon Feb 21 14:33:58 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,8 +26,19 @@ package sun.misc; import java.io.IOException; +import java.net.URL; +import java.security.CodeSource; +import java.util.Enumeration; +import java.util.List; +import java.util.jar.JarEntry; import java.util.jar.JarFile; public interface JavaUtilJarAccess { public boolean jarFileHasClassPathAttribute(JarFile jar) throws IOException; + public CodeSource[] getCodeSources(JarFile jar, URL url); + public CodeSource getCodeSource(JarFile jar, URL url, String name); + public Enumeration entryNames(JarFile jar, CodeSource[] cs); + public Enumeration entries2(JarFile jar); + public void setEagerValidation(JarFile jar, boolean eager); + public List getManifestDigests(JarFile jar); } diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/src/share/classes/sun/net/www/protocol/jar/URLJarFile.java --- a/jdk/src/share/classes/sun/net/www/protocol/jar/URLJarFile.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/src/share/classes/sun/net/www/protocol/jar/URLJarFile.java Mon Feb 21 14:33:58 2011 -0800 @@ -27,6 +27,9 @@ import java.io.*; import java.net.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; import java.util.*; import java.util.jar.*; import java.util.zip.ZipFile; @@ -208,38 +211,23 @@ JarFile result = null; /* get the stream before asserting privileges */ - final InputStream in = url.openConnection().getInputStream(); - - try { + try (final InputStream in = url.openConnection().getInputStream()) { result = AccessController.doPrivileged( new PrivilegedExceptionAction() { public JarFile run() throws IOException { - OutputStream out = null; - File tmpFile = null; + Path tmpFile = Files.createTempFile("jar_cache", null); try { - tmpFile = File.createTempFile("jar_cache", null); - tmpFile.deleteOnExit(); - out = new FileOutputStream(tmpFile); - int read = 0; - byte[] buf = new byte[BUF_SIZE]; - while ((read = in.read(buf)) != -1) { - out.write(buf, 0, read); + Files.copy(in, tmpFile, StandardCopyOption.REPLACE_EXISTING); + JarFile jarFile = new URLJarFile(tmpFile.toFile(), closeController); + tmpFile.toFile().deleteOnExit(); + return jarFile; + } catch (Throwable thr) { + try { + Files.delete(tmpFile); + } catch (IOException ioe) { + thr.addSuppressed(ioe); } - out.close(); - out = null; - return new URLJarFile(tmpFile, closeController); - } catch (IOException e) { - if (tmpFile != null) { - tmpFile.delete(); - } - throw e; - } finally { - if (in != null) { - in.close(); - } - if (out != null) { - out.close(); - } + throw thr; } } }); diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java --- a/jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java Mon Feb 21 14:33:58 2011 -0800 @@ -51,6 +51,7 @@ // File access mode (immutable) private final boolean writable; private final boolean readable; + private final boolean append; // Required to prevent finalization of creating stream (immutable) private final Object parent; @@ -67,6 +68,7 @@ this.fd = fd; this.readable = readable; this.writable = writable; + this.append = append; this.parent = parent; this.nd = new FileDispatcherImpl(append); } @@ -242,7 +244,8 @@ if (!isOpen()) return 0; do { - p = position0(fd, -1); + // in append-mode then position is advanced to end before writing + p = (append) ? nd.size(fd) : position0(fd, -1); } while ((p == IOStatus.INTERRUPTED) && isOpen()); return IOStatus.normalize(p); } finally { diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/src/share/classes/sun/security/jgss/wrapper/SunNativeProvider.java --- a/jdk/src/share/classes/sun/security/jgss/wrapper/SunNativeProvider.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/src/share/classes/sun/security/jgss/wrapper/SunNativeProvider.java Mon Feb 21 14:33:58 2011 -0800 @@ -87,6 +87,7 @@ gssLibs = new String[]{ "libgssapi.so", "libgssapi_krb5.so", + "libgssapi_krb5.so.2", }; } } else { diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/src/share/classes/sun/security/provider/certpath/PKIXCertPathValidator.java --- a/jdk/src/share/classes/sun/security/provider/certpath/PKIXCertPathValidator.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/src/share/classes/sun/security/provider/certpath/PKIXCertPathValidator.java Mon Feb 21 14:33:58 2011 -0800 @@ -231,13 +231,6 @@ AdaptableX509CertSelector issuerSelector = new AdaptableX509CertSelector(); - // check trusted certificate's key usage - boolean[] usages = trustedCert.getKeyUsage(); - if (usages != null) { - usages[5] = true; // keyCertSign - issuerSelector.setKeyUsage(usages); - } - // check trusted certificate's subject issuerSelector.setSubject(firstCert.getIssuerX500Principal()); diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/src/share/classes/sun/security/util/SignatureFileVerifier.java --- a/jdk/src/share/classes/sun/security/util/SignatureFileVerifier.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/src/share/classes/sun/security/util/SignatureFileVerifier.java Mon Feb 21 14:33:58 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -181,7 +181,8 @@ * * */ - public void process(Hashtable signers) + public void process(Hashtable signers, + List manifestDigests) throws IOException, SignatureException, NoSuchAlgorithmException, JarException, CertificateException { @@ -190,14 +191,15 @@ Object obj = null; try { obj = Providers.startJarVerification(); - processImpl(signers); + processImpl(signers, manifestDigests); } finally { Providers.stopJarVerification(obj); } } - private void processImpl(Hashtable signers) + private void processImpl(Hashtable signers, + List manifestDigests) throws IOException, SignatureException, NoSuchAlgorithmException, JarException, CertificateException { @@ -232,7 +234,7 @@ sf.getEntries().entrySet().iterator(); // see if we can verify the whole manifest first - boolean manifestSigned = verifyManifestHash(sf, md, decoder); + boolean manifestSigned = verifyManifestHash(sf, md, decoder, manifestDigests); // verify manifest main attributes if (!manifestSigned && !verifyManifestMainAttrs(sf, md, decoder)) { @@ -275,7 +277,8 @@ */ private boolean verifyManifestHash(Manifest sf, ManifestDigester md, - BASE64Decoder decoder) + BASE64Decoder decoder, + List manifestDigests) throws IOException { Attributes mattr = sf.getMainAttributes(); @@ -290,6 +293,8 @@ // 16 is length of "-Digest-Manifest" String algorithm = key.substring(0, key.length()-16); + manifestDigests.add(key); + manifestDigests.add(se.getValue()); MessageDigest digest = getDigest(algorithm); if (digest != null) { byte[] computedHash = md.manifestDigest(digest); diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/src/share/classes/sun/tools/jps/Jps.java --- a/jdk/src/share/classes/sun/tools/jps/Jps.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/src/share/classes/sun/tools/jps/Jps.java Mon Feb 21 14:33:58 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -77,9 +77,52 @@ MonitoredVm vm = null; String vmidString = "//" + lvmid + "?mode=r"; + String errorString = null; + try { + // Note: The VM associated with the current VM id may + // no longer be running so these queries may fail. We + // already added the VM id to the output stream above. + // If one of the queries fails, then we try to add a + // reasonable message to indicate that the requested + // info is not available. + + errorString = " -- process information unavailable"; VmIdentifier id = new VmIdentifier(vmidString); vm = monitoredHost.getMonitoredVm(id, 0); + + errorString = " -- main class information unavailable"; + output.append(" " + MonitoredVmUtil.mainClass(vm, + arguments.showLongPaths())); + + if (arguments.showMainArgs()) { + errorString = " -- main args information unavailable"; + String mainArgs = MonitoredVmUtil.mainArgs(vm); + if (mainArgs != null && mainArgs.length() > 0) { + output.append(" " + mainArgs); + } + } + if (arguments.showVmArgs()) { + errorString = " -- jvm args information unavailable"; + String jvmArgs = MonitoredVmUtil.jvmArgs(vm); + if (jvmArgs != null && jvmArgs.length() > 0) { + output.append(" " + jvmArgs); + } + } + if (arguments.showVmFlags()) { + errorString = " -- jvm flags information unavailable"; + String jvmFlags = MonitoredVmUtil.jvmFlags(vm); + if (jvmFlags != null && jvmFlags.length() > 0) { + output.append(" " + jvmFlags); + } + } + + errorString = " -- detach failed"; + monitoredHost.detach(vm); + + System.out.println(output); + + errorString = null; } catch (URISyntaxException e) { // unexpected as vmidString is based on a validated hostid lastError = e; @@ -87,7 +130,7 @@ } catch (Exception e) { lastError = e; } finally { - if (vm == null) { + if (errorString != null) { /* * we ignore most exceptions, as there are race * conditions where a JVM in 'jvms' may terminate @@ -95,7 +138,7 @@ * Other errors, such as access and I/O exceptions * should stop us from iterating over the complete set. */ - output.append(" -- process information unavailable"); + output.append(errorString); if (arguments.isDebug()) { if ((lastError != null) && (lastError.getMessage() != null)) { @@ -110,33 +153,6 @@ continue; } } - - output.append(" "); - output.append(MonitoredVmUtil.mainClass(vm, - arguments.showLongPaths())); - - if (arguments.showMainArgs()) { - String mainArgs = MonitoredVmUtil.mainArgs(vm); - if (mainArgs != null && mainArgs.length() > 0) { - output.append(" ").append(mainArgs); - } - } - if (arguments.showVmArgs()) { - String jvmArgs = MonitoredVmUtil.jvmArgs(vm); - if (jvmArgs != null && jvmArgs.length() > 0) { - output.append(" ").append(jvmArgs); - } - } - if (arguments.showVmFlags()) { - String jvmFlags = MonitoredVmUtil.jvmFlags(vm); - if (jvmFlags != null && jvmFlags.length() > 0) { - output.append(" ").append(jvmFlags); - } - } - - System.out.println(output); - - monitoredHost.detach(vm); } } catch (MonitorException e) { if (e.getMessage() != null) { diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/src/share/demo/nio/zipfs/src/com/sun/nio/zipfs/ZipFileSystemProvider.java --- a/jdk/src/share/demo/nio/zipfs/src/com/sun/nio/zipfs/ZipFileSystemProvider.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/src/share/demo/nio/zipfs/src/com/sun/nio/zipfs/ZipFileSystemProvider.java Mon Feb 21 14:33:58 2011 -0800 @@ -42,6 +42,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Set; +import java.util.zip.ZipError; import java.util.concurrent.ExecutorService; /* @@ -78,39 +79,60 @@ } } + private boolean ensureFile(Path path) { + try { + BasicFileAttributes attrs = + Files.readAttributes(path, BasicFileAttributes.class); + if (!attrs.isRegularFile()) + throw new UnsupportedOperationException(); + return true; + } catch (IOException ioe) { + return false; + } + } + @Override public FileSystem newFileSystem(URI uri, Map env) throws IOException { - return newFileSystem(uriToPath(uri), env, true); + Path path = uriToPath(uri); + synchronized(filesystems) { + Path realPath = null; + if (ensureFile(path)) { + realPath = path.toRealPath(true); + if (filesystems.containsKey(realPath)) + throw new FileSystemAlreadyExistsException(); + } + ZipFileSystem zipfs = null; + try { + zipfs = new ZipFileSystem(this, path, env); + } catch (ZipError ze) { + String pname = path.toString(); + if (pname.endsWith(".zip") || pname.endsWith(".jar")) + throw ze; + // assume NOT a zip/jar file + throw new UnsupportedOperationException(); + } + filesystems.put(realPath, zipfs); + return zipfs; + } } @Override public FileSystem newFileSystem(Path path, Map env) throws IOException { - if (!path.toUri().getScheme().equalsIgnoreCase("file")) { + if (path.getFileSystem() != FileSystems.getDefault()) { throw new UnsupportedOperationException(); } - return newFileSystem(path, env, false); - } - - private FileSystem newFileSystem(Path path, Map env, boolean checkIfFSExists) - throws IOException - { - synchronized(filesystems) { - Path realPath = null; - if (checkIfFSExists && Files.exists(path)) { - realPath = path.toRealPath(true); - if (filesystems.containsKey(realPath)) - throw new FileSystemAlreadyExistsException(); - } - ZipFileSystem zipfs = new ZipFileSystem(this, path, env); - if (realPath == null) - realPath = path.toRealPath(true); - if (!filesystems.containsKey(realPath)) - filesystems.put(realPath, zipfs); - return zipfs; + ensureFile(path); + try { + return new ZipFileSystem(this, path, env); + } catch (ZipError ze) { + String pname = path.toString(); + if (pname.endsWith(".zip") || pname.endsWith(".jar")) + throw ze; + throw new UnsupportedOperationException(); } } diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/src/solaris/classes/sun/nio/fs/UnixChannelFactory.java --- a/jdk/src/solaris/classes/sun/nio/fs/UnixChannelFactory.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/src/solaris/classes/sun/nio/fs/UnixChannelFactory.java Mon Feb 21 14:33:58 2011 -0800 @@ -136,7 +136,7 @@ throw new IllegalArgumentException("APPEND + TRUNCATE_EXISTING not allowed"); FileDescriptor fdObj = open(dfd, path, pathForPermissionCheck, flags, mode); - return FileChannelImpl.open(fdObj, flags.read, flags.write, null); + return FileChannelImpl.open(fdObj, flags.read, flags.write, flags.append, null); } /** diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/ProblemList.txt --- a/jdk/test/ProblemList.txt Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/test/ProblemList.txt Mon Feb 21 14:33:58 2011 -0800 @@ -41,14 +41,14 @@ # # Shell tests are othervm by default. # -# List items are testnames followed by labels, all MUST BE commented +# List items are testnames followed by labels, all MUST BE commented # as to why they are here and use a label: # generic-all Problems on all platforms # generic-ARCH Where ARCH is one of: sparc, sparcv9, x64, i586, etc. # OSNAME-all Where OSNAME is one of: solaris, linux, windows # OSNAME-ARCH Specific on to one OSNAME and ARCH, e.g. solaris-x64 # OSNAME-REV Specific on to one OSNAME and REV, e.g. solaris-5.8 -# +# # More than one label is allowed but must be on the same line. # ############################################################################# @@ -234,7 +234,7 @@ # Linux 32bit Fedora 9, IllegalStateException javax/management/monitor/RuntimeExceptionTest.java generic-all -# Problems with rmi connection, othervm +# Problems with rmi connection, othervm javax/management/remote/mandatory/subjectDelegation/SubjectDelegation2Test.java generic-all # Fails with port already in use @@ -411,7 +411,7 @@ com/sun/nio/sctp/SctpChannel/Send.java generic-all com/sun/nio/sctp/SctpChannel/Shutdown.java generic-all -# Fails on OpenSolaris, IllegalStateException: Cannot add or remove addresses +# Fails on OpenSolaris, IllegalStateException: Cannot add or remove addresses # from a channel that is bound to the wildcard address com/sun/nio/sctp/SctpChannel/Bind.java generic-all @@ -456,10 +456,10 @@ java/rmi/server/RemoteServer/AddrInUse.java generic-all # Connection error on Windows i586 -server -# Also connection errors in othervm on Solaris 10 sparc, same port??? +# Also connection errors in othervm on Solaris 10 sparc, same port??? sun/rmi/transport/tcp/DeadCachedConnection.java generic-all -# Connection errors in othervm on Solaris 10 sparc, same port??? +# Connection errors in othervm on Solaris 10 sparc, same port??? java/rmi/activation/Activatable/checkActivateRef/CheckActivateRef.java generic-all java/rmi/activation/Activatable/checkAnnotations/CheckAnnotations.java generic-all java/rmi/activation/Activatable/checkImplClassLoader/CheckImplClassLoader.java generic-all @@ -532,7 +532,7 @@ java/security/Security/SynchronizedAccess.java generic-all # Failing on Solaris X64 (-d64 -server) with: -# GSSException: Failure unspecified at GSS-API level +# GSSException: Failure unspecified at GSS-API level # (Mechanism level: Specified version of key is not available (44)) sun/security/krb5/auto/BasicKrb5Test.java generic-all @@ -546,14 +546,14 @@ sun/security/krb5/auto/HttpNegotiateServer.java generic-all # Fails on almost all platforms -# java.lang.UnsupportedClassVersionError: SerialTest : +# java.lang.UnsupportedClassVersionError: SerialTest : # Unsupported major.minor version 51.0 # at java.lang.ClassLoader.defineClass1(Native Method) sun/security/util/Oid/S11N.sh generic-all # Fails on Fedora 9 32bit -# GSSException: Failure unspecified at GSS-API level (Mechanism level: -# Invalid argument (400) - Cannot find key of appropriate type to decrypt +# GSSException: Failure unspecified at GSS-API level (Mechanism level: +# Invalid argument (400) - Cannot find key of appropriate type to decrypt # AP REP - DES CBC mode with MD5) # at sun.security.jgss.krb5.Krb5Context.acceptSecContext(Krb5Context.java:778) sun/security/krb5/auto/NonMutualSpnego.java generic-all @@ -673,7 +673,7 @@ # Timeout on solaris-sparc and i586 and x64, -client and -server sun/security/ssl/com/sun/net/ssl/internal/ssl/InputRecord/InterruptedIO.java solaris-all -# Do not seem to run on windows machines? dll missing? +# Do not seem to run on windows machines? dll missing? sun/security/tools/jarsigner/emptymanifest.sh windows-all # Files does not exist or no encoding? solaris-sparcv9 @@ -734,8 +734,5 @@ # Problems on windows, jmap.exe hangs? (these run jmap), fails on Solaris 10 x86 java/util/concurrent/locks/Lock/TimedAcquireLeak.java generic-all -# Fails on solaris-sparc -server (Set not equal to copy. 1) -java/util/EnumSet/EnumSetBash.java solaris-sparc - ############################################################################ diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/demo/zipfs/ZipFSTester.java --- a/jdk/test/demo/zipfs/ZipFSTester.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/test/demo/zipfs/ZipFSTester.java Mon Feb 21 14:33:58 2011 -0800 @@ -105,6 +105,18 @@ os.write(bits); os.close(); + try { + provider.newFileSystem(new File(System.getProperty("test.src", ".")).toPath(), + new HashMap()); + throw new RuntimeException("newFileSystem() opens a directory as zipfs"); + } catch (UnsupportedOperationException uoe) {} + + try { + provider.newFileSystem(src, new HashMap()); + throw new RuntimeException("newFileSystem() opens a non-zip file as zipfs"); + } catch (UnsupportedOperationException uoe) {} + + // copyin Path dst = getPathWithParents(fs, tmpName); Files.copy(src, dst); diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/demo/zipfs/basic.sh --- a/jdk/test/demo/zipfs/basic.sh Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/test/demo/zipfs/basic.sh Mon Feb 21 14:33:58 2011 -0800 @@ -21,7 +21,7 @@ # questions. # # @test -# @bug 6990846 7009092 7009085 7015391 7014948 7005986 7017840 +# @bug 6990846 7009092 7009085 7015391 7014948 7005986 7017840 7007596 # @summary Test ZipFileSystem demo # @build Basic PathOps ZipFSTester # @run shell basic.sh diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/java/lang/Thread/StopBeforeStart.java --- a/jdk/test/java/lang/Thread/StopBeforeStart.java Mon Feb 21 14:31:07 2011 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,132 +0,0 @@ -/* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - * @test - * @bug 4519200 - * @summary Confirm a Thread.stop before start complies with the spec - * @author Pete Soper - * - * Confirm that a thread that had its stop method invoked before start - * does properly terminate with expected exception behavior. NOTE that - * arbitrary application threads could return from their run methods faster - * than the VM can throw an async exception. - */ -public class StopBeforeStart { - - private static final int JOIN_TIMEOUT=10000; - - private class MyThrowable extends Throwable { - } - - private class Catcher implements Thread.UncaughtExceptionHandler { - private boolean nullaryStop; - private Throwable theThrowable; - private Throwable expectedThrowable; - private boolean exceptionThrown; - - Catcher(boolean nullaryStop) { - this.nullaryStop = nullaryStop; - if (!nullaryStop) { - expectedThrowable = new MyThrowable(); - } - } - - public void uncaughtException(Thread t, Throwable th) { - exceptionThrown = true; - theThrowable = th; - } - - void check(String label) throws Throwable { - if (!exceptionThrown) { - throw new RuntimeException(label + - " test:" + " missing uncaught exception"); - } - - if (nullaryStop) { - if (! (theThrowable instanceof ThreadDeath)) { - throw new RuntimeException(label + - " test:" + " expected ThreadDeath in uncaught handler"); - } - } else if (theThrowable != expectedThrowable) { - throw new RuntimeException(label + - " test:" + " wrong Throwable in uncaught handler"); - } - } - } - - private class MyRunnable implements Runnable { - public void run() { - while(true) - ; - } - } - - private class MyThread extends Thread { - public void run() { - while(true) - ; - } - } - - - public static void main(String args[]) throws Throwable { - (new StopBeforeStart()).doit(); - System.out.println("Test passed"); - } - - private void doit() throws Throwable { - - runit(false, new Thread(new MyRunnable()),"Thread"); - runit(true, new Thread(new MyRunnable()),"Thread"); - runit(false, new MyThread(),"Runnable"); - runit(true, new MyThread(),"Runnable"); - } - - private void runit(boolean nullaryStop, Thread thread, - String type) throws Throwable { - - Catcher c = new Catcher(nullaryStop); - thread.setUncaughtExceptionHandler(c); - - if (nullaryStop) { - thread.stop(); - } else { - thread.stop(c.expectedThrowable); - } - - thread.start(); - thread.join(JOIN_TIMEOUT); - - if (thread.getState() != Thread.State.TERMINATED) { - - thread.stop(); - - // Under high load this could be a false positive - throw new RuntimeException(type + - " test:" + " app thread did not terminate"); - } - - c.check(type); - } -} diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/java/nio/channels/FileChannel/Position.java --- a/jdk/test/java/nio/channels/FileChannel/Position.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/test/java/nio/channels/FileChannel/Position.java Mon Feb 21 14:33:58 2011 -0800 @@ -22,13 +22,16 @@ */ /* @test + * @bug 4429043 6526860 * @summary Test position method of FileChannel */ import java.io.*; -import java.nio.MappedByteBuffer; -import java.nio.channels.*; +import java.nio.ByteBuffer; import java.nio.channels.FileChannel; +import java.nio.file.*; +import static java.nio.file.StandardOpenOption.*; +import java.nio.charset.Charset; import java.util.Random; @@ -38,32 +41,42 @@ public class Position { - private static PrintStream err = System.err; - - private static Random generator = new Random(); + private static final Charset ISO8859_1 = Charset.forName("8859_1"); - private static int CHARS_PER_LINE = File.separatorChar == '/' ? 5 : 6; - - private static File blah; + private static final Random generator = new Random(); public static void main(String[] args) throws Exception { - blah = File.createTempFile("blah", null); - blah.deleteOnExit(); + Path blah = Files.createTempFile("blah", null); + blah.toFile().deleteOnExit(); initTestFile(blah); - FileInputStream fis = new FileInputStream(blah); - FileChannel c = fis.getChannel(); - - for(int i=0; i<100; i++) { - long newPos = generator.nextInt(1000); - c.position(newPos); - if (c.position() != newPos) - throw new RuntimeException("Position failed"); + for (int i=0; i<10; i++) { + try (FileChannel fc = (generator.nextBoolean()) ? + FileChannel.open(blah, READ) : + new FileInputStream(blah.toFile()).getChannel()) { + for (int j=0; j<100; j++) { + long newPos = generator.nextInt(1000); + fc.position(newPos); + if (fc.position() != newPos) + throw new RuntimeException("Position failed"); + } + } } - c.close(); - fis.close(); - blah.delete(); + for (int i=0; i<10; i++) { + try (FileChannel fc = (generator.nextBoolean()) ? + FileChannel.open(blah, APPEND) : + new FileOutputStream(blah.toFile(), true).getChannel()) { + for (int j=0; j<10; j++) { + if (fc.position() != fc.size()) + throw new RuntimeException("Position expected to be size"); + byte[] buf = new byte[generator.nextInt(100)]; + fc.write(ByteBuffer.wrap(buf)); + } + } + } + + Files.delete(blah); } /** @@ -78,19 +91,15 @@ * 3999 * */ - private static void initTestFile(File blah) throws Exception { - FileOutputStream fos = new FileOutputStream(blah); - BufferedWriter awriter - = new BufferedWriter(new OutputStreamWriter(fos, "8859_1")); - - for(int i=0; i<4000; i++) { - String number = new Integer(i).toString(); - for (int h=0; h<4-number.length(); h++) - awriter.write("0"); - awriter.write(""+i); - awriter.newLine(); + private static void initTestFile(Path blah) throws IOException { + try (BufferedWriter awriter = Files.newBufferedWriter(blah, ISO8859_1)) { + for(int i=0; i<4000; i++) { + String number = new Integer(i).toString(); + for (int h=0; h<4-number.length(); h++) + awriter.write("0"); + awriter.write(""+i); + awriter.newLine(); + } } - awriter.flush(); - awriter.close(); } } diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/java/nio/file/Files/walkFileTree/PrintFileTree.java --- a/jdk/test/java/nio/file/Files/walkFileTree/PrintFileTree.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/test/java/nio/file/Files/walkFileTree/PrintFileTree.java Mon Feb 21 14:33:58 2011 -0800 @@ -54,6 +54,7 @@ if (followLinks) options.add(FileVisitOption.FOLLOW_LINKS); + final boolean follow = followLinks; final boolean reportCycles = printCycles; Files.walkFileTree(dir, options, Integer.MAX_VALUE, new FileVisitor() { @Override @@ -63,8 +64,7 @@ } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { - if (!attrs.isDirectory() || reportCycles) - System.out.println(file); + System.out.println(file); return FileVisitResult.CONTINUE; } @Override @@ -79,11 +79,13 @@ public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { - if (reportCycles && (exc instanceof FileSystemLoopException)) { - System.out.println(file); + if (follow && (exc instanceof FileSystemLoopException)) { + if (reportCycles) + System.out.println(file); return FileVisitResult.CONTINUE; + } else { + throw exc; } - throw exc; } }); } diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/java/util/Hashtable/SerializationDeadlock.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/util/Hashtable/SerializationDeadlock.java Mon Feb 21 14:33:58 2011 -0800 @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2010, 2011 Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + * ------------------------------------------- + * + * Portions Copyright (c) 2010, 2011 IBM Corporation + */ + +/* + * @test + * @bug 6927486 + * @summary Serializing Hashtable objects which refer to each other should not be able to deadlock. + * @author Neil Richards , + */ + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectOutputStream; +import java.io.PrintWriter; +import java.io.Serializable; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.Hashtable; +import java.util.List; +import java.util.concurrent.CyclicBarrier; + +public class SerializationDeadlock { + public static void main(final String[] args) throws Exception { + // Test for Hashtable serialization deadlock + final Hashtable h1 = new Hashtable<>(); + final Hashtable h2 = new Hashtable<>(); + final TestBarrier testStart = new TestBarrier(3); + + // Populate the hashtables so that they refer to each other + h1.put(testStart, h2); + h2.put(testStart, h1); + + final CyclicBarrier testEnd = new CyclicBarrier(3); + final TestThread t1 = new TestThread(h1, testEnd); + final TestThread t2 = new TestThread(h2, testEnd); + + t1.start(); + t2.start(); + + // Wait for both test threads to have initiated serialization + // of the 'testStart' object (and hence of both 'h1' and 'h2') + testStart.await(); + + // Wait for both test threads to successfully finish serialization + // of 'h1' and 'h2'. + System.out.println("Waiting for Hashtable serialization to complete ..."); + System.out.println("(This test will hang if serialization deadlocks)"); + testEnd.await(); + System.out.println("Test PASSED: serialization completed successfully"); + + TestThread.handleExceptions(); + } + + static final class TestBarrier extends CyclicBarrier + implements Serializable { + public TestBarrier(final int count) { + super(count); + } + + private void writeObject(final ObjectOutputStream oos) + throws IOException { + oos.defaultWriteObject(); + // Wait until all test threads have started serializing data + try { + await(); + } catch (final Exception e) { + throw new IOException("Test ERROR: Unexpected exception caught", e); + } + } + } + + static final class TestThread extends Thread { + private static final List exceptions = new ArrayList<>(); + + private final Hashtable hashtable; + private final CyclicBarrier testEnd; + + public TestThread(final Hashtable hashtable, + final CyclicBarrier testEnd) { + this.hashtable = hashtable; + this.testEnd = testEnd; + setDaemon(true); + } + + public void run() { + try { + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + final ObjectOutputStream oos = new ObjectOutputStream(baos); + + oos.writeObject(hashtable); + oos.close(); + } catch (final IOException ioe) { + addException(ioe); + } finally { + try { + testEnd.await(); + } catch (Exception e) { + addException(e); + } + } + } + + private static synchronized void addException(final Exception exception) { + exceptions.add(exception); + } + + public static synchronized void handleExceptions() { + if (false == exceptions.isEmpty()) { + throw new RuntimeException(getErrorText(exceptions)); + } + } + + private static String getErrorText(final List exceptions) { + final StringWriter sw = new StringWriter(); + final PrintWriter pw = new PrintWriter(sw); + + pw.println("Test ERROR: Unexpected exceptions thrown on test threads:"); + for (Exception exception : exceptions) { + pw.print("\t"); + pw.println(exception); + for (StackTraceElement element : exception.getStackTrace()) { + pw.print("\t\tat "); + pw.println(element); + } + } + + pw.close(); + return sw.toString(); + } + } +} + diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/java/util/Hashtable/SimpleSerialization.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/util/Hashtable/SimpleSerialization.java Mon Feb 21 14:33:58 2011 -0800 @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2010, 2011 Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + * ------------------------------------------- + * + * Portions Copyright (c) 2010, 2011 IBM Corporation + */ + +/* + * @test + * @bug 6927486 + * @summary A serialized Hashtable can be de-serialized properly. + * @author Neil Richards , + */ + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.Hashtable; + +public class SimpleSerialization { + public static void main(final String[] args) throws Exception { + Hashtable h1 = new Hashtable<>(); + + h1.put("key", "value"); + + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + final ObjectOutputStream oos = new ObjectOutputStream(baos); + + oos.writeObject(h1); + oos.close(); + + final byte[] data = baos.toByteArray(); + final ByteArrayInputStream bais = new ByteArrayInputStream(data); + final ObjectInputStream ois = new ObjectInputStream(bais); + + final Object deserializedObject = ois.readObject(); + ois.close(); + + if (false == h1.equals(deserializedObject)) { + throw new RuntimeException(getFailureText(h1, deserializedObject)); + } + } + + private static String getFailureText(final Object orig, final Object copy) { + final StringWriter sw = new StringWriter(); + final PrintWriter pw = new PrintWriter(sw); + + pw.println("Test FAILED: Deserialized object is not equal to the original object"); + pw.print("\tOriginal: "); + printObject(pw, orig).println(); + pw.print("\tCopy: "); + printObject(pw, copy).println(); + + pw.close(); + return sw.toString(); + } + + private static PrintWriter printObject(final PrintWriter pw, final Object o) { + pw.printf("%s@%08x", o.getClass().getName(), System.identityHashCode(o)); + return pw; + } +} diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/java/util/Vector/SerializationDeadlock.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/util/Vector/SerializationDeadlock.java Mon Feb 21 14:33:58 2011 -0800 @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2010, 2011 Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * Portions Copyright (c) 2010, 2011 IBM Corporation + */ + +/* + * @test + * @bug 6934356 + * @summary Serializing Vector objects which refer to each other should not be able to deadlock. + * @author Neil Richards , + */ + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectOutputStream; +import java.io.PrintWriter; +import java.io.Serializable; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.List; +import java.util.Vector; +import java.util.concurrent.CyclicBarrier; + +public class SerializationDeadlock { + public static void main(final String[] args) throws Exception { + // Test for Vector serialization deadlock + final Vector v1 = new Vector<>(); + final Vector v2 = new Vector<>(); + final TestBarrier testStart = new TestBarrier(3); + + // Populate the vectors so that they refer to each other + v1.add(testStart); + v1.add(v2); + v2.add(testStart); + v2.add(v1); + + final CyclicBarrier testEnd = new CyclicBarrier(3); + final TestThread t1 = new TestThread(v1, testEnd); + final TestThread t2 = new TestThread(v2, testEnd); + + t1.start(); + t2.start(); + + // Wait for both test threads to have initiated serialization + // of the 'testStart' object (and hence of both 'v1' and 'v2') + testStart.await(); + + // Wait for both test threads to successfully finish serialization + // of 'v1' and 'v2'. + System.out.println("Waiting for Vector serialization to complete ..."); + System.out.println("(This test will hang if serialization deadlocks)"); + testEnd.await(); + System.out.println("Test PASSED: serialization completed successfully"); + + TestThread.handleExceptions(); + } + + static final class TestBarrier extends CyclicBarrier + implements Serializable { + public TestBarrier(final int count) { + super(count); + } + + private void writeObject(final ObjectOutputStream oos) + throws IOException { + oos.defaultWriteObject(); + // Wait until all test threads have started serializing data + try { + await(); + } catch (final Exception e) { + throw new IOException("Test ERROR: Unexpected exception caught", e); + } + } + } + + static final class TestThread extends Thread { + private static final List exceptions = new ArrayList<>(); + + private final Vector vector; + private final CyclicBarrier testEnd; + + public TestThread(final Vector vector, final CyclicBarrier testEnd) { + this.vector = vector; + this.testEnd = testEnd; + setDaemon(true); + } + + public void run() { + try { + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + final ObjectOutputStream oos = new ObjectOutputStream(baos); + + oos.writeObject(vector); + oos.close(); + } catch (final IOException ioe) { + addException(ioe); + } finally { + try { + testEnd.await(); + } catch (Exception e) { + addException(e); + } + } + } + + private static synchronized void addException(final Exception exception) { + exceptions.add(exception); + } + + public static synchronized void handleExceptions() { + if (false == exceptions.isEmpty()) { + throw new RuntimeException(getErrorText(exceptions)); + } + } + + private static String getErrorText(final List exceptions) { + final StringWriter sw = new StringWriter(); + final PrintWriter pw = new PrintWriter(sw); + + pw.println("Test ERROR: Unexpected exceptions thrown on test threads:"); + for (Exception exception : exceptions) { + pw.print("\t"); + pw.println(exception); + for (StackTraceElement element : exception.getStackTrace()) { + pw.print("\t\tat "); + pw.println(element); + } + } + + pw.close(); + return sw.toString(); + } + } +} + diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/java/util/Vector/SimpleSerialization.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/util/Vector/SimpleSerialization.java Mon Feb 21 14:33:58 2011 -0800 @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2010, 2011 Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * Portions Copyright (c) 2010, 2011 IBM Corporation + */ + +/* + * @test + * @bug 6934356 + * @summary A serialized Vector can be successfully de-serialized. + * @author Neil Richards , + */ + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.Vector; + +public class SimpleSerialization { + public static void main(final String[] args) throws Exception { + final Vector v1 = new Vector<>(); + + v1.add("entry1"); + v1.add("entry2"); + + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + final ObjectOutputStream oos = new ObjectOutputStream(baos); + + oos.writeObject(v1); + oos.close(); + + final byte[] data = baos.toByteArray(); + final ByteArrayInputStream bais = new ByteArrayInputStream(data); + final ObjectInputStream ois = new ObjectInputStream(bais); + + final Object deserializedObject = ois.readObject(); + ois.close(); + + if (false == v1.equals(deserializedObject)) { + throw new RuntimeException(getFailureText(v1, deserializedObject)); + } + } + + private static String getFailureText(final Object orig, final Object copy) { + final StringWriter sw = new StringWriter(); + final PrintWriter pw = new PrintWriter(sw); + + pw.println("Test FAILED: Deserialized object is not equal to the original object"); + pw.print("\tOriginal: "); + printObject(pw, orig).println(); + pw.print("\tCopy: "); + printObject(pw, copy).println(); + + pw.close(); + return sw.toString(); + } + + private static PrintWriter printObject(final PrintWriter pw, final Object o) { + pw.printf("%s@%08x", o.getClass().getName(), System.identityHashCode(o)); + return pw; + } +} diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/java/util/concurrent/BlockingQueue/CancelledProducerConsumerLoops.java --- a/jdk/test/java/util/concurrent/BlockingQueue/CancelledProducerConsumerLoops.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/test/java/util/concurrent/BlockingQueue/CancelledProducerConsumerLoops.java Mon Feb 21 14:33:58 2011 -0800 @@ -124,11 +124,11 @@ oneRun(new ArrayBlockingQueue(CAPACITY), pairs, iters); oneRun(new LinkedBlockingQueue(CAPACITY), pairs, iters); oneRun(new LinkedBlockingDeque(CAPACITY), pairs, iters); - oneRun(new LinkedTransferQueue(), pairs, iters); oneRun(new SynchronousQueue(), pairs, iters / 8); - /* PriorityBlockingQueue is unbounded + /* unbounded queue implementations are prone to OOME oneRun(new PriorityBlockingQueue(iters / 2 * pairs), pairs, iters / 4); + oneRun(new LinkedTransferQueue(), pairs, iters); */ } diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/sun/security/krb5/auto/BadKdc1.java --- a/jdk/test/sun/security/krb5/auto/BadKdc1.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/test/sun/security/krb5/auto/BadKdc1.java Mon Feb 21 14:33:58 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,7 +24,7 @@ /* * @test * @bug 6843127 - * @run main/timeout=300 BadKdc1 + * @run main/othervm/timeout=300 BadKdc1 * @summary krb5 should not try to access unavailable kdc too often */ diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/sun/security/krb5/auto/BadKdc2.java --- a/jdk/test/sun/security/krb5/auto/BadKdc2.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/test/sun/security/krb5/auto/BadKdc2.java Mon Feb 21 14:33:58 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,7 +24,7 @@ /* * @test * @bug 6843127 - * @run main/timeout=300 BadKdc2 + * @run main/othervm/timeout=300 BadKdc2 * @summary krb5 should not try to access unavailable kdc too often */ diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/sun/security/krb5/auto/BadKdc3.java --- a/jdk/test/sun/security/krb5/auto/BadKdc3.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/test/sun/security/krb5/auto/BadKdc3.java Mon Feb 21 14:33:58 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,7 +24,7 @@ /* * @test * @bug 6843127 - * @run main/timeout=300 BadKdc3 + * @run main/othervm/timeout=300 BadKdc3 * @summary krb5 should not try to access unavailable kdc too often */ diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/sun/security/krb5/auto/BadKdc4.java --- a/jdk/test/sun/security/krb5/auto/BadKdc4.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/test/sun/security/krb5/auto/BadKdc4.java Mon Feb 21 14:33:58 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,7 +24,7 @@ /* * @test * @bug 6843127 - * @run main/timeout=300 BadKdc4 + * @run main/othervm/timeout=300 BadKdc4 * @summary krb5 should not try to access unavailable kdc too often */ diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/sun/security/krb5/auto/CleanState.java --- a/jdk/test/sun/security/krb5/auto/CleanState.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/test/sun/security/krb5/auto/CleanState.java Mon Feb 21 14:33:58 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,6 +24,7 @@ /* * @test * @bug 6716534 + * @run main/othervm CleanState * @summary Krb5LoginModule has not cleaned temp info between authentication attempts */ import com.sun.security.auth.module.Krb5LoginModule; diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/sun/security/krb5/auto/CrossRealm.java --- a/jdk/test/sun/security/krb5/auto/CrossRealm.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/test/sun/security/krb5/auto/CrossRealm.java Mon Feb 21 14:33:58 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,6 +24,7 @@ /* * @test * @bug 6706974 + * @run main/othervm CrossRealm * @summary Add krb5 test infrastructure */ import java.io.File; diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/sun/security/krb5/auto/HttpNegotiateServer.java --- a/jdk/test/sun/security/krb5/auto/HttpNegotiateServer.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/test/sun/security/krb5/auto/HttpNegotiateServer.java Mon Feb 21 14:33:58 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,6 +24,7 @@ /* * @test * @bug 6578647 6829283 + * @run main/othervm HttpNegotiateServer * @summary Undefined requesting URL in java.net.Authenticator.getPasswordAuthentication() * @summary HTTP/Negotiate: Authenticator triggered again when user cancels the first one */ diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/sun/security/krb5/auto/IgnoreChannelBinding.java --- a/jdk/test/sun/security/krb5/auto/IgnoreChannelBinding.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/test/sun/security/krb5/auto/IgnoreChannelBinding.java Mon Feb 21 14:33:58 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,6 +24,7 @@ /* * @test * @bug 6851973 + * @run main/othervm IgnoreChannelBinding * @summary ignore incoming channel binding if acceptor does not set one */ diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/sun/security/krb5/auto/KerberosHashEqualsTest.java --- a/jdk/test/sun/security/krb5/auto/KerberosHashEqualsTest.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/test/sun/security/krb5/auto/KerberosHashEqualsTest.java Mon Feb 21 14:33:58 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,6 +24,7 @@ /* * @test * @bug 4641821 + * @run main/othervm KerberosHashEqualsTest * @summary hashCode() and equals() for KerberosKey and KerberosTicket */ diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/sun/security/krb5/auto/LifeTimeInSeconds.java --- a/jdk/test/sun/security/krb5/auto/LifeTimeInSeconds.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/test/sun/security/krb5/auto/LifeTimeInSeconds.java Mon Feb 21 14:33:58 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,6 +24,7 @@ /* * @test * @bug 6857802 + * @run main/othervm LifeTimeInSeconds * @summary GSS getRemainingInitLifetime method returns milliseconds not seconds */ import org.ietf.jgss.GSSCredential; diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/sun/security/krb5/auto/LoginModuleOptions.java --- a/jdk/test/sun/security/krb5/auto/LoginModuleOptions.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/test/sun/security/krb5/auto/LoginModuleOptions.java Mon Feb 21 14:33:58 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,6 +24,7 @@ /* * @test * @bug 6765491 + * @run main/othervm LoginModuleOptions * @summary Krb5LoginModule a little too restrictive, and the doc is not clear. */ import com.sun.security.auth.module.Krb5LoginModule; diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/sun/security/krb5/auto/MaxRetries.java --- a/jdk/test/sun/security/krb5/auto/MaxRetries.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/test/sun/security/krb5/auto/MaxRetries.java Mon Feb 21 14:33:58 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,7 +24,7 @@ /* * @test * @bug 6844193 - * @run main/timeout=300 MaxRetries + * @run main/othervm/timeout=300 MaxRetries * @summary support max_retries in krb5.conf */ diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/sun/security/krb5/auto/MoreKvno.java --- a/jdk/test/sun/security/krb5/auto/MoreKvno.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/test/sun/security/krb5/auto/MoreKvno.java Mon Feb 21 14:33:58 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,7 @@ * @test * @bug 6893158 * @bug 6907425 + * @run main/othervm MoreKvno * @summary AP_REQ check should use key version number */ diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/sun/security/krb5/auto/NewSalt.java --- a/jdk/test/sun/security/krb5/auto/NewSalt.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/test/sun/security/krb5/auto/NewSalt.java Mon Feb 21 14:33:58 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,7 @@ * @test * @bug 6960894 * @summary Better AS-REQ creation and processing - * @run main NewSalt + * @run main/othervm NewSalt * @run main/othervm -Dnopreauth NewSalt * @run main/othervm -Donlyonepreauth NewSalt */ diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/sun/security/krb5/auto/NonMutualSpnego.java --- a/jdk/test/sun/security/krb5/auto/NonMutualSpnego.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/test/sun/security/krb5/auto/NonMutualSpnego.java Mon Feb 21 14:33:58 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,6 +24,7 @@ /* * @test * @bug 6733095 + * @run main/othervm NonMutualSpnego * @summary Failure when SPNEGO request non-Mutual */ diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/sun/security/krb5/auto/SSL.java --- a/jdk/test/sun/security/krb5/auto/SSL.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/test/sun/security/krb5/auto/SSL.java Mon Feb 21 14:33:58 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,16 +25,16 @@ * @test * @bug 6894643 6913636 * @summary Test JSSE Kerberos ciphersuite - * @run main SSL TLS_KRB5_WITH_RC4_128_SHA - * @run main SSL TLS_KRB5_WITH_RC4_128_MD5 - * @run main SSL TLS_KRB5_WITH_3DES_EDE_CBC_SHA - * @run main SSL TLS_KRB5_WITH_3DES_EDE_CBC_MD5 - * @run main SSL TLS_KRB5_WITH_DES_CBC_SHA - * @run main SSL TLS_KRB5_WITH_DES_CBC_MD5 - * @run main SSL TLS_KRB5_EXPORT_WITH_RC4_40_SHA - * @run main SSL TLS_KRB5_EXPORT_WITH_RC4_40_MD5 - * @run main SSL TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA - * @run main SSL TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5 + * @run main/othervm SSL TLS_KRB5_WITH_RC4_128_SHA + * @run main/othervm SSL TLS_KRB5_WITH_RC4_128_MD5 + * @run main/othervm SSL TLS_KRB5_WITH_3DES_EDE_CBC_SHA + * @run main/othervm SSL TLS_KRB5_WITH_3DES_EDE_CBC_MD5 + * @run main/othervm SSL TLS_KRB5_WITH_DES_CBC_SHA + * @run main/othervm SSL TLS_KRB5_WITH_DES_CBC_MD5 + * @run main/othervm SSL TLS_KRB5_EXPORT_WITH_RC4_40_SHA + * @run main/othervm SSL TLS_KRB5_EXPORT_WITH_RC4_40_MD5 + * @run main/othervm SSL TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA + * @run main/othervm SSL TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5 */ import java.io.*; import java.net.InetAddress; diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/sun/security/krb5/auto/SpnegoReqFlags.java --- a/jdk/test/sun/security/krb5/auto/SpnegoReqFlags.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/test/sun/security/krb5/auto/SpnegoReqFlags.java Mon Feb 21 14:33:58 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,6 +24,7 @@ /* * @test * @bug 6815182 + * @run main/othervm SpnegoReqFlags * @summary GSSAPI/SPNEGO does not work with server using MIT Kerberos library */ diff -r 0d231bdb78cf -r ce70b4ff6423 jdk/test/sun/security/krb5/auto/Test5653.java --- a/jdk/test/sun/security/krb5/auto/Test5653.java Mon Feb 21 14:31:07 2011 -0800 +++ b/jdk/test/sun/security/krb5/auto/Test5653.java Mon Feb 21 14:33:58 2011 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,6 +24,7 @@ /* * @test * @bug 6895424 + * @run main/othervm Test5653 * @summary RFC 5653 */