--- a/jdk/make/CompileInterimRmic.gmk Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/make/CompileInterimRmic.gmk Thu Dec 11 12:27:27 2014 -0800
@@ -46,8 +46,7 @@
SRC := $(JDK_TOPDIR)/src/jdk.rmic/share/classes, \
INCLUDES := $(RMIC_PKGS), \
BIN := $(BUILDTOOLS_OUTPUTDIR)/interim_rmic_classes, \
- COPY := .properties, \
- JAVAC_SOURCE_PATH_OVERRIDE := $(addprefix $(JDK_TOPDIR)/src/jdk.rmic/share/classes/, $(RMIC_PKGS))))
+ COPY := .properties))
##########################################################################################
--- a/jdk/make/Import.gmk Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/make/Import.gmk Thu Dec 11 12:27:27 2014 -0800
@@ -221,8 +221,13 @@
# even if zip is already unpacked.
$(SUPPORT_OUTPUTDIR)/gensrc/jdk.hotspot.agent/_the.sa.services: $(HOTSPOT_DIST)/lib/sa-jdi.jar
-SA_TARGETS += $(JDK_OUTPUTDIR)/modules/jdk.hotspot.agent/_the.sa.jar.unpacked \
- $(SUPPORT_OUTPUTDIR)/gensrc/jdk.hotspot.agent/_the.sa.services
+# Some platforms don't have the serviceability agent
+ifeq (, $(filter $(OPENJDK_TARGET_OS)-$(OPENJDK_TARGET_CPU), aix-ppc64))
+ ifneq ($(JVM_VARIANT_ZERO), true)
+ SA_TARGETS += $(JDK_OUTPUTDIR)/modules/jdk.hotspot.agent/_the.sa.jar.unpacked \
+ $(SUPPORT_OUTPUTDIR)/gensrc/jdk.hotspot.agent/_the.sa.services
+ endif
+endif
################################################################################
--- a/jdk/make/gendata/GendataBreakIterator.gmk Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/make/gendata/GendataBreakIterator.gmk Thu Dec 11 12:27:27 2014 -0800
@@ -44,17 +44,10 @@
# Generate BreakIteratorData
BREAK_ITERATOR_CLASSES := $(BUILDTOOLS_OUTPUTDIR)/break_iterator_classes
-# JAVAC_SOURCE_PATH_OVERRIDE is set to isolate the compile to just those
-# two files in that directory and not get anything implicit from
-# surrounding directories which aren't jdk N-1 compatible.
-# Because we are targeting jdk N-1, but the surrounding source code is jdk N.
-# These two files should be moved out to a build tool! We have to disable
-# sjavac here as well.
+# These two files should be moved out to a build tool!
$(eval $(call SetupJavaCompilation,BUILD_BREAKITERATOR, \
SETUP := GENERATE_OLDBYTECODE, \
SRC := $(TEXT_SRCDIR), \
- DISABLE_SJAVAC := true, \
- JAVAC_SOURCE_PATH_OVERRIDE := $(patsubst %, %/$(TEXT_PKG), $(TEXT_SRCDIR)), \
INCLUDES := $(TEXT_PKG), \
INCLUDE_FILES := $(TEXT_SOURCES), \
BIN := $(BREAK_ITERATOR_CLASSES)))
--- a/jdk/make/gensrc/Gensrc-jdk.jdi.gmk Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/make/gensrc/Gensrc-jdk.jdi.gmk Thu Dec 11 12:27:27 2014 -0800
@@ -78,8 +78,13 @@
$(SUPPORT_OUTPUTDIR)/gensrc/jdk.jdi/META-INF/services/com.sun.jdi.connect.Connector
$(install-file)
-GENSRC_JDK_JDI += $(SUPPORT_OUTPUTDIR)/gensrc/jdk.jdi/META-INF/services/com.sun.jdi.connect.Connector \
- $(JDK_OUTPUTDIR)/modules/jdk.hotspot.agent/META-INF/services/com.sun.jdi.connect.Connector
+# Some platforms don't have the serviceability agent
+ifeq (, $(filter $(OPENJDK_TARGET_OS)-$(OPENJDK_TARGET_CPU), aix-ppc64))
+ ifneq ($(JVM_VARIANT_ZERO), true)
+ GENSRC_JDK_JDI += $(SUPPORT_OUTPUTDIR)/gensrc/jdk.jdi/META-INF/services/com.sun.jdi.connect.Connector \
+ $(JDK_OUTPUTDIR)/modules/jdk.hotspot.agent/META-INF/services/com.sun.jdi.connect.Connector
+ endif
+endif
################################################################################
--- a/jdk/make/launcher/LauncherCommon.gmk Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/make/launcher/LauncherCommon.gmk Thu Dec 11 12:27:27 2014 -0800
@@ -116,7 +116,7 @@
endif
ifeq ($(OPENJDK_TARGET_OS), aix)
- $1_LDFLAGS_SUFFIX += -L$(SUPPORT_OUTPUTDIR)/native/$(MODULE) -ljli_static
+ $1_LDFLAGS_SUFFIX += -L$(SUPPORT_OUTPUTDIR)/native/java.base -ljli_static
endif
ifeq ($(USE_EXTERNAL_LIBZ), true)
--- a/jdk/make/lib/Awt2dLibraries.gmk Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/make/lib/Awt2dLibraries.gmk Thu Dec 11 12:27:27 2014 -0800
@@ -367,7 +367,7 @@
$(X_LIBS) $(LIBAWT_XAWT_LDFLAGS) \
$(call SET_SHARED_LIBRARY_ORIGIN) \
$(call SET_SHARED_LIBRARY_ORIGIN,/..) \
- -L $(INSTALL_LIBRARIES_HERE), \
+ -L$(INSTALL_LIBRARIES_HERE), \
LDFLAGS_SUFFIX := $(LIBAWT_XAWT_LDFLAGS_SUFFIX), \
VERSIONINFO_RESOURCE := $(GLOBAL_VERSION_INFO_RESOURCE), \
RC_FLAGS := $(RC_FLAGS) \
@@ -421,7 +421,7 @@
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/liblcms/mapfile-vers, \
LDFLAGS := $(LDFLAGS_JDKLIB) \
$(call SET_SHARED_LIBRARY_ORIGIN), \
- LDFLAGS_unix := -L $(INSTALL_LIBRARIES_HERE), \
+ LDFLAGS_unix := -L$(INSTALL_LIBRARIES_HERE), \
LDFLAGS_solaris := /usr/lib$(OPENJDK_TARGET_CPU_ISADIR)/libm.so.2, \
LDFLAGS_windows := $(WIN_AWT_LIB) $(WIN_JAVA_LIB), \
LDFLAGS_SUFFIX_solaris := -lawt -ljava -ljvm -lc $(LCMS_LIBS), \
@@ -581,7 +581,7 @@
MAPFILE := $(BUILD_LIBFONTMANAGER_MAPFILE), \
LDFLAGS := $(subst -Xlinker -z -Xlinker defs,,$(LDFLAGS_JDKLIB)) $(LDFLAGS_CXX_JDK) \
$(call SET_SHARED_LIBRARY_ORIGIN), \
- LDFLAGS_unix := -L $(INSTALL_LIBRARIES_HERE), \
+ LDFLAGS_unix := -L$(INSTALL_LIBRARIES_HERE), \
LDFLAGS_SUFFIX := $(BUILD_LIBFONTMANAGER_FONTLIB), \
LDFLAGS_SUFFIX_linux := -lawt $(LIBM) $(LIBCXX) -ljava -ljvm -lc, \
LDFLAGS_SUFFIX_solaris := $(filter-out -R%, $(X_LIBS)) \
@@ -698,7 +698,7 @@
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libjawt/mapfile-vers, \
LDFLAGS := $(LDFLAGS_JDKLIB) \
$(call SET_SHARED_LIBRARY_ORIGIN), \
- LDFLAGS_unix := -L $(INSTALL_LIBRARIES_HERE), \
+ LDFLAGS_unix := -L$(INSTALL_LIBRARIES_HERE), \
LDFLAGS_solaris := $(X_LIBS), \
LDFLAGS_SUFFIX_linux := $(JAWT_LIBS) $(LDFLAGS_JDKLIB_SUFFIX), \
LDFLAGS_SUFFIX_aix := $(JAWT_LIBS) $(LDFLAGS_JDKLIB_SUFFIX),\
@@ -775,7 +775,7 @@
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libawt_headless/mapfile-vers, \
LDFLAGS := $(LDFLAGS_JDKLIB) \
$(call SET_SHARED_LIBRARY_ORIGIN), \
- LDFLAGS_unix := -L $(INSTALL_LIBRARIES_HERE), \
+ LDFLAGS_unix := -L$(INSTALL_LIBRARIES_HERE), \
LDFLAGS_linux := $(call SET_SHARED_LIBRARY_ORIGIN,/..), \
LDFLAGS_solaris := $(call SET_SHARED_LIBRARY_ORIGIN,/..), \
LDFLAGS_macosx := $(call SET_SHARED_LIBRARY_ORIGIN)., \
@@ -954,7 +954,7 @@
$(LIBAWT_LWAWT_CFLAGS), \
LDFLAGS := $(LDFLAGS_JDKLIB) \
$(call SET_SHARED_LIBRARY_ORIGIN) \
- -L $(INSTALL_LIBRARIES_HERE), \
+ -L$(INSTALL_LIBRARIES_HERE), \
LDFLAGS_SUFFIX_macosx := -lawt -lmlib_image -losxapp -ljvm $(LIBM) \
-framework Accelerate \
-framework ApplicationServices \
@@ -1002,7 +1002,7 @@
LDFLAGS := $(LDFLAGS_JDKLIB) \
$(call SET_SHARED_LIBRARY_ORIGIN) \
-Xlinker -rpath -Xlinker @loader_path \
- -L $(INSTALL_LIBRARIES_HERE), \
+ -L$(INSTALL_LIBRARIES_HERE), \
LDFLAGS_SUFFIX_macosx := -lawt -losxapp -lawt_lwawt \
-framework Cocoa \
-framework Carbon \
--- a/jdk/make/lib/Lib-java.instrument.gmk Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/make/lib/Lib-java.instrument.gmk Thu Dec 11 12:27:27 2014 -0800
@@ -72,8 +72,8 @@
-framework Cocoa -framework Security -framework ApplicationServices, \
LDFLAGS_SUFFIX := $(LIBINSTRUMENT_LDFLAGS_SUFFIX), \
LDFLAGS_SUFFIX_macosx := -liconv $(LIBZ), \
- LDFLAGS_SUFFIX_solaris := $(LIBZ) -L $(call FindLibDirForModule, java.base)/jli -ljli $(LIBDL) -lc, \
- LDFLAGS_SUFFIX_linux := $(LIBZ) -L $(call FindLibDirForModule, java.base)/jli -ljli $(LIBDL), \
+ LDFLAGS_SUFFIX_solaris := $(LIBZ) -L$(call FindLibDirForModule, java.base)/jli -ljli $(LIBDL) -lc, \
+ LDFLAGS_SUFFIX_linux := $(LIBZ) -L$(call FindLibDirForModule, java.base)/jli -ljli $(LIBDL), \
LDFLAGS_SUFFIX_aix := $(LIBZ) -L$(SUPPORT_OUTPUTDIR)/native/java.base -ljli_static $(LIBDL),\
VERSIONINFO_RESOURCE := $(GLOBAL_VERSION_INFO_RESOURCE), \
RC_FLAGS := $(RC_FLAGS) \
--- a/jdk/make/lib/LibCommon.gmk Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/make/lib/LibCommon.gmk Thu Dec 11 12:27:27 2014 -0800
@@ -79,7 +79,9 @@
# Param 2 - library name
# Param 3 - subdir for library
define FindLib
- $(call FindLibDirForModule, $(strip $1))$(strip $3)/$(LIBRARY_PREFIX)$(strip $2)$(SHARED_LIBRARY_SUFFIX)
+$(strip \
+ $(call FindLibDirForModule, $(strip $1))$(strip $3)/$(LIBRARY_PREFIX)$(strip $2)$(SHARED_LIBRARY_SUFFIX) \
+)
endef
################################################################################
--- a/jdk/make/src/classes/build/tools/module/ImageBuilder.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/make/src/classes/build/tools/module/ImageBuilder.java Thu Dec 11 12:27:27 2014 -0800
@@ -349,21 +349,6 @@
return (new SimpleResolver(mods, moduleGraph)).resolve();
}
- /**
- * chmod ugo+x file
- */
- private void setExecutable(Path file) {
- try {
- Set<PosixFilePermission> perms = Files.getPosixFilePermissions(file);
- perms.add(PosixFilePermission.OWNER_EXECUTE);
- perms.add(PosixFilePermission.GROUP_EXECUTE);
- perms.add(PosixFilePermission.OTHERS_EXECUTE);
- Files.setPosixFilePermissions(file, perms);
- } catch (IOException ioe) {
- throw new UncheckedIOException(ioe);
- }
- }
-
private void createImage() throws IOException {
Collection<String> modules = resolve(options.mods);
log.print(modules.stream().collect(Collectors.joining(" ")));
@@ -377,7 +362,7 @@
.filter(f -> f.getFileName().equals(jspawnhelper))
.findFirst();
if (helper.isPresent())
- setExecutable(helper.get());
+ helper.get().toFile().setExecutable(true, false);
}
private class ImageFileHelper {
--- a/jdk/make/src/classes/build/tools/module/ModuleArchive.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/make/src/classes/build/tools/module/ModuleArchive.java Thu Dec 11 12:27:27 2014 -0800
@@ -194,7 +194,7 @@
case CMDS:
Path path = destFile("bin", filename);
writeEntry(in, path);
- path.toFile().setExecutable(true);
+ path.toFile().setExecutable(true, false);
break;
case CONFIGS:
writeEntry(in, destFile("conf", filename));
--- a/jdk/src/java.base/macosx/native/libjli/java_md_macosx.c Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.base/macosx/native/libjli/java_md_macosx.c Thu Dec 11 12:27:27 2014 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -38,7 +38,6 @@
#include <sys/time.h>
#include "manifest_info.h"
-#include "version_comp.h"
/* Support Cocoa event loop on the main thread */
#include <Cocoa/Cocoa.h>
@@ -104,10 +103,6 @@
* (incoming argv)
* |
* \|/
- * SelectVersion
- * (selects the JRE version, note: not data model)
- * |
- * \|/
* CreateExecutionEnvironment
* (determines desired data model)
* |
--- a/jdk/src/java.base/share/classes/java/lang/String.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.base/share/classes/java/lang/String.java Thu Dec 11 12:27:27 2014 -0800
@@ -184,8 +184,8 @@
* The length
*
* @throws IndexOutOfBoundsException
- * If the {@code offset} and {@code count} arguments index
- * characters outside the bounds of the {@code value} array
+ * If {@code offset} is negative, {@code count} is negative, or
+ * {@code offset} is greater than {@code value.length - count}
*/
public String(char value[], int offset, int count) {
if (offset < 0) {
@@ -224,8 +224,8 @@
* codePoints}
*
* @throws IndexOutOfBoundsException
- * If the {@code offset} and {@code count} arguments index
- * characters outside the bounds of the {@code codePoints} array
+ * If {@code offset} is negative, {@code count} is negative, or
+ * {@code offset} is greater than {@code codePoints.length - count}
*
* @since 1.5
*/
@@ -297,7 +297,8 @@
* The length
*
* @throws IndexOutOfBoundsException
- * If the {@code offset} or {@code count} argument is invalid
+ * If {@code offset} is negative, {@code count} is negative, or
+ * {@code offset} is greater than {@code ascii.length - count}
*
* @see #String(byte[], int)
* @see #String(byte[], int, int, java.lang.String)
@@ -401,8 +402,8 @@
* If the named charset is not supported
*
* @throws IndexOutOfBoundsException
- * If the {@code offset} and {@code length} arguments index
- * characters outside the bounds of the {@code bytes} array
+ * If {@code offset} is negative, {@code length} is negative, or
+ * {@code offset} is greater than {@code bytes.length - length}
*
* @since 1.1
*/
@@ -439,8 +440,8 @@
* decode the {@code bytes}
*
* @throws IndexOutOfBoundsException
- * If the {@code offset} and {@code length} arguments index
- * characters outside the bounds of the {@code bytes} array
+ * If {@code offset} is negative, {@code length} is negative, or
+ * {@code offset} is greater than {@code bytes.length - length}
*
* @since 1.6
*/
@@ -524,8 +525,8 @@
* The number of bytes to decode
*
* @throws IndexOutOfBoundsException
- * If the {@code offset} and the {@code length} arguments index
- * characters outside the bounds of the {@code bytes} array
+ * If {@code offset} is negative, {@code length} is negative, or
+ * {@code offset} is greater than {@code bytes.length - length}
*
* @since 1.1
*/
--- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java Thu Dec 11 12:27:27 2014 -0800
@@ -2028,7 +2028,7 @@
MethodType oldType = target.type();
if (oldType == newType) return target;
if (oldType.explicitCastEquivalentToAsType(newType)) {
- return target.asType(newType);
+ return target.asFixedArity().asType(newType);
}
return MethodHandleImpl.makePairwiseConvert(target, newType, false);
}
--- a/jdk/src/java.base/share/classes/java/nio/channels/Channels.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.base/share/classes/java/nio/channels/Channels.java Thu Dec 11 12:27:27 2014 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -38,6 +38,7 @@
import java.nio.charset.CharsetEncoder;
import java.nio.charset.UnsupportedCharsetException;
import java.nio.channels.spi.AbstractInterruptibleChannel;
+import java.util.Objects;
import java.util.concurrent.ExecutionException;
import sun.nio.ch.ChannelInputStream;
import sun.nio.cs.StreamDecoder;
@@ -48,8 +49,8 @@
* Utility methods for channels and streams.
*
* <p> This class defines static methods that support the interoperation of the
- * stream classes of the <tt>{@link java.io}</tt> package with the channel
- * classes of this package. </p>
+ * stream classes of the {@link java.io} package with the channel classes
+ * of this package. </p>
*
*
* @author Mark Reinhold
@@ -60,12 +61,7 @@
public final class Channels {
- private Channels() { } // No instantiation
-
- private static void checkNotNull(Object o, String name) {
- if (o == null)
- throw new NullPointerException("\"" + name + "\" is null!");
- }
+ private Channels() { throw new Error("no instances"); }
/**
* Write all remaining bytes in buffer to the given channel.
@@ -91,7 +87,7 @@
throws IOException
{
if (ch instanceof SelectableChannel) {
- SelectableChannel sc = (SelectableChannel)ch;
+ SelectableChannel sc = (SelectableChannel) ch;
synchronized (sc.blockingLock()) {
if (!sc.isBlocking())
throw new IllegalBlockingModeException();
@@ -107,7 +103,7 @@
/**
* Constructs a stream that reads bytes from the given channel.
*
- * <p> The <tt>read</tt> methods of the resulting stream will throw an
+ * <p> The {@code read} methods of the resulting stream will throw an
* {@link IllegalBlockingModeException} if invoked while the underlying
* channel is in non-blocking mode. The stream will not be buffered, and
* it will not support the {@link InputStream#mark mark} or {@link
@@ -121,14 +117,14 @@
* @return A new input stream
*/
public static InputStream newInputStream(ReadableByteChannel ch) {
- checkNotNull(ch, "ch");
- return new sun.nio.ch.ChannelInputStream(ch);
+ Objects.requireNonNull(ch, "ch");
+ return new ChannelInputStream(ch);
}
/**
* Constructs a stream that writes bytes to the given channel.
*
- * <p> The <tt>write</tt> methods of the resulting stream will throw an
+ * <p> The {@code write} methods of the resulting stream will throw an
* {@link IllegalBlockingModeException} if invoked while the underlying
* channel is in non-blocking mode. The stream will not be buffered. The
* stream will be safe for access by multiple concurrent threads. Closing
@@ -139,46 +135,49 @@
*
* @return A new output stream
*/
- public static OutputStream newOutputStream(final WritableByteChannel ch) {
- checkNotNull(ch, "ch");
+ public static OutputStream newOutputStream(WritableByteChannel ch) {
+ Objects.requireNonNull(ch, "ch");
return new OutputStream() {
- private ByteBuffer bb = null;
- private byte[] bs = null; // Invoker's previous array
- private byte[] b1 = null;
+ private ByteBuffer bb;
+ private byte[] bs; // Invoker's previous array
+ private byte[] b1;
- public synchronized void write(int b) throws IOException {
- if (b1 == null)
- b1 = new byte[1];
- b1[0] = (byte)b;
- this.write(b1);
- }
+ @Override
+ public synchronized void write(int b) throws IOException {
+ if (b1 == null)
+ b1 = new byte[1];
+ b1[0] = (byte) b;
+ this.write(b1);
+ }
- public synchronized void write(byte[] bs, int off, int len)
+ @Override
+ public synchronized void write(byte[] bs, int off, int len)
throws IOException
- {
- if ((off < 0) || (off > bs.length) || (len < 0) ||
- ((off + len) > bs.length) || ((off + len) < 0)) {
- throw new IndexOutOfBoundsException();
- } else if (len == 0) {
- return;
- }
- ByteBuffer bb = ((this.bs == bs)
- ? this.bb
- : ByteBuffer.wrap(bs));
- bb.limit(Math.min(off + len, bb.capacity()));
- bb.position(off);
- this.bb = bb;
- this.bs = bs;
- Channels.writeFully(ch, bb);
+ {
+ if ((off < 0) || (off > bs.length) || (len < 0) ||
+ ((off + len) > bs.length) || ((off + len) < 0)) {
+ throw new IndexOutOfBoundsException();
+ } else if (len == 0) {
+ return;
}
+ ByteBuffer bb = ((this.bs == bs)
+ ? this.bb
+ : ByteBuffer.wrap(bs));
+ bb.limit(Math.min(off + len, bb.capacity()));
+ bb.position(off);
+ this.bb = bb;
+ this.bs = bs;
+ Channels.writeFully(ch, bb);
+ }
- public void close() throws IOException {
- ch.close();
- }
+ @Override
+ public void close() throws IOException {
+ ch.close();
+ }
- };
+ };
}
/**
@@ -196,13 +195,13 @@
*
* @since 1.7
*/
- public static InputStream newInputStream(final AsynchronousByteChannel ch) {
- checkNotNull(ch, "ch");
+ public static InputStream newInputStream(AsynchronousByteChannel ch) {
+ Objects.requireNonNull(ch, "ch");
return new InputStream() {
- private ByteBuffer bb = null;
- private byte[] bs = null; // Invoker's previous array
- private byte[] b1 = null;
+ private ByteBuffer bb;
+ private byte[] bs; // Invoker's previous array
+ private byte[] b1;
@Override
public synchronized int read() throws IOException {
@@ -216,13 +215,14 @@
@Override
public synchronized int read(byte[] bs, int off, int len)
- throws IOException
+ throws IOException
{
if ((off < 0) || (off > bs.length) || (len < 0) ||
((off + len) > bs.length) || ((off + len) < 0)) {
throw new IndexOutOfBoundsException();
- } else if (len == 0)
+ } else if (len == 0) {
return 0;
+ }
ByteBuffer bb = ((this.bs == bs)
? this.bb
@@ -270,25 +270,25 @@
*
* @since 1.7
*/
- public static OutputStream newOutputStream(final AsynchronousByteChannel ch) {
- checkNotNull(ch, "ch");
+ public static OutputStream newOutputStream(AsynchronousByteChannel ch) {
+ Objects.requireNonNull(ch, "ch");
return new OutputStream() {
- private ByteBuffer bb = null;
- private byte[] bs = null; // Invoker's previous array
- private byte[] b1 = null;
+ private ByteBuffer bb;
+ private byte[] bs; // Invoker's previous array
+ private byte[] b1;
@Override
public synchronized void write(int b) throws IOException {
- if (b1 == null)
+ if (b1 == null)
b1 = new byte[1];
- b1[0] = (byte)b;
+ b1[0] = (byte) b;
this.write(b1);
}
@Override
public synchronized void write(byte[] bs, int off, int len)
- throws IOException
+ throws IOException
{
if ((off < 0) || (off > bs.length) || (len < 0) ||
((off + len) > bs.length) || ((off + len) < 0)) {
@@ -343,12 +343,11 @@
*
* @return A new readable byte channel
*/
- public static ReadableByteChannel newChannel(final InputStream in) {
- checkNotNull(in, "in");
+ public static ReadableByteChannel newChannel(InputStream in) {
+ Objects.requireNonNull(in, "in");
- if (in instanceof FileInputStream &&
- FileInputStream.class.equals(in.getClass())) {
- return ((FileInputStream)in).getChannel();
+ if (in.getClass() == FileInputStream.class) {
+ return ((FileInputStream) in).getChannel();
}
return new ReadableByteChannelImpl(in);
@@ -358,16 +357,16 @@
extends AbstractInterruptibleChannel // Not really interruptible
implements ReadableByteChannel
{
- InputStream in;
+ private final InputStream in;
private static final int TRANSFER_SIZE = 8192;
- private byte buf[] = new byte[0];
- private boolean open = true;
- private Object readLock = new Object();
+ private byte[] buf = new byte[0];
+ private final Object readLock = new Object();
ReadableByteChannelImpl(InputStream in) {
this.in = in;
}
+ @Override
public int read(ByteBuffer dst) throws IOException {
int len = dst.remaining();
int totalRead = 0;
@@ -399,9 +398,9 @@
}
}
+ @Override
protected void implCloseChannel() throws IOException {
in.close();
- open = false;
}
}
@@ -418,12 +417,11 @@
*
* @return A new writable byte channel
*/
- public static WritableByteChannel newChannel(final OutputStream out) {
- checkNotNull(out, "out");
+ public static WritableByteChannel newChannel(OutputStream out) {
+ Objects.requireNonNull(out, "out");
- if (out instanceof FileOutputStream &&
- FileOutputStream.class.equals(out.getClass())) {
- return ((FileOutputStream)out).getChannel();
+ if (out.getClass() == FileOutputStream.class) {
+ return ((FileOutputStream) out).getChannel();
}
return new WritableByteChannelImpl(out);
@@ -433,16 +431,16 @@
extends AbstractInterruptibleChannel // Not really interruptible
implements WritableByteChannel
{
- OutputStream out;
+ private final OutputStream out;
private static final int TRANSFER_SIZE = 8192;
- private byte buf[] = new byte[0];
- private boolean open = true;
- private Object writeLock = new Object();
+ private byte[] buf = new byte[0];
+ private final Object writeLock = new Object();
WritableByteChannelImpl(OutputStream out) {
this.out = out;
}
+ @Override
public int write(ByteBuffer src) throws IOException {
int len = src.remaining();
int totalWritten = 0;
@@ -465,9 +463,9 @@
}
}
+ @Override
protected void implCloseChannel() throws IOException {
out.close();
- open = false;
}
}
@@ -479,7 +477,7 @@
* given decoder.
*
* <p> The resulting stream will contain an internal input buffer of at
- * least <tt>minBufferCap</tt> bytes. The stream's <tt>read</tt> methods
+ * least {@code minBufferCap} bytes. The stream's {@code read} methods
* will, as needed, fill the buffer by reading bytes from the underlying
* channel; if the channel is in non-blocking mode when bytes are to be
* read then an {@link IllegalBlockingModeException} will be thrown. The
@@ -495,7 +493,7 @@
*
* @param minBufferCap
* The minimum capacity of the internal byte buffer,
- * or <tt>-1</tt> if an implementation-dependent
+ * or {@code -1} if an implementation-dependent
* default capacity is to be used
*
* @return A new reader
@@ -504,7 +502,7 @@
CharsetDecoder dec,
int minBufferCap)
{
- checkNotNull(ch, "ch");
+ Objects.requireNonNull(ch, "ch");
return StreamDecoder.forDecoder(ch, dec.reset(), minBufferCap);
}
@@ -514,16 +512,15 @@
*
* <p> An invocation of this method of the form
*
- * <blockquote><pre>
- * Channels.newReader(ch, csname)</pre></blockquote>
+ * <pre> {@code
+ * Channels.newReader(ch, csname)
+ * } </pre>
*
* behaves in exactly the same way as the expression
*
- * <blockquote><pre>
- * Channels.newReader(ch,
- * Charset.forName(csName)
- * .newDecoder(),
- * -1);</pre></blockquote>
+ * <pre> {@code
+ * Channels.newReader(ch, Charset.forName(csName).newDecoder(), -1)
+ * } </pre>
*
* @param ch
* The channel from which bytes will be read
@@ -540,7 +537,7 @@
public static Reader newReader(ReadableByteChannel ch,
String csName)
{
- checkNotNull(csName, "csName");
+ Objects.requireNonNull(csName, "csName");
return newReader(ch, Charset.forName(csName).newDecoder(), -1);
}
@@ -549,7 +546,7 @@
* writes the resulting bytes to the given channel.
*
* <p> The resulting stream will contain an internal output buffer of at
- * least <tt>minBufferCap</tt> bytes. The stream's <tt>write</tt> methods
+ * least {@code minBufferCap} bytes. The stream's {@code write} methods
* will, as needed, flush the buffer by writing bytes to the underlying
* channel; if the channel is in non-blocking mode when bytes are to be
* written then an {@link IllegalBlockingModeException} will be thrown.
@@ -564,16 +561,16 @@
*
* @param minBufferCap
* The minimum capacity of the internal byte buffer,
- * or <tt>-1</tt> if an implementation-dependent
+ * or {@code -1} if an implementation-dependent
* default capacity is to be used
*
* @return A new writer
*/
- public static Writer newWriter(final WritableByteChannel ch,
- final CharsetEncoder enc,
- final int minBufferCap)
+ public static Writer newWriter(WritableByteChannel ch,
+ CharsetEncoder enc,
+ int minBufferCap)
{
- checkNotNull(ch, "ch");
+ Objects.requireNonNull(ch, "ch");
return StreamEncoder.forEncoder(ch, enc.reset(), minBufferCap);
}
@@ -582,17 +579,15 @@
* charset and writes the resulting bytes to the given channel.
*
* <p> An invocation of this method of the form
- *
- * <blockquote><pre>
- * Channels.newWriter(ch, csname)</pre></blockquote>
- *
+ * <p>
+ * <pre> {@code
+ * Channels.newWriter(ch, csname)
+ * } </pre>
* behaves in exactly the same way as the expression
- *
- * <blockquote><pre>
- * Channels.newWriter(ch,
- * Charset.forName(csName)
- * .newEncoder(),
- * -1);</pre></blockquote>
+ * <p>
+ * <pre> {@code
+ * Channels.newWriter(ch, Charset.forName(csName).newEncoder(), -1)
+ * } </pre>
*
* @param ch
* The channel to which bytes will be written
@@ -609,7 +604,7 @@
public static Writer newWriter(WritableByteChannel ch,
String csName)
{
- checkNotNull(csName, "csName");
+ Objects.requireNonNull(csName, "csName");
return newWriter(ch, Charset.forName(csName).newEncoder(), -1);
}
}
--- a/jdk/src/java.base/share/classes/java/text/ChoiceFormat.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.base/share/classes/java/text/ChoiceFormat.java Thu Dec 11 12:27:27 2014 -0800
@@ -272,7 +272,7 @@
double tryLess = Math.abs(Math.IEEEremainder(less, 1.0d));
if (tryLessOrEqual < tryLess) {
- result.append(""+choiceLimits[i]);
+ result.append(choiceLimits[i]);
result.append('#');
} else {
if (choiceLimits[i] == Double.POSITIVE_INFINITY) {
@@ -280,7 +280,7 @@
} else if (choiceLimits[i] == Double.NEGATIVE_INFINITY) {
result.append("-\u221E");
} else {
- result.append(""+less);
+ result.append(less);
}
result.append('<');
}
--- a/jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java Thu Dec 11 12:27:27 2014 -0800
@@ -369,10 +369,9 @@
static void appendVmErgoMessage(boolean isServerClass, String vm) {
outBuf = outBuf.append(getLocalizedMessage("java.launcher.ergo.message1",
vm));
- outBuf = (isServerClass)
- ? outBuf.append(",\n" +
- getLocalizedMessage("java.launcher.ergo.message2") + "\n\n")
- : outBuf.append(".\n\n");
+ outBuf = (isServerClass) ? outBuf.append(",\n")
+ .append(getLocalizedMessage("java.launcher.ergo.message2"))
+ .append("\n\n") : outBuf.append(".\n\n");
}
/**
--- a/jdk/src/java.base/share/classes/sun/net/www/HeaderParser.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.base/share/classes/sun/net/www/HeaderParser.java Thu Dec 11 12:27:27 2014 -0800
@@ -220,21 +220,23 @@
public String toString () {
Iterator<String> k = keys();
- StringBuffer sbuf = new StringBuffer();
- sbuf.append ("{size="+asize+" nkeys="+nkeys+" ");
+ StringBuilder sb = new StringBuilder();
+ sb.append("{size=").append(asize).append(" nkeys=").append(nkeys)
+ .append(' ');
for (int i=0; k.hasNext(); i++) {
String key = k.next();
String val = findValue (i);
if (val != null && "".equals (val)) {
val = null;
}
- sbuf.append (" {"+key+(val==null?"":","+val)+"}");
+ sb.append(" {").append(key).append(val == null ? "" : "," + val)
+ .append('}');
if (k.hasNext()) {
- sbuf.append (",");
+ sb.append (',');
}
}
- sbuf.append (" }");
- return new String (sbuf);
+ sb.append (" }");
+ return sb.toString();
}
public int findInt(String k, int Default) {
--- a/jdk/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java Thu Dec 11 12:27:27 2014 -0800
@@ -38,6 +38,7 @@
import java.nio.channels.NonWritableChannelException;
import java.nio.channels.OverlappingFileLockException;
import java.nio.channels.ReadableByteChannel;
+import java.nio.channels.SelectableChannel;
import java.nio.channels.WritableByteChannel;
import java.security.AccessController;
import java.util.ArrayList;
@@ -404,30 +405,13 @@
//
private static volatile boolean fileSupported = true;
- private long transferToDirectly(long position, int icount,
- WritableByteChannel target)
+ private long transferToDirectlyInternal(long position, int icount,
+ WritableByteChannel target,
+ FileDescriptor targetFD)
throws IOException
{
- if (!transferSupported)
- return IOStatus.UNSUPPORTED;
-
- FileDescriptor targetFD = null;
- if (target instanceof FileChannelImpl) {
- if (!fileSupported)
- return IOStatus.UNSUPPORTED_CASE;
- targetFD = ((FileChannelImpl)target).fd;
- } else if (target instanceof SelChImpl) {
- // Direct transfer to pipe causes EINVAL on some configurations
- if ((target instanceof SinkChannelImpl) && !pipeSupported)
- return IOStatus.UNSUPPORTED_CASE;
- targetFD = ((SelChImpl)target).getFD();
- }
- if (targetFD == null)
- return IOStatus.UNSUPPORTED;
- int thisFDVal = IOUtil.fdVal(fd);
- int targetFDVal = IOUtil.fdVal(targetFD);
- if (thisFDVal == targetFDVal) // Not supported on some configurations
- return IOStatus.UNSUPPORTED;
+ assert !nd.transferToDirectlyNeedsPositionLock() ||
+ Thread.holdsLock(positionLock);
long n = -1;
int ti = -1;
@@ -437,7 +421,7 @@
if (!isOpen())
return -1;
do {
- n = transferTo0(thisFDVal, position, icount, targetFDVal);
+ n = transferTo0(fd, position, icount, targetFD);
} while ((n == IOStatus.INTERRUPTED) && isOpen());
if (n == IOStatus.UNSUPPORTED_CASE) {
if (target instanceof SinkChannelImpl)
@@ -458,6 +442,54 @@
}
}
+ private long transferToDirectly(long position, int icount,
+ WritableByteChannel target)
+ throws IOException
+ {
+ if (!transferSupported)
+ return IOStatus.UNSUPPORTED;
+
+ FileDescriptor targetFD = null;
+ if (target instanceof FileChannelImpl) {
+ if (!fileSupported)
+ return IOStatus.UNSUPPORTED_CASE;
+ targetFD = ((FileChannelImpl)target).fd;
+ } else if (target instanceof SelChImpl) {
+ // Direct transfer to pipe causes EINVAL on some configurations
+ if ((target instanceof SinkChannelImpl) && !pipeSupported)
+ return IOStatus.UNSUPPORTED_CASE;
+
+ // Platform-specific restrictions. Now there is only one:
+ // Direct transfer to non-blocking channel could be forbidden
+ SelectableChannel sc = (SelectableChannel)target;
+ if (!nd.canTransferToDirectly(sc))
+ return IOStatus.UNSUPPORTED_CASE;
+
+ targetFD = ((SelChImpl)target).getFD();
+ }
+
+ if (targetFD == null)
+ return IOStatus.UNSUPPORTED;
+ int thisFDVal = IOUtil.fdVal(fd);
+ int targetFDVal = IOUtil.fdVal(targetFD);
+ if (thisFDVal == targetFDVal) // Not supported on some configurations
+ return IOStatus.UNSUPPORTED;
+
+ if (nd.transferToDirectlyNeedsPositionLock()) {
+ synchronized (positionLock) {
+ long pos = position();
+ try {
+ return transferToDirectlyInternal(position, icount,
+ target, targetFD);
+ } finally {
+ position(pos);
+ }
+ }
+ } else {
+ return transferToDirectlyInternal(position, icount, target, targetFD);
+ }
+ }
+
// Maximum size to map when using a mapped buffer
private static final long MAPPED_TRANSFER_SIZE = 8L*1024L*1024L;
@@ -1173,7 +1205,8 @@
private static native int unmap0(long address, long length);
// Transfers from src to dst, or returns -2 if kernel can't do that
- private native long transferTo0(int src, long position, long count, int dst);
+ private native long transferTo0(FileDescriptor src, long position,
+ long count, FileDescriptor dst);
// Sets or reports this file's position
// If offset is -1, the current position is returned
--- a/jdk/src/java.base/share/classes/sun/nio/ch/FileDispatcher.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.base/share/classes/sun/nio/ch/FileDispatcher.java Thu Dec 11 12:27:27 2014 -0800
@@ -25,7 +25,9 @@
package sun.nio.ch;
-import java.io.*;
+import java.io.FileDescriptor;
+import java.io.IOException;
+import java.nio.channels.SelectableChannel;
abstract class FileDispatcher extends NativeDispatcher {
@@ -53,4 +55,8 @@
*/
abstract FileDescriptor duplicateForMapping(FileDescriptor fd)
throws IOException;
+
+ abstract boolean canTransferToDirectly(SelectableChannel sc);
+
+ abstract boolean transferToDirectlyNeedsPositionLock();
}
--- a/jdk/src/java.base/share/classes/sun/security/ssl/HandshakeMessage.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/HandshakeMessage.java Thu Dec 11 12:27:27 2014 -0800
@@ -1478,7 +1478,7 @@
boolean opened = false;
for (SignatureAndHashAlgorithm signAlg : algorithms) {
if (opened) {
- sb.append(", " + signAlg.getAlgorithmName());
+ sb.append(", ").append(signAlg.getAlgorithmName());
} else {
sb.append(signAlg.getAlgorithmName());
opened = true;
--- a/jdk/src/java.base/share/native/libjli/emessages.h Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.base/share/native/libjli/emessages.h Thu Dec 11 12:27:27 2014 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -72,9 +72,6 @@
#define CFG_ERROR8 "Error: missing `%s' JVM at `%s'.\nPlease install or use the JRE or JDK that contains these missing components."
#define CFG_ERROR9 "Error: could not determine JVM type."
-
-#define SPC_ERROR1 "Error: Syntax error in version specification \"%s\""
-
#define JRE_ERROR1 "Error: Could not find Java SE Runtime Environment."
#define JRE_ERROR2 "Error: This Java instance does not support a %d-bit JVM.\nPlease install the desired version."
#define JRE_ERROR3 "Error: Improper value at line %d."
@@ -89,6 +86,9 @@
#define JRE_ERROR12 "Error: Exec of %s failed"
#define JRE_ERROR13 "Error: String processing operation failed"
+#define SPC_ERROR1 "Error: Specifying an alternate JDK/JRE version is no longer supported.\n The use of the flag '-version:' is no longer valid.\n Please download and execute the appropriate version."
+#define SPC_ERROR2 "Error: Specifying an alternate JDK/JRE is no longer supported.\n The related flags -jre-restrict-search | -jre-no-restrict-search are also no longer valid."
+
#define DLL_ERROR1 "Error: dl failure on line %d"
#define DLL_ERROR2 "Error: failed %s, because %s"
#define DLL_ERROR3 "Error: could not find executable %s"
--- a/jdk/src/java.base/share/native/libjli/java.c Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.base/share/native/libjli/java.c Thu Dec 11 12:27:27 2014 -0800
@@ -216,21 +216,14 @@
}
/*
- * Make sure the specified version of the JRE is running.
+ * SelectVersion() has several responsibilities:
*
- * There are three things to note about the SelectVersion() routine:
- * 1) If the version running isn't correct, this routine doesn't
- * return (either the correct version has been exec'd or an error
- * was issued).
- * 2) Argc and Argv in this scope are *not* altered by this routine.
- * It is the responsibility of subsequent code to ignore the
- * arguments handled by this routine.
- * 3) As a side-effect, the variable "main_class" is guaranteed to
- * be set (if it should ever be set). This isn't exactly the
- * poster child for structured programming, but it is a small
- * price to pay for not processing a jar file operand twice.
- * (Note: This side effect has been disabled. See comment on
- * bugid 5030265 below.)
+ * 1) Disallow specification of another JRE. With 1.9, another
+ * version of the JRE cannot be invoked.
+ * 2) Allow for a JRE version to invoke JDK 1.9 or later. Since
+ * all mJRE directives have been stripped from the request but
+ * the pre 1.9 JRE [ 1.6 thru 1.8 ], it is as if 1.9+ has been
+ * invoked from the command line.
*/
SelectVersion(argc, argv, &main_class);
@@ -829,8 +822,6 @@
SelectVersion(int argc, char **argv, char **main_class)
{
char *arg;
- char **new_argv;
- char **new_argp;
char *operand;
char *version = NULL;
char *jre = NULL;
@@ -849,6 +840,17 @@
* with the value passed through the environment (if any) and
* simply return.
*/
+
+ /*
+ * This environmental variable can be set by mJRE capable JREs
+ * [ 1.5 thru 1.8 ]. All other aspects of mJRE processing have been
+ * stripped by those JREs. This environmental variable allows 1.9+
+ * JREs to be started by these mJRE capable JREs.
+ * Note that mJRE directives in the jar manifest file would have been
+ * ignored for a JRE started by another JRE...
+ * .. skipped for JRE 1.5 and beyond.
+ * .. not even checked for pre 1.5.
+ */
if ((env_in = getenv(ENV_ENTRY)) != NULL) {
if (*env_in != '\0')
*main_class = JLI_StringDup(env_in);
@@ -857,41 +859,26 @@
/*
* Scan through the arguments for options relevant to multiple JRE
- * support. For reference, the command line syntax is defined as:
- *
- * SYNOPSIS
- * java [options] class [argument...]
- *
- * java [options] -jar file.jar [argument...]
+ * support. Multiple JRE support existed in JRE versions 1.5 thru 1.8.
*
- * As the scan is performed, make a copy of the argument list with
- * the version specification options (new to 1.5) removed, so that
- * a version less than 1.5 can be exec'd.
- *
- * Note that due to the syntax of the native Windows interface
- * CreateProcess(), processing similar to the following exists in
- * the Windows platform specific routine ExecJRE (in java_md.c).
- * Changes here should be reproduced there.
+ * This capability is no longer available with JRE versions 1.9 and later.
+ * These command line options are reported as errors.
*/
- new_argv = JLI_MemAlloc((argc + 1) * sizeof(char*));
- new_argv[0] = argv[0];
- new_argp = &new_argv[1];
argc--;
argv++;
while ((arg = *argv) != 0 && *arg == '-') {
if (JLI_StrCCmp(arg, "-version:") == 0) {
- version = arg + 9;
+ JLI_ReportErrorMessage(SPC_ERROR1);
} else if (JLI_StrCmp(arg, "-jre-restrict-search") == 0) {
- restrict_search = 1;
- } else if (JLI_StrCmp(arg, "-no-jre-restrict-search") == 0) {
- restrict_search = 0;
+ JLI_ReportErrorMessage(SPC_ERROR2);
+ } else if (JLI_StrCmp(arg, "-jre-no-restrict-search") == 0) {
+ JLI_ReportErrorMessage(SPC_ERROR2);
} else {
if (JLI_StrCmp(arg, "-jar") == 0)
jarflag = 1;
/* deal with "unfortunate" classpath syntax */
if ((JLI_StrCmp(arg, "-classpath") == 0 || JLI_StrCmp(arg, "-cp") == 0) &&
(argc >= 2)) {
- *new_argp++ = arg;
argc--;
argv++;
arg = *argv;
@@ -908,7 +895,6 @@
} else if (JLI_StrCCmp(arg, "-splash:") == 0) {
splash_file_name = arg+8;
}
- *new_argp++ = arg;
}
argc--;
argv++;
@@ -917,11 +903,8 @@
operand = NULL;
} else {
argc--;
- *new_argp++ = operand = *argv++;
+ operand = *argv++;
}
- while (argc-- > 0) /* Copy over [argument...] */
- *new_argp++ = *argv++;
- *new_argp = NULL;
/*
* If there is a jar file, read the manifest. If the jarfile can't be
@@ -974,14 +957,6 @@
putenv(splash_jar_entry);
}
- /*
- * The JRE-Version and JRE-Restrict-Search values (if any) from the
- * manifest are overwritten by any specified on the command line.
- */
- if (version != NULL)
- info.jre_version = version;
- if (restrict_search != -1)
- info.jre_restrict_search = restrict_search;
/*
* "Valid" returns (other than unrecoverable errors) follow. Set
@@ -990,72 +965,11 @@
if (info.main_class != NULL)
*main_class = JLI_StringDup(info.main_class);
- /*
- * If no version selection information is found either on the command
- * line or in the manifest, simply return.
- */
if (info.jre_version == NULL) {
JLI_FreeManifest();
- JLI_MemFree(new_argv);
return;
}
- /*
- * Check for correct syntax of the version specification (JSR 56).
- */
- if (!JLI_ValidVersionString(info.jre_version)) {
- JLI_ReportErrorMessage(SPC_ERROR1, info.jre_version);
- exit(1);
- }
-
- /*
- * Find the appropriate JVM on the system. Just to be as forgiving as
- * possible, if the standard algorithms don't locate an appropriate
- * jre, check to see if the one running will satisfy the requirements.
- * This can happen on systems which haven't been set-up for multiple
- * JRE support.
- */
- jre = LocateJRE(&info);
- JLI_TraceLauncher("JRE-Version = %s, JRE-Restrict-Search = %s Selected = %s\n",
- (info.jre_version?info.jre_version:"null"),
- (info.jre_restrict_search?"true":"false"), (jre?jre:"null"));
-
- if (jre == NULL) {
- if (JLI_AcceptableRelease(GetFullVersion(), info.jre_version)) {
- JLI_FreeManifest();
- JLI_MemFree(new_argv);
- return;
- } else {
- JLI_ReportErrorMessage(CFG_ERROR4, info.jre_version);
- exit(1);
- }
- }
-
- /*
- * If I'm not the chosen one, exec the chosen one. Returning from
- * ExecJRE indicates that I am indeed the chosen one.
- *
- * The private environment variable _JAVA_VERSION_SET is used to
- * prevent the chosen one from re-reading the manifest file and
- * using the values found within to override the (potential) command
- * line flags stripped from argv (because the target may not
- * understand them). Passing the MainClass value is an optimization
- * to avoid locating, expanding and parsing the manifest extra
- * times.
- */
- if (info.main_class != NULL) {
- if (JLI_StrLen(info.main_class) <= MAXNAMELEN) {
- (void)JLI_StrCat(env_entry, info.main_class);
- } else {
- JLI_ReportErrorMessage(CLS_ERROR5, MAXNAMELEN);
- exit(1);
- }
- }
- (void)putenv(env_entry);
- ExecJRE(jre, new_argv);
- JLI_FreeManifest();
- JLI_MemFree(new_argv);
- return;
}
/*
@@ -1154,10 +1068,7 @@
JLI_StrCmp(arg, "-noasyncgc") == 0) {
/* No longer supported */
JLI_ReportErrorMessage(ARG_WARN, arg);
- } else if (JLI_StrCCmp(arg, "-version:") == 0 ||
- JLI_StrCmp(arg, "-no-jre-restrict-search") == 0 ||
- JLI_StrCmp(arg, "-jre-restrict-search") == 0 ||
- JLI_StrCCmp(arg, "-splash:") == 0) {
+ } else if (JLI_StrCCmp(arg, "-splash:") == 0) {
; /* Ignore machine independent options already handled */
} else if (ProcessPlatformOption(arg)) {
; /* Processing of platform dependent options */
--- a/jdk/src/java.base/share/native/libjli/java.h Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.base/share/native/libjli/java.h Thu Dec 11 12:27:27 2014 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -40,9 +40,7 @@
#include "emessages.h"
#include "java_md.h"
#include "jli_util.h"
-
#include "manifest_info.h"
-#include "version_comp.h"
#include "wildcard.h"
#include "splashscreen.h"
--- a/jdk/src/java.base/share/native/libjli/parse_manifest.c Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.base/share/native/libjli/parse_manifest.c Thu Dec 11 12:27:27 2014 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -588,15 +588,16 @@
}
lp = manifest;
while ((rc = parse_nv_pair(&lp, &name, &value)) > 0) {
- if (JLI_StrCaseCmp(name, "Manifest-Version") == 0)
+ if (JLI_StrCaseCmp(name, "Manifest-Version") == 0) {
info->manifest_version = value;
- else if (JLI_StrCaseCmp(name, "Main-Class") == 0)
+ } else if (JLI_StrCaseCmp(name, "Main-Class") == 0) {
info->main_class = value;
- else if (JLI_StrCaseCmp(name, "JRE-Version") == 0)
- info->jre_version = value;
- else if (JLI_StrCaseCmp(name, "JRE-Restrict-Search") == 0) {
- if (JLI_StrCaseCmp(value, "true") == 0)
- info->jre_restrict_search = 1;
+ } else if (JLI_StrCaseCmp(name, "JRE-Version") == 0) {
+ /*
+ * Manifest specification overridden by command line option
+ * so we will silently override there with no specification.
+ */
+ info->jre_version = 0;
} else if (JLI_StrCaseCmp(name, "Splashscreen-Image") == 0) {
info->splashscreen_image_file_name = value;
}
--- a/jdk/src/java.base/share/native/libjli/version_comp.c Thu Dec 11 11:44:03 2014 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,357 +0,0 @@
-/*
- * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include "jni.h"
-#include "jli_util.h"
-#include "version_comp.h"
-
-/*
- * A collection of useful strings. One should think of these as #define
- * entries, but actual strings can be more efficient (with many compilers).
- */
-static const char *separators = ".-_";
-static const char *zero_string = "0";
-
-/*
- * Validate a string as parsable as a "Java int". If so parsable,
- * return true (non-zero) and store the numeric value at the address
- * passed in as "value"; otherwise return false (zero).
- *
- * Note that the maximum allowable value is 2147483647 as defined by
- * the "Java Language Specification" which precludes the use of native
- * conversion routines which may have other limits.
- *
- * Also note that we don't have to worry about the alternate maximum
- * allowable value of 2147483648 because it is only allowed after
- * the unary negation operator and this grammar doesn't have one
- * of those.
- *
- * Finally, note that a value which exceeds the maximum jint value will
- * return false (zero). This results in the otherwise purely numeric
- * string being compared as a string of characters (as per the spec.)
- */
-static int
-isjavaint(const char *s, jint *value)
-{
- jlong sum = 0;
- jint digit;
- while (*s != '\0')
- if (isdigit(*s)) {
- digit = (jint)((int)(*s++) - (int)('0'));
- sum = (sum * 10) + digit;
- if (sum > 2147483647)
- return (0); /* Overflows jint (but not jlong) */
- } else
- return (0);
- *value = (jint)sum;
- return (1);
-}
-
-/*
- * Modeled after strcmp(), compare two strings (as in the grammar defined
- * in Appendix A of JSR 56). If both strings can be interpreted as
- * Java ints, do a numeric comparison, else it is strcmp().
- */
-static int
-comp_string(const char *s1, const char *s2)
-{
- jint v1, v2;
- if (isjavaint(s1, &v1) && isjavaint(s2, &v2))
- return ((int)(v1 - v2));
- else
- return (JLI_StrCmp(s1, s2));
-}
-
-/*
- * Modeled after strcmp(), compare two version-ids for a Prefix
- * Match as defined in JSR 56.
- */
-int
-JLI_PrefixVersionId(const char *id1, char *id2)
-{
- char *s1 = JLI_StringDup(id1);
- char *s2 = JLI_StringDup(id2);
- char *m1 = s1;
- char *m2 = s2;
- char *end1 = NULL;
- char *end2 = NULL;
- int res = 0;
-
- do {
-
- if ((s1 != NULL) && ((end1 = JLI_StrPBrk(s1, ".-_")) != NULL))
- *end1 = '\0';
- if ((s2 != NULL) && ((end2 = JLI_StrPBrk(s2, ".-_")) != NULL))
- *end2 = '\0';
-
- res = comp_string(s1, s2);
-
- if (end1 != NULL)
- s1 = end1 + 1;
- else
- s1 = NULL;
- if (end2 != NULL)
- s2 = end2 + 1;
- else
- s2 = NULL;
-
- } while (res == 0 && ((s1 != NULL) && (s2 != NULL)));
-
- JLI_MemFree(m1);
- JLI_MemFree(m2);
- return (res);
-}
-
-/*
- * Modeled after strcmp(), compare two version-ids for an Exact
- * Match as defined in JSR 56.
- */
-int
-JLI_ExactVersionId(const char *id1, char *id2)
-{
- char *s1 = JLI_StringDup(id1);
- char *s2 = JLI_StringDup(id2);
- char *m1 = s1;
- char *m2 = s2;
- char *end1 = NULL;
- char *end2 = NULL;
- int res = 0;
-
- do {
-
- if ((s1 != NULL) && ((end1 = JLI_StrPBrk(s1, separators)) != NULL))
- *end1 = '\0';
- if ((s2 != NULL) && ((end2 = JLI_StrPBrk(s2, separators)) != NULL))
- *end2 = '\0';
-
- if ((s1 != NULL) && (s2 == NULL))
- res = comp_string(s1, zero_string);
- else if ((s1 == NULL) && (s2 != NULL))
- res = comp_string(zero_string, s2);
- else
- res = comp_string(s1, s2);
-
- if (end1 != NULL)
- s1 = end1 + 1;
- else
- s1 = NULL;
- if (end2 != NULL)
- s2 = end2 + 1;
- else
- s2 = NULL;
-
- } while (res == 0 && ((s1 != NULL) || (s2 != NULL)));
-
- JLI_MemFree(m1);
- JLI_MemFree(m2);
- return (res);
-}
-
-/*
- * Return true if this simple-element (as defined in JSR 56) forms
- * an acceptable match.
- *
- * JSR 56 is modified by the Java Web Start <rel> Developer Guide
- * where it is stated "... Java Web Start will not consider an installed
- * non-FCS (i.e., milestone) JRE as a match. ... a JRE from Sun
- * Microsystems, Inc., is by convention a non-FCS (milestone) JRE
- * if there is a dash (-) in the version string."
- *
- * An undocumented caveat to the above is that an exact match with a
- * hyphen is accepted as a development extension.
- *
- * These modifications are addressed by the specific comparisons
- * for releases with hyphens.
- */
-static int
-acceptable_simple_element(const char *release, char *simple_element)
-{
- char *modifier;
- modifier = simple_element + JLI_StrLen(simple_element) - 1;
- if (*modifier == '*') {
- *modifier = '\0';
- if (JLI_StrChr(release, '-'))
- return ((JLI_StrCmp(release, simple_element) == 0)?1:0);
- return ((JLI_PrefixVersionId(release, simple_element) == 0)?1:0);
- } else if (*modifier == '+') {
- *modifier = '\0';
- if (JLI_StrChr(release, '-'))
- return ((JLI_StrCmp(release, simple_element) == 0)?1:0);
- return ((JLI_ExactVersionId(release, simple_element) >= 0)?1:0);
- } else {
- return ((JLI_ExactVersionId(release, simple_element) == 0)?1:0);
- }
-}
-
-/*
- * Return true if this element (as defined in JSR 56) forms
- * an acceptable match. An element is the intersection (and)
- * of multiple simple-elements.
- */
-static int
-acceptable_element(const char *release, char *element)
-{
- char *end;
- do {
- if ((end = JLI_StrChr(element, '&')) != NULL)
- *end = '\0';
- if (!acceptable_simple_element(release, element))
- return (0);
- if (end != NULL)
- element = end + 1;
- } while (end != NULL);
- return (1);
-}
-
-/*
- * Checks if release is acceptable by the specification version-string.
- * Return true if this version-string (as defined in JSR 56) forms
- * an acceptable match. A version-string is the union (or) of multiple
- * elements.
- */
-int
-JLI_AcceptableRelease(const char *release, char *version_string)
-{
- char *vs;
- char *m1;
- char *end;
- m1 = vs = JLI_StringDup(version_string);
- do {
- if ((end = JLI_StrChr(vs, ' ')) != NULL)
- *end = '\0';
- if (acceptable_element(release, vs)) {
- JLI_MemFree(m1);
- return (1);
- }
- if (end != NULL)
- vs = end + 1;
- } while (end != NULL);
- JLI_MemFree(m1);
- return (0);
-}
-
-/*
- * Return true if this is a valid simple-element (as defined in JSR 56).
- *
- * The official grammar for a simple-element is:
- *
- * simple-element ::= version-id | version-id modifier
- * modifier ::= '+' | '*'
- * version-id ::= string ( separator string )*
- * string ::= char ( char )*
- * char ::= Any ASCII character except a space, an
- * ampersand, a separator or a modifier
- * separator ::= '.' | '-' | '_'
- *
- * However, for efficiency, it is time to abandon the top down parser
- * implementation. After deleting the potential trailing modifier, we
- * are left with a version-id.
- *
- * Note that a valid version-id has three simple properties:
- *
- * 1) Doesn't contain a space, an ampersand or a modifier.
- *
- * 2) Doesn't begin or end with a separator.
- *
- * 3) Doesn't contain two adjacent separators.
- *
- * Any other line noise constitutes a valid version-id.
- */
-static int
-valid_simple_element(char *simple_element)
-{
- char *last;
- size_t len;
-
- if ((simple_element == NULL) || ((len = JLI_StrLen(simple_element)) == 0))
- return (0);
- last = simple_element + len - 1;
- if (*last == '*' || *last == '+') {
- if (--len == 0)
- return (0);
- *last-- = '\0';
- }
- if (JLI_StrPBrk(simple_element, " &+*") != NULL) /* Property #1 */
- return (0);
- if ((JLI_StrChr(".-_", *simple_element) != NULL) || /* Property #2 */
- (JLI_StrChr(".-_", *last) != NULL))
- return (0);
- for (; simple_element != last; simple_element++) /* Property #3 */
- if ((JLI_StrChr(".-_", *simple_element) != NULL) &&
- (JLI_StrChr(".-_", *(simple_element + 1)) != NULL))
- return (0);
- return (1);
-}
-
-/*
- * Return true if this is a valid element (as defined in JSR 56).
- * An element is the intersection (and) of multiple simple-elements.
- */
-static int
-valid_element(char *element)
-{
- char *end;
- if ((element == NULL) || (JLI_StrLen(element) == 0))
- return (0);
- do {
- if ((end = JLI_StrChr(element, '&')) != NULL)
- *end = '\0';
- if (!valid_simple_element(element))
- return (0);
- if (end != NULL)
- element = end + 1;
- } while (end != NULL);
- return (1);
-}
-
-/*
- * Validates a version string by the extended JSR 56 grammar.
- */
-int
-JLI_ValidVersionString(char *version_string)
-{
- char *vs;
- char *m1;
- char *end;
- if ((version_string == NULL) || (JLI_StrLen(version_string) == 0))
- return (0);
- m1 = vs = JLI_StringDup(version_string);
- do {
- if ((end = JLI_StrChr(vs, ' ')) != NULL)
- *end = '\0';
- if (!valid_element(vs)) {
- JLI_MemFree(m1);
- return (0);
- }
- if (end != NULL)
- vs = end + 1;
- } while (end != NULL);
- JLI_MemFree(m1);
- return (1);
-}
--- a/jdk/src/java.base/share/native/libjli/version_comp.h Thu Dec 11 11:44:03 2014 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2003, 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. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#ifndef _VERSION_COMP_H
-#define _VERSION_COMP_H
-
-/*
- * Function prototypes.
- */
-int JLI_ExactVersionId(const char *id1, char *id2);
-int JLI_PrefixVersionId(const char *id1, char *id2);
-int JLI_AcceptableRelease(const char *release, char *version_string);
-int JLI_ValidVersionString(char *version_string);
-
-#endif /* _VERSION_COMP_H */
--- a/jdk/src/java.base/unix/classes/sun/nio/ch/FileDispatcherImpl.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.base/unix/classes/sun/nio/ch/FileDispatcherImpl.java Thu Dec 11 12:27:27 2014 -0800
@@ -25,10 +25,10 @@
package sun.nio.ch;
-import java.io.*;
+import java.io.FileDescriptor;
+import java.io.IOException;
-class FileDispatcherImpl extends FileDispatcher
-{
+class FileDispatcherImpl extends FileDispatcher {
static {
IOUtil.load();
@@ -104,6 +104,14 @@
return new FileDescriptor();
}
+ boolean canTransferToDirectly(java.nio.channels.SelectableChannel sc) {
+ return true;
+ }
+
+ boolean transferToDirectlyNeedsPositionLock() {
+ return false;
+ }
+
// -- Native methods --
static native int read0(FileDescriptor fd, long address, int len)
--- a/jdk/src/java.base/unix/classes/sun/nio/fs/UnixChannelFactory.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.base/unix/classes/sun/nio/fs/UnixChannelFactory.java Thu Dec 11 12:27:27 2014 -0800
@@ -270,6 +270,22 @@
throw x;
}
+ // fail if the file is a directory
+ if (flags.read) {
+ UnixException exc = null;
+ try {
+ if (UnixFileAttributes.get(fd).isDirectory()) {
+ exc = new UnixException(EISDIR);
+ }
+ } catch (UnixException x) {
+ exc = x;
+ }
+ if (exc != null) {
+ close(fd);
+ throw exc;
+ }
+ }
+
// unlink file immediately if delete on close. The spec is clear that
// an implementation cannot guarantee to unlink the correct file when
// replaced by an attacker after it is opened.
--- a/jdk/src/java.base/unix/native/libjli/java_md.h Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.base/unix/native/libjli/java_md.h Thu Dec 11 12:27:27 2014 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -43,11 +43,6 @@
#define MAXNAMELEN PATH_MAX
#endif
-/*
- * Common function prototypes and sundries.
- */
-char *LocateJRE(manifest_info *info);
-void ExecJRE(char *jre, char **argv);
int UnsetEnv(char *name);
char *FindExecName(char *program);
const char *SetExecname(char **argv);
--- a/jdk/src/java.base/unix/native/libjli/java_md_common.c Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.base/unix/native/libjli/java_md_common.c Thu Dec 11 12:27:27 2014 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -191,200 +191,6 @@
}
/*
- * Determine if there is an acceptable JRE in the directory dirname.
- * Upon locating the "best" one, return a fully qualified path to
- * it. "Best" is defined as the most advanced JRE meeting the
- * constraints contained in the manifest_info. If no JRE in this
- * directory meets the constraints, return NULL.
- *
- * Note that we don't check for errors in reading the directory
- * (which would be done by checking errno). This is because it
- * doesn't matter if we get an error reading the directory, or
- * we just don't find anything interesting in the directory. We
- * just return NULL in either case.
- *
- * The historical names of j2sdk and j2re were changed to jdk and
- * jre respecively as part of the 1.5 rebranding effort. Since the
- * former names are legacy on Linux, they must be recognized for
- * all time. Fortunately, this is a minor cost.
- */
-static char
-*ProcessDir(manifest_info *info, char *dirname)
-{
- DIR *dirp;
- struct dirent *dp;
- char *best = NULL;
- int offset;
- int best_offset = 0;
- char *ret_str = NULL;
- char buffer[PATH_MAX];
-
- if ((dirp = opendir(dirname)) == NULL)
- return (NULL);
-
- do {
- if ((dp = readdir(dirp)) != NULL) {
- offset = 0;
- if ((JLI_StrNCmp(dp->d_name, "jre", 3) == 0) ||
- (JLI_StrNCmp(dp->d_name, "jdk", 3) == 0))
- offset = 3;
- else if (JLI_StrNCmp(dp->d_name, "j2re", 4) == 0)
- offset = 4;
- else if (JLI_StrNCmp(dp->d_name, "j2sdk", 5) == 0)
- offset = 5;
- if (offset > 0) {
- if ((JLI_AcceptableRelease(dp->d_name + offset,
- info->jre_version)) && CheckSanity(dirname, dp->d_name))
- if ((best == NULL) || (JLI_ExactVersionId(
- dp->d_name + offset, best + best_offset) > 0)) {
- if (best != NULL)
- JLI_MemFree(best);
- best = JLI_StringDup(dp->d_name);
- best_offset = offset;
- }
- }
- }
- } while (dp != NULL);
- (void) closedir(dirp);
- if (best == NULL)
- return (NULL);
- else {
- ret_str = JLI_MemAlloc(JLI_StrLen(dirname) + JLI_StrLen(best) + 2);
- sprintf(ret_str, "%s/%s", dirname, best);
- JLI_MemFree(best);
- return (ret_str);
- }
-}
-
-/*
- * This is the global entry point. It examines the host for the optimal
- * JRE to be used by scanning a set of directories. The set of directories
- * is platform dependent and can be overridden by the environment
- * variable JAVA_VERSION_PATH.
- *
- * This routine itself simply determines the set of appropriate
- * directories before passing control onto ProcessDir().
- */
-char*
-LocateJRE(manifest_info* info)
-{
- char *path;
- char *home;
- char *target = NULL;
- char *dp;
- char *cp;
-
- /*
- * Start by getting JAVA_VERSION_PATH
- */
- if (info->jre_restrict_search) {
- path = JLI_StringDup(system_dir);
- } else if ((path = getenv("JAVA_VERSION_PATH")) != NULL) {
- path = JLI_StringDup(path);
- } else {
- if ((home = getenv("HOME")) != NULL) {
- path = (char *)JLI_MemAlloc(JLI_StrLen(home) + \
- JLI_StrLen(system_dir) + JLI_StrLen(user_dir) + 2);
- sprintf(path, "%s%s:%s", home, user_dir, system_dir);
- } else {
- path = JLI_StringDup(system_dir);
- }
- }
-
- /*
- * Step through each directory on the path. Terminate the scan with
- * the first directory with an acceptable JRE.
- */
- cp = dp = path;
- while (dp != NULL) {
- cp = JLI_StrChr(dp, (int)':');
- if (cp != NULL)
- *cp = '\0';
- if ((target = ProcessDir(info, dp)) != NULL)
- break;
- dp = cp;
- if (dp != NULL)
- dp++;
- }
- JLI_MemFree(path);
- return (target);
-}
-
-/*
- * Given a path to a jre to execute, this routine checks if this process
- * is indeed that jre. If not, it exec's that jre.
- *
- * We want to actually check the paths rather than just the version string
- * built into the executable, so that given version specification (and
- * JAVA_VERSION_PATH) will yield the exact same Java environment, regardless
- * of the version of the arbitrary launcher we start with.
- */
-void
-ExecJRE(char *jre, char **argv)
-{
- char wanted[PATH_MAX];
- const char* progname = GetProgramName();
- const char* execname = NULL;
-
- /*
- * Resolve the real path to the directory containing the selected JRE.
- */
- if (realpath(jre, wanted) == NULL) {
- JLI_ReportErrorMessage(JRE_ERROR9, jre);
- exit(1);
- }
-
- /*
- * Resolve the real path to the currently running launcher.
- */
- SetExecname(argv);
- execname = GetExecName();
- if (execname == NULL) {
- JLI_ReportErrorMessage(JRE_ERROR10);
- exit(1);
- }
-
- /*
- * If the path to the selected JRE directory is a match to the initial
- * portion of the path to the currently executing JRE, we have a winner!
- * If so, just return.
- */
- if (JLI_StrNCmp(wanted, execname, JLI_StrLen(wanted)) == 0)
- return; /* I am the droid you were looking for */
-
-
- /*
- * This should never happen (because of the selection code in SelectJRE),
- * but check for "impossibly" long path names just because buffer overruns
- * can be so deadly.
- */
- if (JLI_StrLen(wanted) + JLI_StrLen(progname) + 6 > PATH_MAX) {
- JLI_ReportErrorMessage(JRE_ERROR11);
- exit(1);
- }
-
- /*
- * Construct the path and exec it.
- */
- (void)JLI_StrCat(JLI_StrCat(wanted, "/bin/"), progname);
- argv[0] = JLI_StringDup(progname);
- if (JLI_IsTraceLauncher()) {
- int i;
- printf("ReExec Command: %s (%s)\n", wanted, argv[0]);
- printf("ReExec Args:");
- for (i = 1; argv[i] != NULL; i++)
- printf(" %s", argv[i]);
- printf("\n");
- }
- JLI_TraceLauncher("TRACER_MARKER:About to EXEC\n");
- (void)fflush(stdout);
- (void)fflush(stderr);
- execv(wanted, argv);
- JLI_ReportErrorMessageSys(JRE_ERROR12, wanted);
- exit(1);
-}
-
-/*
* "Borrowed" from Solaris 10 where the unsetenv() function is being added
* to libc thanks to SUSv3 (Standard Unix Specification, version 3). As
* such, in the fullness of time this will appear in libc on all relevant
--- a/jdk/src/java.base/unix/native/libjli/java_md_solinux.c Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.base/unix/native/libjli/java_md_solinux.c Thu Dec 11 12:27:27 2014 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -36,7 +36,6 @@
#include <unistd.h>
#include <sys/types.h>
#include "manifest_info.h"
-#include "version_comp.h"
#define JVM_DLL "libjvm.so"
@@ -100,10 +99,6 @@
* (incoming argv)
* |
* \|/
- * SelectVersion
- * (selects the JRE version, note: not data model)
- * |
- * \|/
* CreateExecutionEnvironment
* (determines desired data model)
* |
--- a/jdk/src/java.base/unix/native/libnio/ch/FileChannelImpl.c Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.base/unix/native/libnio/ch/FileChannelImpl.c Thu Dec 11 12:27:27 2014 -0800
@@ -154,10 +154,13 @@
JNIEXPORT jlong JNICALL
Java_sun_nio_ch_FileChannelImpl_transferTo0(JNIEnv *env, jobject this,
- jint srcFD,
+ jobject srcFDO,
jlong position, jlong count,
- jint dstFD)
+ jobject dstFDO)
{
+ jint srcFD = fdval(env, srcFDO);
+ jint dstFD = fdval(env, dstFDO);
+
#if defined(__linux__)
off64_t offset = (off64_t)position;
jlong n = sendfile64(dstFD, srcFD, &offset, (size_t)count);
--- a/jdk/src/java.base/windows/classes/sun/nio/ch/FileDispatcherImpl.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.base/windows/classes/sun/nio/ch/FileDispatcherImpl.java Thu Dec 11 12:27:27 2014 -0800
@@ -25,21 +25,21 @@
package sun.nio.ch;
-import java.io.*;
+import java.io.FileDescriptor;
+import java.io.IOException;
+import java.security.PrivilegedAction;
import sun.misc.SharedSecrets;
import sun.misc.JavaIOFileDescriptorAccess;
-class FileDispatcherImpl extends FileDispatcher
-{
+class FileDispatcherImpl extends FileDispatcher {
+
private static final JavaIOFileDescriptorAccess fdAccess =
SharedSecrets.getJavaIOFileDescriptorAccess();
- static {
- IOUtil.load();
- }
+ // set to true if fast file transmission (TransmitFile) is enabled
+ private static final boolean fastFileTransfer;
- FileDispatcherImpl() {
- }
+ FileDispatcherImpl() { }
@Override
boolean needsPositionLock() {
@@ -110,6 +110,36 @@
return result;
}
+ boolean canTransferToDirectly(java.nio.channels.SelectableChannel sc) {
+ return fastFileTransfer && sc.isBlocking();
+ }
+
+ boolean transferToDirectlyNeedsPositionLock() {
+ return true;
+ }
+
+ static boolean isFastFileTransferRequested() {
+ String fileTransferProp = java.security.AccessController.doPrivileged(
+ new PrivilegedAction<String>() {
+ @Override
+ public String run() {
+ return System.getProperty("jdk.net.enableFastFileTransfer");
+ }
+ });
+ boolean enable;
+ if ("".equals(fileTransferProp)) {
+ enable = true;
+ } else {
+ enable = Boolean.parseBoolean(fileTransferProp);
+ }
+ return enable;
+ }
+
+ static {
+ IOUtil.load();
+ fastFileTransfer = isFastFileTransferRequested();
+ }
+
//-- Native methods
static native int read0(FileDescriptor fd, long address, int len)
--- a/jdk/src/java.base/windows/native/libjli/java_md.c Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.base/windows/native/libjli/java_md.c Thu Dec 11 12:27:27 2014 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -37,7 +37,6 @@
#include <jni.h>
#include "java.h"
-#include "version_comp.h"
#define JVM_DLL "jvm.dll"
#define JAVA_DLL "java.dll"
@@ -675,420 +674,6 @@
}
/*
- * Determine if there is an acceptable JRE in the registry directory top_key.
- * Upon locating the "best" one, return a fully qualified path to it.
- * "Best" is defined as the most advanced JRE meeting the constraints
- * contained in the manifest_info. If no JRE in this directory meets the
- * constraints, return NULL.
- *
- * It doesn't matter if we get an error reading the registry, or we just
- * don't find anything interesting in the directory. We just return NULL
- * in either case.
- */
-static char *
-ProcessDir(manifest_info* info, HKEY top_key) {
- DWORD index = 0;
- HKEY ver_key;
- char name[MAXNAMELEN];
- int len;
- char *best = NULL;
-
- /*
- * Enumerate "<top_key>/SOFTWARE/JavaSoft/Java Runtime Environment"
- * searching for the best available version.
- */
- while (RegEnumKey(top_key, index, name, MAXNAMELEN) == ERROR_SUCCESS) {
- index++;
- if (JLI_AcceptableRelease(name, info->jre_version))
- if ((best == NULL) || (JLI_ExactVersionId(name, best) > 0)) {
- if (best != NULL)
- JLI_MemFree(best);
- best = JLI_StringDup(name);
- }
- }
-
- /*
- * Extract "JavaHome" from the "best" registry directory and return
- * that path. If no appropriate version was located, or there is an
- * error in extracting the "JavaHome" string, return null.
- */
- if (best == NULL)
- return (NULL);
- else {
- if (RegOpenKeyEx(top_key, best, 0, KEY_READ, &ver_key)
- != ERROR_SUCCESS) {
- JLI_MemFree(best);
- if (ver_key != NULL)
- RegCloseKey(ver_key);
- return (NULL);
- }
- JLI_MemFree(best);
- len = MAXNAMELEN;
- if (RegQueryValueEx(ver_key, "JavaHome", NULL, NULL, (LPBYTE)name, &len)
- != ERROR_SUCCESS) {
- if (ver_key != NULL)
- RegCloseKey(ver_key);
- return (NULL);
- }
- if (ver_key != NULL)
- RegCloseKey(ver_key);
- return (JLI_StringDup(name));
- }
-}
-
-/*
- * This is the global entry point. It examines the host for the optimal
- * JRE to be used by scanning a set of registry entries. This set of entries
- * is hardwired on Windows as "Software\JavaSoft\Java Runtime Environment"
- * under the set of roots "{ HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE }".
- *
- * This routine simply opens each of these registry directories before passing
- * control onto ProcessDir().
- */
-char *
-LocateJRE(manifest_info* info) {
- HKEY key = NULL;
- char *path;
- int key_index;
- HKEY root_keys[2] = { HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE };
-
- for (key_index = 0; key_index <= 1; key_index++) {
- if (RegOpenKeyEx(root_keys[key_index], JRE_KEY, 0, KEY_READ, &key)
- == ERROR_SUCCESS)
- if ((path = ProcessDir(info, key)) != NULL) {
- if (key != NULL)
- RegCloseKey(key);
- return (path);
- }
- if (key != NULL)
- RegCloseKey(key);
- }
- return NULL;
-}
-
-/*
- * Local helper routine to isolate a single token (option or argument)
- * from the command line.
- *
- * This routine accepts a pointer to a character pointer. The first
- * token (as defined by MSDN command-line argument syntax) is isolated
- * from that string.
- *
- * Upon return, the input character pointer pointed to by the parameter s
- * is updated to point to the remainding, unscanned, portion of the string,
- * or to a null character if the entire string has been consummed.
- *
- * This function returns a pointer to a null-terminated string which
- * contains the isolated first token, or to the null character if no
- * token could be isolated.
- *
- * Note the side effect of modifying the input string s by the insertion
- * of a null character, making it two strings.
- *
- * See "Parsing C Command-Line Arguments" in the MSDN Library for the
- * parsing rule details. The rule summary from that specification is:
- *
- * * Arguments are delimited by white space, which is either a space or a tab.
- *
- * * A string surrounded by double quotation marks is interpreted as a single
- * argument, regardless of white space contained within. A quoted string can
- * be embedded in an argument. Note that the caret (^) is not recognized as
- * an escape character or delimiter.
- *
- * * A double quotation mark preceded by a backslash, \", is interpreted as a
- * literal double quotation mark (").
- *
- * * Backslashes are interpreted literally, unless they immediately precede a
- * double quotation mark.
- *
- * * If an even number of backslashes is followed by a double quotation mark,
- * then one backslash (\) is placed in the argv array for every pair of
- * backslashes (\\), and the double quotation mark (") is interpreted as a
- * string delimiter.
- *
- * * If an odd number of backslashes is followed by a double quotation mark,
- * then one backslash (\) is placed in the argv array for every pair of
- * backslashes (\\) and the double quotation mark is interpreted as an
- * escape sequence by the remaining backslash, causing a literal double
- * quotation mark (") to be placed in argv.
- */
-static char*
-nextarg(char** s) {
- char *p = *s;
- char *head;
- int slashes = 0;
- int inquote = 0;
-
- /*
- * Strip leading whitespace, which MSDN defines as only space or tab.
- * (Hence, no locale specific "isspace" here.)
- */
- while (*p != (char)0 && (*p == ' ' || *p == '\t'))
- p++;
- head = p; /* Save the start of the token to return */
-
- /*
- * Isolate a token from the command line.
- */
- while (*p != (char)0 && (inquote || !(*p == ' ' || *p == '\t'))) {
- if (*p == '\\' && *(p+1) == '"' && slashes % 2 == 0)
- p++;
- else if (*p == '"')
- inquote = !inquote;
- slashes = (*p++ == '\\') ? slashes + 1 : 0;
- }
-
- /*
- * If the token isolated isn't already terminated in a "char zero",
- * then replace the whitespace character with one and move to the
- * next character.
- */
- if (*p != (char)0)
- *p++ = (char)0;
-
- /*
- * Update the parameter to point to the head of the remaining string
- * reflecting the command line and return a pointer to the leading
- * token which was isolated from the command line.
- */
- *s = p;
- return (head);
-}
-
-/*
- * Local helper routine to return a string equivalent to the input string
- * s, but with quotes removed so the result is a string as would be found
- * in argv[]. The returned string should be freed by a call to JLI_MemFree().
- *
- * The rules for quoting (and escaped quotes) are:
- *
- * 1 A double quotation mark preceded by a backslash, \", is interpreted as a
- * literal double quotation mark (").
- *
- * 2 Backslashes are interpreted literally, unless they immediately precede a
- * double quotation mark.
- *
- * 3 If an even number of backslashes is followed by a double quotation mark,
- * then one backslash (\) is placed in the argv array for every pair of
- * backslashes (\\), and the double quotation mark (") is interpreted as a
- * string delimiter.
- *
- * 4 If an odd number of backslashes is followed by a double quotation mark,
- * then one backslash (\) is placed in the argv array for every pair of
- * backslashes (\\) and the double quotation mark is interpreted as an
- * escape sequence by the remaining backslash, causing a literal double
- * quotation mark (") to be placed in argv.
- */
-static char*
-unquote(const char *s) {
- const char *p = s; /* Pointer to the tail of the original string */
- char *un = (char*)JLI_MemAlloc(JLI_StrLen(s) + 1); /* Ptr to unquoted string */
- char *pun = un; /* Pointer to the tail of the unquoted string */
-
- while (*p != '\0') {
- if (*p == '"') {
- p++;
- } else if (*p == '\\') {
- const char *q = p + JLI_StrSpn(p,"\\");
- if (*q == '"')
- do {
- *pun++ = '\\';
- p += 2;
- } while (*p == '\\' && p < q);
- else
- while (p < q)
- *pun++ = *p++;
- } else {
- *pun++ = *p++;
- }
- }
- *pun = '\0';
- return un;
-}
-
-/*
- * Given a path to a jre to execute, this routine checks if this process
- * is indeed that jre. If not, it exec's that jre.
- *
- * We want to actually check the paths rather than just the version string
- * built into the executable, so that given version specification will yield
- * the exact same Java environment, regardless of the version of the arbitrary
- * launcher we start with.
- */
-void
-ExecJRE(char *jre, char **argv) {
- jint len;
- char path[MAXPATHLEN + 1];
-
- const char *progname = GetProgramName();
-
- /*
- * Resolve the real path to the currently running launcher.
- */
- len = GetModuleFileName(NULL, path, MAXPATHLEN + 1);
- if (len == 0 || len > MAXPATHLEN) {
- JLI_ReportErrorMessageSys(JRE_ERROR9, progname);
- exit(1);
- }
-
- JLI_TraceLauncher("ExecJRE: old: %s\n", path);
- JLI_TraceLauncher("ExecJRE: new: %s\n", jre);
-
- /*
- * If the path to the selected JRE directory is a match to the initial
- * portion of the path to the currently executing JRE, we have a winner!
- * If so, just return.
- */
- if (JLI_StrNCaseCmp(jre, path, JLI_StrLen(jre)) == 0)
- return; /* I am the droid you were looking for */
-
- /*
- * If this isn't the selected version, exec the selected version.
- */
- JLI_Snprintf(path, sizeof(path), "%s\\bin\\%s.exe", jre, progname);
-
- /*
- * Although Windows has an execv() entrypoint, it doesn't actually
- * overlay a process: it can only create a new process and terminate
- * the old process. Therefore, any processes waiting on the initial
- * process wake up and they shouldn't. Hence, a chain of pseudo-zombie
- * processes must be retained to maintain the proper wait semantics.
- * Fortunately the image size of the launcher isn't too large at this
- * time.
- *
- * If it weren't for this semantic flaw, the code below would be ...
- *
- * execv(path, argv);
- * JLI_ReportErrorMessage("Error: Exec of %s failed\n", path);
- * exit(1);
- *
- * The incorrect exec semantics could be addressed by:
- *
- * exit((int)spawnv(_P_WAIT, path, argv));
- *
- * Unfortunately, a bug in Windows spawn/exec impementation prevents
- * this from completely working. All the Windows POSIX process creation
- * interfaces are implemented as wrappers around the native Windows
- * function CreateProcess(). CreateProcess() takes a single string
- * to specify command line options and arguments, so the POSIX routine
- * wrappers build a single string from the argv[] array and in the
- * process, any quoting information is lost.
- *
- * The solution to this to get the original command line, to process it
- * to remove the new multiple JRE options (if any) as was done for argv
- * in the common SelectVersion() routine and finally to pass it directly
- * to the native CreateProcess() Windows process control interface.
- */
- {
- char *cmdline;
- char *p;
- char *np;
- char *ocl;
- char *ccl;
- char *unquoted;
- DWORD exitCode;
- STARTUPINFO si;
- PROCESS_INFORMATION pi;
-
- /*
- * The following code block gets and processes the original command
- * line, replacing the argv[0] equivalent in the command line with
- * the path to the new executable and removing the appropriate
- * Multiple JRE support options. Note that similar logic exists
- * in the platform independent SelectVersion routine, but is
- * replicated here due to the syntax of CreateProcess().
- *
- * The magic "+ 4" characters added to the command line length are
- * 2 possible quotes around the path (argv[0]), a space after the
- * path and a terminating null character.
- */
- ocl = GetCommandLine();
- np = ccl = JLI_StringDup(ocl);
- p = nextarg(&np); /* Discard argv[0] */
- cmdline = (char *)JLI_MemAlloc(JLI_StrLen(path) + JLI_StrLen(np) + 4);
- if (JLI_StrChr(path, (int)' ') == NULL && JLI_StrChr(path, (int)'\t') == NULL)
- cmdline = JLI_StrCpy(cmdline, path);
- else
- cmdline = JLI_StrCat(JLI_StrCat(JLI_StrCpy(cmdline, "\""), path), "\"");
-
- while (*np != (char)0) { /* While more command-line */
- p = nextarg(&np);
- if (*p != (char)0) { /* If a token was isolated */
- unquoted = unquote(p);
- if (*unquoted == '-') { /* Looks like an option */
- if (JLI_StrCmp(unquoted, "-classpath") == 0 ||
- JLI_StrCmp(unquoted, "-cp") == 0) { /* Unique cp syntax */
- cmdline = JLI_StrCat(JLI_StrCat(cmdline, " "), p);
- p = nextarg(&np);
- if (*p != (char)0) /* If a token was isolated */
- cmdline = JLI_StrCat(JLI_StrCat(cmdline, " "), p);
- } else if (JLI_StrNCmp(unquoted, "-version:", 9) != 0 &&
- JLI_StrCmp(unquoted, "-jre-restrict-search") != 0 &&
- JLI_StrCmp(unquoted, "-no-jre-restrict-search") != 0) {
- cmdline = JLI_StrCat(JLI_StrCat(cmdline, " "), p);
- }
- } else { /* End of options */
- cmdline = JLI_StrCat(JLI_StrCat(cmdline, " "), p);
- cmdline = JLI_StrCat(JLI_StrCat(cmdline, " "), np);
- JLI_MemFree((void *)unquoted);
- break;
- }
- JLI_MemFree((void *)unquoted);
- }
- }
- JLI_MemFree((void *)ccl);
-
- if (JLI_IsTraceLauncher()) {
- np = ccl = JLI_StringDup(cmdline);
- p = nextarg(&np);
- printf("ReExec Command: %s (%s)\n", path, p);
- printf("ReExec Args: %s\n", np);
- JLI_MemFree((void *)ccl);
- }
- (void)fflush(stdout);
- (void)fflush(stderr);
-
- /*
- * The following code is modeled after a model presented in the
- * Microsoft Technical Article "Moving Unix Applications to
- * Windows NT" (March 6, 1994) and "Creating Processes" on MSDN
- * (Februrary 2005). It approximates UNIX spawn semantics with
- * the parent waiting for termination of the child.
- */
- memset(&si, 0, sizeof(si));
- si.cb =sizeof(STARTUPINFO);
- memset(&pi, 0, sizeof(pi));
-
- if (!CreateProcess((LPCTSTR)path, /* executable name */
- (LPTSTR)cmdline, /* command line */
- (LPSECURITY_ATTRIBUTES)NULL, /* process security attr. */
- (LPSECURITY_ATTRIBUTES)NULL, /* thread security attr. */
- (BOOL)TRUE, /* inherits system handles */
- (DWORD)0, /* creation flags */
- (LPVOID)NULL, /* environment block */
- (LPCTSTR)NULL, /* current directory */
- (LPSTARTUPINFO)&si, /* (in) startup information */
- (LPPROCESS_INFORMATION)&pi)) { /* (out) process information */
- JLI_ReportErrorMessageSys(SYS_ERROR1, path);
- exit(1);
- }
-
- if (WaitForSingleObject(pi.hProcess, INFINITE) != WAIT_FAILED) {
- if (GetExitCodeProcess(pi.hProcess, &exitCode) == FALSE)
- exitCode = 1;
- } else {
- JLI_ReportErrorMessage(SYS_ERROR2);
- exitCode = 1;
- }
-
- CloseHandle(pi.hThread);
- CloseHandle(pi.hProcess);
-
- exit(exitCode);
- }
-}
-
-/*
* Wrapper for platform dependent unsetenv function.
*/
int
--- a/jdk/src/java.base/windows/native/libjli/java_md.h Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.base/windows/native/libjli/java_md.h Thu Dec 11 12:27:27 2014 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -50,8 +50,7 @@
/*
* Function prototypes.
*/
-char *LocateJRE(manifest_info *info);
-void ExecJRE(char *jre, char **argv);
+
int UnsetEnv(char *name);
#endif /* JAVA_MD_H */
--- a/jdk/src/java.base/windows/native/libnio/ch/FileChannelImpl.c Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.base/windows/native/libnio/ch/FileChannelImpl.c Thu Dec 11 12:27:27 2014 -0800
@@ -31,6 +31,10 @@
#include "nio.h"
#include "nio_util.h"
#include "sun_nio_ch_FileChannelImpl.h"
+#include "java_lang_Integer.h"
+
+#include <Mswsock.h>
+#pragma comment(lib, "Mswsock.lib")
static jfieldID chan_fd; /* id for jobject 'fd' in java.io.FileChannel */
@@ -175,9 +179,42 @@
JNIEXPORT jlong JNICALL
Java_sun_nio_ch_FileChannelImpl_transferTo0(JNIEnv *env, jobject this,
- jint srcFD,
+ jobject srcFD,
jlong position, jlong count,
- jint dstFD)
+ jobject dstFD)
{
- return IOS_UNSUPPORTED;
+ const int PACKET_SIZE = 524288;
+
+ HANDLE src = (HANDLE)(handleval(env, srcFD));
+ SOCKET dst = (SOCKET)(fdval(env, dstFD));
+ DWORD chunkSize = (count > java_lang_Integer_MAX_VALUE) ?
+ java_lang_Integer_MAX_VALUE : (DWORD)count;
+ BOOL result = 0;
+
+ jlong pos = Java_sun_nio_ch_FileChannelImpl_position0(env, this, srcFD, position);
+ if (pos == IOS_THROWN) {
+ return IOS_THROWN;
+ }
+
+ result = TransmitFile(
+ dst,
+ src,
+ chunkSize,
+ PACKET_SIZE,
+ NULL,
+ NULL,
+ TF_USE_KERNEL_APC
+ );
+ if (!result) {
+ int error = WSAGetLastError();
+ if (WSAEINVAL == error && count >= 0) {
+ return IOS_UNSUPPORTED_CASE;
+ }
+ if (WSAENOTSOCK == error) {
+ return IOS_UNSUPPORTED_CASE;
+ }
+ JNU_ThrowIOExceptionWithLastError(env, "transfer failed");
+ return IOS_THROWN;
+ }
+ return chunkSize;
}
--- a/jdk/src/java.corba/share/classes/com/sun/jndi/cosnaming/CNNameParser.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.corba/share/classes/com/sun/jndi/cosnaming/CNNameParser.java Thu Dec 11 12:27:27 2014 -0800
@@ -256,7 +256,7 @@
private static String stringifyComponent(NameComponent comp) {
StringBuilder one = new StringBuilder(escape(comp.id));
if (comp.kind != null && !comp.kind.equals("")) {
- one.append(kindSeparator + escape(comp.kind));
+ one.append(kindSeparator).append(escape(comp.kind));
}
if (one.length() == 0) {
return ""+kindSeparator; // if neither id nor kind specified
--- a/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java Thu Dec 11 12:27:27 2014 -0800
@@ -458,11 +458,11 @@
JavaAWTAccess javaAwtAccess = SharedSecrets.getJavaAWTAccess();
if (sm != null && javaAwtAccess != null) {
// for each applet, it has its own LoggerContext isolated from others
- synchronized (javaAwtAccess) {
- // find the AppContext of the applet code
- // will be null if we are in the main app context.
- final Object ecx = javaAwtAccess.getAppletContext();
- if (ecx != null) {
+ final Object ecx = javaAwtAccess.getAppletContext();
+ if (ecx != null) {
+ synchronized (javaAwtAccess) {
+ // find the AppContext of the applet code
+ // will be null if we are in the main app context.
if (contextsMap == null) {
contextsMap = new WeakHashMap<>();
}
--- a/jdk/src/java.management/share/classes/com/sun/jmx/interceptor/DefaultMBeanServerInterceptor.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.management/share/classes/com/sun/jmx/interceptor/DefaultMBeanServerInterceptor.java Thu Dec 11 12:27:27 2014 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -1707,16 +1707,19 @@
throw new UnsupportedOperationException("Not supported yet.");
}
+ @SuppressWarnings("deprecation")
public ObjectInputStream deserialize(ObjectName name, byte[] data) throws InstanceNotFoundException,
OperationsException {
throw new UnsupportedOperationException("Not supported yet.");
}
+ @SuppressWarnings("deprecation")
public ObjectInputStream deserialize(String className, byte[] data) throws OperationsException,
ReflectionException {
throw new UnsupportedOperationException("Not supported yet.");
}
+ @SuppressWarnings("deprecation")
public ObjectInputStream deserialize(String className, ObjectName loaderName,
byte[] data) throws InstanceNotFoundException, OperationsException,
ReflectionException {
--- a/jdk/src/java.management/share/classes/javax/management/MBeanPermission.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.management/share/classes/javax/management/MBeanPermission.java Thu Dec 11 12:27:27 2014 -0800
@@ -455,11 +455,11 @@
name.append(className);
if (member == null)
member = "-";
- name.append("#" + member);
+ name.append('#').append(member);
if (objectName == null)
name.append("[-]");
else
- name.append("[").append(objectName.getCanonicalName()).append("]");
+ name.append('[').append(objectName.getCanonicalName()).append(']');
/* In the interests of legibility for Permission.toString(), we
transform the empty string into "*". */
--- a/jdk/src/java.management/share/classes/javax/management/modelmbean/RequiredModelMBean.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.management/share/classes/javax/management/modelmbean/RequiredModelMBean.java Thu Dec 11 12:27:27 2014 -0800
@@ -716,15 +716,14 @@
}
retStr.append("\nMBeanInfo for ModelMBean is:");
- retStr.append("\nCLASSNAME: \t"+ info.getClassName());
- retStr.append("\nDESCRIPTION: \t"+ info.getDescription());
+ retStr.append("\nCLASSNAME: \t").append(info.getClassName());
+ retStr.append("\nDESCRIPTION: \t").append(info.getDescription());
try {
- retStr.append("\nMBEAN DESCRIPTOR: \t"+
- info.getMBeanDescriptor());
+ retStr.append("\nMBEAN DESCRIPTOR: \t").append(info.getMBeanDescriptor());
} catch (Exception e) {
- retStr.append("\nMBEAN DESCRIPTOR: \t" + " is invalid");
+ retStr.append("\nMBEAN DESCRIPTOR: \t is invalid");
}
retStr.append("\nATTRIBUTES");
@@ -734,13 +733,12 @@
for (int i=0; i<attrInfo.length; i++) {
final ModelMBeanAttributeInfo attInfo =
(ModelMBeanAttributeInfo)attrInfo[i];
- retStr.append(" ** NAME: \t"+ attInfo.getName());
- retStr.append(" DESCR: \t"+ attInfo.getDescription());
- retStr.append(" TYPE: \t"+ attInfo.getType() +
- " READ: \t"+ attInfo.isReadable() +
- " WRITE: \t"+ attInfo.isWritable());
- retStr.append(" DESCRIPTOR: " +
- attInfo.getDescriptor().toString());
+ retStr.append(" ** NAME: \t").append(attInfo.getName());
+ retStr.append(" DESCR: \t").append(attInfo.getDescription());
+ retStr.append(" TYPE: \t").append(attInfo.getType())
+ .append(" READ: \t").append(attInfo.isReadable())
+ .append(" WRITE: \t").append(attInfo.isWritable());
+ retStr.append(" DESCRIPTOR: ").append(attInfo.getDescriptor());
}
} else {
retStr.append(" ** No attributes **");
@@ -752,14 +750,13 @@
for (int i=0; i<constrInfo.length; i++) {
final ModelMBeanConstructorInfo ctorInfo =
(ModelMBeanConstructorInfo)constrInfo[i];
- retStr.append(" ** NAME: \t"+ ctorInfo.getName());
- retStr.append(" DESCR: \t"+
- ctorInfo.getDescription());
- retStr.append(" PARAM: \t"+
- ctorInfo.getSignature().length +
- " parameter(s)");
- retStr.append(" DESCRIPTOR: " +
- ctorInfo.getDescriptor().toString());
+ retStr.append(" ** NAME: \t").append(ctorInfo.getName());
+ retStr.append(" DESCR: \t").append(ctorInfo.getDescription());
+ retStr.append(" PARAM: \t")
+ .append(ctorInfo.getSignature().length)
+ .append(" parameter(s)");
+ retStr.append(" DESCRIPTOR: ").append(
+ ctorInfo.getDescriptor());
}
} else {
retStr.append(" ** No Constructors **");
@@ -771,13 +768,12 @@
for (int i=0; i<opsInfo.length; i++) {
final ModelMBeanOperationInfo operInfo =
(ModelMBeanOperationInfo)opsInfo[i];
- retStr.append(" ** NAME: \t"+ operInfo.getName());
- retStr.append(" DESCR: \t"+ operInfo.getDescription());
- retStr.append(" PARAM: \t"+
- operInfo.getSignature().length +
- " parameter(s)");
- retStr.append(" DESCRIPTOR: " +
- operInfo.getDescriptor().toString());
+ retStr.append(" ** NAME: \t").append(operInfo.getName());
+ retStr.append(" DESCR: \t").append(operInfo.getDescription());
+ retStr.append(" PARAM: \t")
+ .append(operInfo.getSignature().length)
+ .append(" parameter(s)");
+ retStr.append(" DESCRIPTOR: ").append(operInfo.getDescriptor());
}
} else {
retStr.append(" ** No operations ** ");
@@ -790,10 +786,9 @@
for (int i=0; i<notifInfo.length; i++) {
final ModelMBeanNotificationInfo nInfo =
(ModelMBeanNotificationInfo)notifInfo[i];
- retStr.append(" ** NAME: \t"+ nInfo.getName());
- retStr.append(" DESCR: \t"+ nInfo.getDescription());
- retStr.append(" DESCRIPTOR: " +
- nInfo.getDescriptor().toString());
+ retStr.append(" ** NAME: \t").append(nInfo.getName());
+ retStr.append(" DESCR: \t").append(nInfo.getDescription());
+ retStr.append(" DESCRIPTOR: ").append(nInfo.getDescriptor());
}
} else {
retStr.append(" ** No notifications **");
--- a/jdk/src/java.management/share/classes/javax/management/openmbean/ArrayType.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.management/share/classes/javax/management/openmbean/ArrayType.java Thu Dec 11 12:27:27 2014 -0800
@@ -458,8 +458,8 @@
elementType = at.getElementOpenType();
isPrimitiveArray = at.isPrimitiveArray();
}
- StringBuilder result =
- new StringBuilder(dimension + "-dimension array of ");
+ StringBuilder result = new StringBuilder();
+ result.append(dimension).append("-dimension array of ");
final String elementClassName = elementType.getClassName();
if (isPrimitiveArray) {
// Convert from wrapper type to primitive type
--- a/jdk/src/java.management/share/classes/sun/management/Agent.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.management/share/classes/sun/management/Agent.java Thu Dec 11 12:27:27 2014 -0800
@@ -499,7 +499,7 @@
} else {
StringBuilder message = new StringBuilder(params[0]);
for (int i = 1; i < params.length; i++) {
- message.append(" " + params[i]);
+ message.append(' ').append(params[i]);
}
error(key, message.toString());
}
--- a/jdk/src/java.management/share/classes/sun/management/MappedMXBeanType.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.management/share/classes/sun/management/MappedMXBeanType.java Thu Dec 11 12:27:27 2014 -0800
@@ -289,7 +289,7 @@
if (et.isPrimitive()) {
className = new StringBuilder(c.getName());
} else {
- className.append("L" + baseElementType.getTypeName() + ";");
+ className.append('L').append(baseElementType.getTypeName()).append(';');
}
try {
mappedTypeClass = Class.forName(className.toString());
@@ -385,7 +385,7 @@
if (elementType instanceof Class && ((Class) elementType).isPrimitive()) {
className = new StringBuilder(gat.toString());
} else {
- className.append("L" + baseElementType.getTypeName() + ";");
+ className.append('L').append(baseElementType.getTypeName()).append(';');
}
try {
mappedTypeClass = Class.forName(className.toString());
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/Connection.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/Connection.java Thu Dec 11 12:27:27 2014 -0800
@@ -111,7 +111,6 @@
private static final boolean debug = false;
private static final int dump = 0; // > 0 r, > 1 rw
- public static final long DEFAULT_READ_TIMEOUT_MILLIS = 15 * 1000; // 15 second timeout;
final private Thread worker; // Initialized in constructor
@@ -414,10 +413,13 @@
// will be woken up before readTimeout only if reply is
// available
ldr.wait(readTimeout);
+ waited = true;
} else {
- ldr.wait(DEFAULT_READ_TIMEOUT_MILLIS);
+ // no timeout is set so we wait infinitely until
+ // a response is received
+ // http://docs.oracle.com/javase/8/docs/technotes/guides/jndi/jndi-ldap.html#PROP
+ ldr.wait();
}
- waited = true;
} else {
break;
}
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/sasl/DefaultCallbackHandler.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/sasl/DefaultCallbackHandler.java Thu Dec 11 12:27:27 2014 -0800
@@ -90,7 +90,7 @@
if (selected == -1) {
StringBuilder allChoices = new StringBuilder();
for (int j = 0; j < choices.length; j++) {
- allChoices.append(choices[j] + ",");
+ allChoices.append(choices[j]).append(',');
}
throw new IOException("Cannot match " +
"'java.naming.security.sasl.realm' property value, '" +
--- a/jdk/src/java.naming/share/classes/javax/naming/NameImpl.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.naming/share/classes/javax/naming/NameImpl.java Thu Dec 11 12:27:27 2014 -0800
@@ -170,7 +170,7 @@
endQuote = one ? syntaxEndQuote1 : syntaxEndQuote2;
i += syntaxTypevalSeparator.length();
- answer.append(syntaxTypevalSeparator+beginQuote); // add back
+ answer.append(syntaxTypevalSeparator).append(beginQuote); // add back
// consume string until matching quote
for (i += beginQuote.length();
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/Config.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/Config.java Thu Dec 11 12:27:27 2014 -0800
@@ -30,19 +30,19 @@
*/
package sun.security.krb5;
-import java.io.File;
-import java.io.FilePermission;
+import java.io.*;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.Path;
import java.security.PrivilegedAction;
import java.util.*;
-import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.security.AccessController;
import java.security.PrivilegedExceptionAction;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import sun.net.dns.ResolverConfiguration;
import sun.security.krb5.internal.crypto.EType;
@@ -315,6 +315,72 @@
}
/**
+ * Translates a duration value into seconds.
+ *
+ * The format can be one of "h:m[:s]", "NdNhNmNs", and "N". See
+ * http://web.mit.edu/kerberos/krb5-devel/doc/basic/date_format.html#duration
+ * for definitions.
+ *
+ * @param s the string duration
+ * @return time in seconds
+ * @throw KrbException if format is illegal
+ */
+ public static int duration(String s) throws KrbException {
+
+ if (s.isEmpty()) {
+ throw new KrbException("Duration cannot be empty");
+ }
+
+ // N
+ if (s.matches("\\d+")) {
+ return Integer.parseInt(s);
+ }
+
+ // h:m[:s]
+ Matcher m = Pattern.compile("(\\d+):(\\d+)(:(\\d+))?").matcher(s);
+ if (m.matches()) {
+ int hr = Integer.parseInt(m.group(1));
+ int min = Integer.parseInt(m.group(2));
+ if (min >= 60) {
+ throw new KrbException("Illegal duration format " + s);
+ }
+ int result = hr * 3600 + min * 60;
+ if (m.group(4) != null) {
+ int sec = Integer.parseInt(m.group(4));
+ if (sec >= 60) {
+ throw new KrbException("Illegal duration format " + s);
+ }
+ result += sec;
+ }
+ return result;
+ }
+
+ // NdNhNmNs
+ // 120m allowed. Maybe 1h120m is not good, but still allowed
+ m = Pattern.compile(
+ "((\\d+)d)?\\s*((\\d+)h)?\\s*((\\d+)m)?\\s*((\\d+)s)?",
+ Pattern.CASE_INSENSITIVE).matcher(s);
+ if (m.matches()) {
+ int result = 0;
+ if (m.group(2) != null) {
+ result += 86400 * Integer.parseInt(m.group(2));
+ }
+ if (m.group(4) != null) {
+ result += 3600 * Integer.parseInt(m.group(4));
+ }
+ if (m.group(6) != null) {
+ result += 60 * Integer.parseInt(m.group(6));
+ }
+ if (m.group(8) != null) {
+ result += Integer.parseInt(m.group(8));
+ }
+ return result;
+ }
+
+ throw new KrbException("Illegal duration format " + s);
+ }
+
+ /**
* Gets the int value for the specified keys.
* @param keys the keys
* @return the int value, Integer.MIN_VALUE is returned if it cannot be
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/Credentials.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/Credentials.java Thu Dec 11 12:27:27 2014 -0800
@@ -527,4 +527,23 @@
return sb.toString();
}
+ public sun.security.krb5.internal.ccache.Credentials toCCacheCreds() {
+ return new sun.security.krb5.internal.ccache.Credentials(
+ getClient(), getServer(),
+ getSessionKey(),
+ date2kt(getAuthTime()),
+ date2kt(getStartTime()),
+ date2kt(getEndTime()),
+ date2kt(getRenewTill()),
+ false,
+ flags,
+ new HostAddresses(getClientAddresses()),
+ getAuthzData(),
+ getTicket(),
+ null);
+ }
+
+ private static KerberosTime date2kt(Date d) {
+ return d == null ? null : new KerberosTime(d);
+ }
}
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbAsReq.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbAsReq.java Thu Dec 11 12:27:27 2014 -0800
@@ -35,6 +35,7 @@
import sun.security.krb5.internal.crypto.Nonce;
import sun.security.krb5.internal.crypto.KeyUsage;
import java.io.IOException;
+import java.time.Instant;
/**
* This class encapsulates the KRB-AS-REQ message that the client
@@ -64,7 +65,6 @@
if (options == null) {
options = new KDCOptions();
}
-
// check if they are valid arguments. The optional fields should be
// consistent with settings in KDCOptions. Mar 17 2000
if (options.get(KDCOptions.FORWARDED) ||
@@ -82,12 +82,6 @@
} else {
if (from != null) from = null;
}
- if (options.get(KDCOptions.RENEWABLE)) {
- // if (rtime == null)
- // throw new KrbException(Krb5.KRB_AP_ERR_REQ_OPTIONS);
- } else {
- if (rtime != null) rtime = null;
- }
PAData[] paData = null;
if (pakey != null) {
@@ -109,8 +103,10 @@
System.out.println(">>> KrbAsReq creating message");
}
+ Config cfg = Config.getInstance();
+
// check to use addresses in tickets
- if (addresses == null && Config.getInstance().useAddresses()) {
+ if (addresses == null && cfg.useAddresses()) {
addresses = HostAddresses.getLocalAddresses();
}
@@ -120,7 +116,26 @@
}
if (till == null) {
- till = new KerberosTime(0); // Choose KDC maximum allowed
+ String d = cfg.get("libdefaults", "ticket_lifetime");
+ if (d != null) {
+ till = new KerberosTime(Instant.now().plusSeconds(Config.duration(d)));
+ } else {
+ till = new KerberosTime(0); // Choose KDC maximum allowed
+ }
+ }
+
+ if (rtime == null) {
+ String d = cfg.get("libdefaults", "renew_lifetime");
+ if (d != null) {
+ rtime = new KerberosTime(Instant.now().plusSeconds(Config.duration(d)));
+ }
+ }
+
+ if (rtime != null) {
+ options.set(KDCOptions.RENEWABLE, true);
+ if (till.greaterThan(rtime)) {
+ rtime = till;
+ }
}
// enc-authorization-data and additional-tickets never in AS-REQ
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbAsReqBuilder.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbAsReqBuilder.java Thu Dec 11 12:27:27 2014 -0800
@@ -224,6 +224,16 @@
this.options = options;
}
+ public void setTill(KerberosTime till) {
+ checkState(State.INIT, "Cannot specify till");
+ this.till = till;
+ }
+
+ public void setRTime(KerberosTime rtime) {
+ checkState(State.INIT, "Cannot specify rtime");
+ this.rtime = rtime;
+ }
+
/**
* Sets or clears target. If cleared, KrbAsReq might choose krbtgt
* for cname realm
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbException.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbException.java Thu Dec 11 12:27:27 2014 -0800
@@ -96,13 +96,14 @@
public String krbErrorMessage() {
- StringBuilder strbuf = new StringBuilder("krb_error " + returnCode);
+ StringBuilder sb = new StringBuilder();
+ sb.append("krb_error ").append(returnCode);
String msg = getMessage();
if (msg != null) {
- strbuf.append(" ");
- strbuf.append(msg);
+ sb.append(" ");
+ sb.append(msg);
}
- return strbuf.toString();
+ return sb.toString();
}
/**
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbKdcRep.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbKdcRep.java Thu Dec 11 12:27:27 2014 -0800
@@ -80,49 +80,41 @@
rep.encKDCRepPart.flags.get(KDCOptions.RENEWABLE)) {
throw new KrbApErrException(Krb5.KRB_AP_ERR_MODIFIED);
}
- if ((req.reqBody.from == null) || req.reqBody.from.isZero())
+
+ if ((req.reqBody.from == null) || req.reqBody.from.isZero()) {
// verify this is allowed
if ((rep.encKDCRepPart.starttime != null) &&
- !rep.encKDCRepPart.starttime.inClockSkew()) {
+ !rep.encKDCRepPart.starttime.inClockSkew()) {
rep.encKDCRepPart.key.destroy();
throw new KrbApErrException(Krb5.KRB_AP_ERR_SKEW);
}
+ }
- if ((req.reqBody.from != null) && !req.reqBody.from.isZero())
+ if ((req.reqBody.from != null) && !req.reqBody.from.isZero()) {
// verify this is allowed
if ((rep.encKDCRepPart.starttime != null) &&
- !req.reqBody.from.equals(rep.encKDCRepPart.starttime)) {
+ !req.reqBody.from.equals(rep.encKDCRepPart.starttime)) {
rep.encKDCRepPart.key.destroy();
throw new KrbApErrException(Krb5.KRB_AP_ERR_MODIFIED);
}
+ }
if (!req.reqBody.till.isZero() &&
- rep.encKDCRepPart.endtime.greaterThan(req.reqBody.till)) {
+ rep.encKDCRepPart.endtime.greaterThan(req.reqBody.till)) {
rep.encKDCRepPart.key.destroy();
throw new KrbApErrException(Krb5.KRB_AP_ERR_MODIFIED);
}
- if (req.reqBody.kdcOptions.get(KDCOptions.RENEWABLE))
- if (req.reqBody.rtime != null && !req.reqBody.rtime.isZero())
- // verify this is required
+ if (req.reqBody.kdcOptions.get(KDCOptions.RENEWABLE)) {
+ if (req.reqBody.rtime != null && !req.reqBody.rtime.isZero()) {
+ // verify this is required
if ((rep.encKDCRepPart.renewTill == null) ||
- rep.encKDCRepPart.renewTill.greaterThan(req.reqBody.rtime)
- ) {
+ rep.encKDCRepPart.renewTill.greaterThan(req.reqBody.rtime)
+ ) {
rep.encKDCRepPart.key.destroy();
throw new KrbApErrException(Krb5.KRB_AP_ERR_MODIFIED);
}
-
- if (req.reqBody.kdcOptions.get(KDCOptions.RENEWABLE_OK) &&
- rep.encKDCRepPart.flags.get(KDCOptions.RENEWABLE))
- if (!req.reqBody.till.isZero())
- // verify this is required
- if ((rep.encKDCRepPart.renewTill == null) ||
- rep.encKDCRepPart.renewTill.greaterThan(req.reqBody.till)
- ) {
- rep.encKDCRepPart.key.destroy();
- throw new KrbApErrException(Krb5.KRB_AP_ERR_MODIFIED);
- }
+ }
+ }
}
-
-
}
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbTgsReq.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbTgsReq.java Thu Dec 11 12:27:27 2014 -0800
@@ -35,7 +35,6 @@
import sun.security.krb5.internal.crypto.*;
import java.io.IOException;
import java.net.UnknownHostException;
-import java.util.Arrays;
/**
* This class encapsulates a Kerberos TGS-REQ that is sent from the
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/HostAddresses.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/HostAddresses.java Thu Dec 11 12:27:27 2014 -0800
@@ -250,6 +250,10 @@
*/
public void writeAddrs(CCacheOutputStream cos) throws IOException {
+ if (addresses == null || addresses.length == 0) {
+ cos.write32(0);
+ return;
+ }
cos.write32(addresses.length);
for (int i = 0; i < addresses.length; i++) {
cos.write16(addresses[i].addrType);
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/KerberosTime.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/KerberosTime.java Thu Dec 11 12:27:27 2014 -0800
@@ -38,6 +38,7 @@
import sun.security.util.DerValue;
import java.io.IOException;
+import java.time.Instant;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
@@ -129,6 +130,14 @@
}
/**
+ * Creates a KerberosTime object from an Instant object
+ */
+ public KerberosTime(Instant instant) {
+ this(instant.getEpochSecond()*1000 + instant.getNano()/1000000L,
+ instant.getNano()/1000%1000);
+ }
+
+ /**
* Creates a KerberosTime object for now. It uses System.nanoTime()
* to get a more precise time than "new Date()".
*/
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/dk/DkCrypto.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/dk/DkCrypto.java Thu Dec 11 12:27:27 2014 -0800
@@ -640,8 +640,7 @@
for (int i = 0; i < digest.length; i++) {
if ((digest[i] & 0x000000ff) < 0x10) {
- digestString.append("0" +
- Integer.toHexString(digest[i] & 0x000000ff));
+ digestString.append('0').append(Integer.toHexString(digest[i] & 0x000000ff));
} else {
digestString.append(
Integer.toHexString(digest[i] & 0x000000ff));
--- a/jdk/src/java.security.jgss/windows/classes/sun/security/krb5/internal/tools/Kinit.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.security.jgss/windows/classes/sun/security/krb5/internal/tools/Kinit.java Thu Dec 11 12:27:27 2014 -0800
@@ -36,7 +36,6 @@
import sun.security.krb5.internal.ccache.*;
import java.io.IOException;
import java.util.Arrays;
-import javax.security.auth.kerberos.KerberosPrincipal;
import sun.security.util.Password;
import javax.security.auth.kerberos.KeyTab;
@@ -53,22 +52,9 @@
/**
* The main method is used to accept user command line input for ticket
- * request.
- * <p>
- * Usage: kinit [-A] [-f] [-p] [-c cachename] [[-k [-t keytab_file_name]]
- * [principal] [password]
- * <ul>
- * <li> -A do not include addresses
- * <li> -f forwardable
- * <li> -p proxiable
- * <li> -c cache name (i.e., FILE://c:\temp\mykrb5cc)
- * <li> -k use keytab
- * <li> -t keytab file name
- * <li> principal the principal name (i.e., duke@java.sun.com)
- * <li> password the principal's Kerberos password
- * </ul>
- * <p>
- * Use java sun.security.krb5.tools.Kinit -help to bring up help menu.
+ * request. Read {@link KinitOptions#printHelp} for usages or call
+ * java sun.security.krb5.internal.tools.Kinit -help
+ * to bring up help menu.
* <p>
* We currently support only file-based credentials cache to
* store the tickets obtained from the KDC.
@@ -146,6 +132,49 @@
} else {
options = new KinitOptions(args);
}
+ switch (options.action) {
+ case 1:
+ acquire();
+ break;
+ case 2:
+ renew();
+ break;
+ default:
+ throw new KrbException("kinit does not support action "
+ + options.action);
+ }
+ }
+
+ private void renew()
+ throws IOException, RealmException, KrbException {
+
+ PrincipalName principal = options.getPrincipal();
+ String realm = principal.getRealmAsString();
+ CredentialsCache cache = CredentialsCache.getInstance(options.cachename);
+
+ if (cache == null) {
+ throw new IOException("Unable to find existing cache file " +
+ options.cachename);
+ }
+ sun.security.krb5.internal.ccache.Credentials credentials =
+ cache.getCreds(PrincipalName.tgsService(realm, realm));
+
+ credentials = credentials.setKrbCreds()
+ .renew()
+ .toCCacheCreds();
+
+ cache = CredentialsCache.create(principal, options.cachename);
+ if (cache == null) {
+ throw new IOException("Unable to create the cache file " +
+ options.cachename);
+ }
+ cache.update(credentials);
+ cache.save();
+ }
+
+ private void acquire()
+ throws IOException, RealmException, KrbException {
+
String princName = null;
PrincipalName principal = options.getPrincipal();
if (principal != null) {
@@ -216,6 +245,9 @@
if (options.getAddressOption())
builder.setAddresses(HostAddresses.getLocalAddresses());
+ builder.setTill(options.lifetime);
+ builder.setRTime(options.renewable_lifetime);
+
builder.action();
sun.security.krb5.internal.ccache.Credentials credentials =
--- a/jdk/src/java.security.jgss/windows/classes/sun/security/krb5/internal/tools/KinitOptions.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.security.jgss/windows/classes/sun/security/krb5/internal/tools/KinitOptions.java Thu Dec 11 12:27:27 2014 -0800
@@ -33,12 +33,8 @@
import sun.security.krb5.*;
import sun.security.krb5.internal.*;
import sun.security.krb5.internal.ccache.*;
-import java.io.File;
import java.io.IOException;
-import java.util.StringTokenizer;
-import java.util.Vector;
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
+import java.time.Instant;
import java.io.FileInputStream;
/**
@@ -49,14 +45,15 @@
* @author Ram Marti
*/
class KinitOptions {
- public boolean validate = false;
+
+ // 1. acquire, 2. renew, 3. validate
+ public int action = 1;
// forwardable and proxiable flags have two states:
// -1 - flag set to be not forwardable or proxiable;
// 1 - flag set to be forwardable or proxiable.
- public short forwardable = -1;
- public short proxiable = -1;
- public boolean renew = false;
+ public short forwardable = 0;
+ public short proxiable = 0;
public KerberosTime lifetime;
public KerberosTime renewable_lifetime;
public String target_service;
@@ -134,6 +131,12 @@
}
useKeytab = true;
+ } else if (args[i].equals("-R")) {
+ action = 2;
+ } else if (args[i].equals("-l")) {
+ lifetime = getTime(Config.duration(args[++i]));
+ } else if (args[i].equals("-r")) {
+ renewable_lifetime = getTime(Config.duration(args[++i]));
} else if (args[i].equalsIgnoreCase("-help")) {
printHelp();
System.exit(0);
@@ -223,23 +226,28 @@
void printHelp() {
- System.out.println("Usage: kinit " +
- "[-A] [-f] [-p] [-c cachename] " +
- "[[-k [-t keytab_file_name]] [principal] " +
+ System.out.println("Usage:\n\n1. Initial ticket request:\n" +
+ " kinit [-A] [-f] [-p] [-c cachename] " +
+ "[-l lifetime] [-r renewable_time]\n" +
+ " [[-k [-t keytab_file_name]] [principal] " +
"[password]");
- System.out.println("\tavailable options to " +
+ System.out.println("2. Renew a ticket:\n" +
+ " kinit -R [-c cachename] [principal]");
+ System.out.println("\nAvailable options to " +
"Kerberos 5 ticket request:");
- System.out.println("\t -A do not include addresses");
- System.out.println("\t -f forwardable");
- System.out.println("\t -p proxiable");
- System.out.println("\t -c cache name " +
- "(i.e., FILE:\\d:\\myProfiles\\mykrb5cache)");
- System.out.println("\t -k use keytab");
- System.out.println("\t -t keytab file name");
- System.out.println("\t principal the principal name "+
- "(i.e., qweadf@ATHENA.MIT.EDU qweadf)");
- System.out.println("\t password " +
- "the principal's Kerberos password");
+ System.out.println("\t-A do not include addresses");
+ System.out.println("\t-f forwardable");
+ System.out.println("\t-p proxiable");
+ System.out.println("\t-c cache name " +
+ "(i.e., FILE:\\d:\\myProfiles\\mykrb5cache)");
+ System.out.println("\t-l lifetime");
+ System.out.println("\t-r renewable time " +
+ "(total lifetime a ticket can be renewed)");
+ System.out.println("\t-k use keytab");
+ System.out.println("\t-t keytab file name");
+ System.out.println("\tprincipal the principal name "+
+ "(i.e., qweadf@ATHENA.MIT.EDU qweadf)");
+ System.out.println("\tpassword the principal's Kerberos password");
}
public boolean getAddressOption() {
@@ -257,4 +265,8 @@
public PrincipalName getPrincipal() {
return principal;
}
+
+ private KerberosTime getTime(int s) {
+ return new KerberosTime(Instant.now().plusSeconds(s));
+ }
}
--- a/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/CramMD5Base.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/CramMD5Base.java Thu Dec 11 12:27:27 2014 -0800
@@ -196,8 +196,7 @@
for (i = 0; i < digest.length; i++) {
if ((digest[i] & 0x000000ff) < 0x10) {
- digestString.append("0" +
- Integer.toHexString(digest[i] & 0x000000ff));
+ digestString.append('0').append(Integer.toHexString(digest[i] & 0x000000ff));
} else {
digestString.append(
Integer.toHexString(digest[i] & 0x000000ff));
--- a/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/digest/DigestMD5Base.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/digest/DigestMD5Base.java Thu Dec 11 12:27:27 2014 -0800
@@ -391,8 +391,7 @@
for (int i = 0; i < digest.length; i ++) {
if ((digest[i] & 0x000000ff) < 0x10) {
- digestString.append("0"+
- Integer.toHexString(digest[i] & 0x000000ff));
+ digestString.append('0').append(Integer.toHexString(digest[i] & 0x000000ff));
} else {
digestString.append(
Integer.toHexString(digest[i] & 0x000000ff));
--- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/encryption/AbstractSerializer.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/encryption/AbstractSerializer.java Thu Dec 11 12:27:27 2014 -0800
@@ -235,14 +235,15 @@
String nodeName = att.getNodeName();
if ((nodeName.equals("xmlns") || nodeName.startsWith("xmlns:"))
&& !storedNamespaces.containsKey(att.getNodeName())) {
- sb.append(" " + nodeName + "=\"" + att.getNodeValue() + "\"");
+ sb.append(' ').append(nodeName).append("=\"")
+ .append(att.getNodeValue()).append('"');
storedNamespaces.put(nodeName, att.getNodeValue());
}
}
}
wk = wk.getParentNode();
}
- sb.append(">" + source + "</dummy>");
+ sb.append('>').append(source).append("</dummy>");
return sb.toString();
}
--- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/transforms/params/InclusiveNamespaces.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/transforms/params/InclusiveNamespaces.java Thu Dec 11 12:27:27 2014 -0800
@@ -85,7 +85,7 @@
if (prefix.equals("xmlns")) {
sb.append("#default ");
} else {
- sb.append(prefix + " ");
+ sb.append(prefix).append(' ');
}
}
--- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/RFC2253Parser.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/RFC2253Parser.java Thu Dec 11 12:27:27 2014 -0800
@@ -88,7 +88,7 @@
l += countQuotes(DN, j, k);
if ((k > 0) && (DN.charAt(k - 1) != '\\') && (l % 2) == 0) {
- sb.append(parseRDN(DN.substring(i, k).trim(), toXml) + ",");
+ sb.append(parseRDN(DN.substring(i, k).trim(), toXml)).append(',');
i = k + 1;
l = 0;
@@ -121,7 +121,7 @@
l += countQuotes(str, j, k);
if ((k > 0) && (str.charAt(k - 1) != '\\') && (l % 2) == 0) {
- sb.append(parseATAV(trim(str.substring(i, k)), toXml) + "+");
+ sb.append(parseATAV(trim(str.substring(i, k)), toXml)).append('+');
i = k + 1;
l = 0;
@@ -369,7 +369,7 @@
int k;
for (int j = 0; (k = string.indexOf("\\20", j)) >= 0; j = k + 3) {
- sb.append(trim(string.substring(i, k)) + "\\ ");
+ sb.append(trim(string.substring(i, k))).append("\\ ");
i = k + 3;
}
@@ -418,7 +418,7 @@
l += countQuotes(str, j, k);
if ((k > 0) && (str.charAt(k - 1) != '\\') && (l % 2) == 0) {
- sb.append(trim(str.substring(i, k)) + replace);
+ sb.append(trim(str.substring(i, k))).append(replace);
i = k + 1;
l = 0;
--- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11Key.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11Key.java Thu Dec 11 12:27:27 2014 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -445,6 +445,7 @@
}
}
+ @SuppressWarnings("deprecation")
private static class P11TlsMasterSecretKey extends P11SecretKey
implements TlsMasterSecret {
private static final long serialVersionUID = -1318560923770573441L;
--- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11RSACipher.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11RSACipher.java Thu Dec 11 12:27:27 2014 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -169,6 +169,7 @@
}
// see JCE spec
+ @SuppressWarnings("deprecation")
protected void engineInit(int opmode, Key key,
AlgorithmParameterSpec params, SecureRandom random)
throws InvalidKeyException, InvalidAlgorithmParameterException {
@@ -461,6 +462,7 @@
}
// see JCE spec
+ @SuppressWarnings("deprecation")
protected Key engineUnwrap(byte[] wrappedKey, String algorithm,
int type) throws InvalidKeyException, NoSuchAlgorithmException {
--- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11Signature.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11Signature.java Thu Dec 11 12:27:27 2014 -0800
@@ -765,12 +765,14 @@
}
// see JCA spec
+ @SuppressWarnings("deprecation")
protected void engineSetParameter(String param, Object value)
throws InvalidParameterException {
throw new UnsupportedOperationException("setParameter() not supported");
}
// see JCA spec
+ @SuppressWarnings("deprecation")
protected Object engineGetParameter(String param)
throws InvalidParameterException {
throw new UnsupportedOperationException("getParameter() not supported");
--- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsKeyMaterialGenerator.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsKeyMaterialGenerator.java Thu Dec 11 12:27:27 2014 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -62,6 +62,7 @@
private long mechanism;
// parameter spec
+ @SuppressWarnings("deprecation")
private TlsKeyMaterialParameterSpec spec;
// master secret as a P11Key
@@ -82,6 +83,7 @@
throw new InvalidParameterException(MSG);
}
+ @SuppressWarnings("deprecation")
protected void engineInit(AlgorithmParameterSpec params,
SecureRandom random) throws InvalidAlgorithmParameterException {
if (params instanceof TlsKeyMaterialParameterSpec == false) {
@@ -107,6 +109,7 @@
throw new InvalidParameterException(MSG);
}
+ @SuppressWarnings("deprecation")
protected SecretKey engineGenerateKey() {
if (spec == null) {
throw new IllegalStateException
--- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsMasterSecretGenerator.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsMasterSecretGenerator.java Thu Dec 11 12:27:27 2014 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -57,6 +57,7 @@
// mechanism id
private long mechanism;
+ @SuppressWarnings("deprecation")
private TlsMasterSecretParameterSpec spec;
private P11Key p11Key;
@@ -74,6 +75,7 @@
throw new InvalidParameterException(MSG);
}
+ @SuppressWarnings("deprecation")
protected void engineInit(AlgorithmParameterSpec params,
SecureRandom random) throws InvalidAlgorithmParameterException {
if (params instanceof TlsMasterSecretParameterSpec == false) {
--- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsPrfGenerator.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsPrfGenerator.java Thu Dec 11 12:27:27 2014 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -63,6 +63,7 @@
// mechanism id
private final long mechanism;
+ @SuppressWarnings("deprecation")
private TlsPrfParameterSpec spec;
private P11Key p11Key;
@@ -79,6 +80,7 @@
throw new InvalidParameterException(MSG);
}
+ @SuppressWarnings("deprecation")
protected void engineInit(AlgorithmParameterSpec params,
SecureRandom random) throws InvalidAlgorithmParameterException {
if (params instanceof TlsPrfParameterSpec == false) {
--- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsRsaPremasterSecretGenerator.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsRsaPremasterSecretGenerator.java Thu Dec 11 12:27:27 2014 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -57,6 +57,7 @@
// mechanism id
private long mechanism;
+ @SuppressWarnings("deprecation")
private TlsRsaPremasterSecretParameterSpec spec;
P11TlsRsaPremasterSecretGenerator(Token token, String algorithm, long mechanism)
@@ -71,6 +72,7 @@
throw new InvalidParameterException(MSG);
}
+ @SuppressWarnings("deprecation")
protected void engineInit(AlgorithmParameterSpec params,
SecureRandom random) throws InvalidAlgorithmParameterException {
if (!(params instanceof TlsRsaPremasterSecretParameterSpec)) {
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaValueArray.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaValueArray.java Thu Dec 11 12:27:27 2014 -0800
@@ -346,12 +346,12 @@
public String valueString(boolean bigLimit) {
// Char arrays deserve special treatment
- StringBuffer result;
+ StringBuilder result;
byte[] value = getValue();
int max = value.length;
byte elementSignature = getElementType();
if (elementSignature == 'C') {
- result = new StringBuffer();
+ result = new StringBuilder();
for (int i = 0; i < value.length; ) {
char val = charAt(i, value);
result.append(val);
@@ -362,7 +362,7 @@
if (bigLimit) {
limit = 1000;
}
- result = new StringBuffer("{");
+ result = new StringBuilder("{");
int num = 0;
for (int i = 0; i < value.length; ) {
if (num > 0) {
@@ -386,37 +386,37 @@
}
case 'B': {
int val = 0xFF & byteAt(i, value);
- result.append("0x" + Integer.toString(val, 16));
+ result.append("0x").append(Integer.toString(val, 16));
i++;
break;
}
case 'S': {
short val = shortAt(i, value);
i += 2;
- result.append("" + val);
+ result.append(val);
break;
}
case 'I': {
int val = intAt(i, value);
i += 4;
- result.append("" + val);
+ result.append(val);
break;
}
case 'J': { // long
long val = longAt(i, value);
- result.append("" + val);
+ result.append(val);
i += 8;
break;
}
case 'F': {
float val = floatAt(i, value);
- result.append("" + val);
+ result.append(val);
i += 4;
break;
}
case 'D': { // double
double val = doubleAt(i, value);
- result.append("" + val);
+ result.append(val);
i += 8;
break;
}
@@ -425,7 +425,7 @@
}
}
}
- result.append("}");
+ result.append('}');
}
return result.toString();
}
--- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/util/Misc.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/util/Misc.java Thu Dec 11 12:27:27 2014 -0800
@@ -97,11 +97,11 @@
} else if (ch == '&') {
sb.append("&");
} else if (ch < ' ') {
- sb.append("&#" + Integer.toString(ch) + ";");
+ sb.append("&#").append((int)ch).append(';');
} else {
int c = (ch & 0xFFFF);
if (c > 127) {
- sb.append("&#" + Integer.toString(c) + ";");
+ sb.append("&#").append(c).append(';');
} else {
sb.append(ch);
}
--- a/jdk/src/jdk.dev/share/classes/sun/security/tools/jarsigner/Main.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/jdk.dev/share/classes/sun/security/tools/jarsigner/Main.java Thu Dec 11 12:27:27 2014 -0800
@@ -676,14 +676,13 @@
((man.getAttributes(name) != null) ||
(man.getAttributes("./"+name) != null) ||
(man.getAttributes("/"+name) != null));
- sb.append(
- (isSigned ? rb.getString("s") : rb.getString("SPACE")) +
- (inManifest ? rb.getString("m") : rb.getString("SPACE")) +
- (inStore ? rb.getString("k") : rb.getString("SPACE")) +
- (inScope ? rb.getString("i") : rb.getString("SPACE")) +
- ((inStoreOrScope & NOT_ALIAS) != 0 ?"X":" ") +
- rb.getString("SPACE"));
- sb.append("|");
+ sb.append(isSigned ? rb.getString("s") : rb.getString("SPACE"))
+ .append(inManifest ? rb.getString("m") : rb.getString("SPACE"))
+ .append(inStore ? rb.getString("k") : rb.getString("SPACE"))
+ .append(inScope ? rb.getString("i") : rb.getString("SPACE"))
+ .append((inStoreOrScope & NOT_ALIAS) != 0 ? 'X' : ' ')
+ .append(rb.getString("SPACE"));
+ sb.append('|');
}
// When -certs provided, display info has extra empty
@@ -704,11 +703,15 @@
// Print no info for unsigned entries when -verbose:all,
// to be consistent with old behavior.
if (signatureRelated(name)) {
- sb.append("\n" + tab + rb.getString(
- ".Signature.related.entries.") + "\n\n");
+ sb.append('\n')
+ .append(tab)
+ .append(rb
+ .getString(".Signature.related.entries."))
+ .append("\n\n");
} else {
- sb.append("\n" + tab + rb.getString(
- ".Unsigned.entries.") + "\n\n");
+ sb.append('\n').append(tab)
+ .append(rb.getString(".Unsigned.entries."))
+ .append("\n\n");
}
}
@@ -1605,8 +1608,8 @@
// No more warning, we alreay have hasExpiredCert or notYetValidCert
} else {
chainNotValidated = true;
- sb.append(tab + rb.getString(".CertPath.not.validated.") +
- e.getLocalizedMessage() + "]\n"); // TODO
+ sb.append(tab).append(rb.getString(".CertPath.not.validated."))
+ .append(e.getLocalizedMessage()).append("]\n"); // TODO
}
}
String result = sb.toString();
--- a/jdk/src/jdk.jcmd/share/classes/sun/tools/jps/Jps.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/jdk.jcmd/share/classes/sun/tools/jps/Jps.java Thu Dec 11 12:27:27 2014 -0800
@@ -92,28 +92,28 @@
vm = monitoredHost.getMonitoredVm(id, 0);
errorString = " -- main class information unavailable";
- output.append(" " + MonitoredVmUtil.mainClass(vm,
+ output.append(' ').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);
+ output.append(' ').append(mainArgs);
}
}
if (arguments.showVmArgs()) {
errorString = " -- jvm args information unavailable";
String jvmArgs = MonitoredVmUtil.jvmArgs(vm);
if (jvmArgs != null && jvmArgs.length() > 0) {
- output.append(" " + jvmArgs);
+ output.append(' ').append(jvmArgs);
}
}
if (arguments.showVmFlags()) {
errorString = " -- jvm flags information unavailable";
String jvmFlags = MonitoredVmUtil.jvmFlags(vm);
if (jvmFlags != null && jvmFlags.length() > 0) {
- output.append(" " + jvmFlags);
+ output.append(' ').append(jvmFlags);
}
}
--- a/jdk/src/jdk.jcmd/share/classes/sun/tools/jstat/RawOutputFormatter.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/jdk.jcmd/share/classes/sun/tools/jstat/RawOutputFormatter.java Thu Dec 11 12:27:27 2014 -0800
@@ -50,7 +50,7 @@
StringBuilder headerBuilder = new StringBuilder();
for (Iterator<Monitor> i = logged.iterator(); i.hasNext(); /* empty */ ) {
Monitor m = i.next();
- headerBuilder.append(m.getName() + " ");
+ headerBuilder.append(m.getName()).append(' ');
}
header = headerBuilder.toString();
}
--- a/jdk/src/jdk.jcmd/share/classes/sun/tools/jstat/SyntaxException.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/jdk.jcmd/share/classes/sun/tools/jstat/SyntaxException.java Thu Dec 11 12:27:27 2014 -0800
@@ -65,24 +65,21 @@
public SyntaxException(int lineno, Set<String> expected, Token found) {
StringBuilder msg = new StringBuilder();
- msg.append("Syntax error at line " + lineno + ": Expected one of \'");
+ msg.append("Syntax error at line ").append(lineno)
+ .append(": Expected one of \'");
- boolean first = true;
- for (Iterator<String> i = expected.iterator(); i.hasNext(); /* empty */) {
- String keyWord = i.next();
- if (first) {
- msg.append(keyWord);
- first = false;
- } else {
- msg.append("|" + keyWord);
- }
+ for (String keyWord : expected) {
+ msg.append(keyWord).append('|');
+ }
+ if (!expected.isEmpty()) {
+ msg.setLength(msg.length() - 1);
}
- msg.append("\', Found " + found.toMessage());
- message = msg.toString();
+ message = msg.append("\', Found ").append(found.toMessage()).toString();
}
public String getMessage() {
return message;
}
}
+
--- a/jdk/src/jdk.jconsole/share/classes/sun/tools/jconsole/ThreadTab.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/jdk.jconsole/share/classes/sun/tools/jconsole/ThreadTab.java Thu Dec 11 12:27:27 2014 -0800
@@ -368,7 +368,7 @@
sb.append(Messages.STACK_TRACE);
int index = 0;
for (StackTraceElement e : ti.getStackTrace()) {
- sb.append(e.toString()+"\n");
+ sb.append(e).append('\n');
if (monitors != null) {
for (MonitorInfo mi : monitors) {
if (mi.getLockedStackDepth() == index) {
--- a/jdk/src/jdk.jconsole/share/classes/sun/tools/jconsole/inspector/XArrayDataViewer.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/jdk.jconsole/share/classes/sun/tools/jconsole/inspector/XArrayDataViewer.java Thu Dec 11 12:27:27 2014 -0800
@@ -79,25 +79,25 @@
String textColor = String.format("%06x",
foreground.getRGB() & 0xFFFFFF);
StringBuilder sb = new StringBuilder();
- sb.append("<html><body text=#"+textColor+"><table width=\"100%\">");
+ sb.append("<html><body text=#").append(textColor).append("><table width=\"100%\">");
for (int i = 0; i < arr.length; i++) {
if (i % 2 == 0) {
- sb.append("<tr style=\"background-color: " +
- evenRowColorStr + "\"><td><pre>" +
- (arr[i] == null ?
- arr[i] : htmlize(arr[i].toString())) +
- "</pre></td></tr>");
+ sb.append("<tr style=\"background-color: ")
+ .append(evenRowColorStr).append("\"><td><pre>")
+ .append(arr[i] == null ?
+ arr[i] : htmlize(arr[i].toString()))
+ .append("</pre></td></tr>");
} else {
- sb.append("<tr style=\"background-color: " +
- oddRowColorStr + "\"><td><pre>" +
- (arr[i] == null ?
- arr[i] : htmlize(arr[i].toString())) +
- "</pre></td></tr>");
+ sb.append("<tr style=\"background-color: ")
+ .append(oddRowColorStr).append("\"><td><pre>")
+ .append(arr[i] == null ?
+ arr[i] : htmlize(arr[i].toString()))
+ .append("</pre></td></tr>");
}
}
if (arr.length == 0) {
- sb.append("<tr style=\"background-color: " +
- evenRowColorStr + "\"><td></td></tr>");
+ sb.append("<tr style=\"background-color: ")
+ .append(evenRowColorStr).append("\"><td></td></tr>");
}
sb.append("</table></body></html>");
arrayEditor.setText(sb.toString());
--- a/jdk/src/jdk.jconsole/share/classes/sun/tools/jconsole/inspector/XTree.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/jdk.jconsole/share/classes/sun/tools/jconsole/inspector/XTree.java Thu Dec 11 12:27:27 2014 -0800
@@ -507,13 +507,13 @@
// key order defined by the "orderedKeyPropertyList"
for (String key : orderedKeyPropertyList) {
if (map.containsKey(key)) {
- sb.append(key + "=" + map.get(key) + ",");
+ sb.append(key).append('=').append(map.get(key)).append(',');
map.remove(key);
}
}
// Add the remaining key/value pairs to the buffer
for (Map.Entry<String, String> entry : map.entrySet()) {
- sb.append(entry.getKey() + "=" + entry.getValue() + ",");
+ sb.append(entry.getKey()).append('=').append(entry.getValue()).append(',');
}
String orderedKeyPropertyListString = sb.toString();
orderedKeyPropertyListString = orderedKeyPropertyListString.substring(
@@ -622,7 +622,7 @@
//
StringBuilder sb = new StringBuilder();
for (MBeanParameterInfo mbpi : mboi.getSignature()) {
- sb.append(mbpi.getType() + ",");
+ sb.append(mbpi.getType()).append(',');
}
String signature = sb.toString();
if (signature.length() > 0) {
--- a/jdk/src/jdk.jdi/share/classes/com/sun/tools/example/debug/expr/ExpressionParser.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/jdk.jdi/share/classes/com/sun/tools/example/debug/expr/ExpressionParser.java Thu Dec 11 12:27:27 2014 -0800
@@ -59,6 +59,7 @@
StackFrame get() throws IncompatibleThreadStateException;
}
+ @SuppressWarnings("deprecation")
public static Value evaluate(String expr, VirtualMachine vm,
GetFrame frameGetter) throws ParseException,
InvocationException,
--- a/jdk/src/jdk.jdi/share/classes/com/sun/tools/example/debug/expr/ParseException.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/jdk.jdi/share/classes/com/sun/tools/example/debug/expr/ParseException.java Thu Dec 11 12:27:27 2014 -0800
@@ -198,7 +198,7 @@
default:
if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
String s = "0000" + Integer.toString(ch, 16);
- retval.append("\\u" + s.substring(s.length() - 4, s.length()));
+ retval.append("\\u").append(s.substring(s.length() - 4, s.length()));
} else {
retval.append(ch);
}
--- a/jdk/src/jdk.jdi/share/classes/com/sun/tools/example/debug/expr/TokenMgrError.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/jdk.jdi/share/classes/com/sun/tools/example/debug/expr/TokenMgrError.java Thu Dec 11 12:27:27 2014 -0800
@@ -107,7 +107,7 @@
default:
if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
String s = "0000" + Integer.toString(ch, 16);
- retval.append("\\u" + s.substring(s.length() - 4, s.length()));
+ retval.append("\\u").append(s.substring(s.length() - 4, s.length()));
} else {
retval.append(ch);
}
--- a/jdk/src/jdk.jdi/share/classes/com/sun/tools/jdi/VirtualMachineImpl.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/jdk.jdi/share/classes/com/sun/tools/jdi/VirtualMachineImpl.java Thu Dec 11 12:27:27 2014 -0800
@@ -881,12 +881,12 @@
} else if (tag == JDWP.TypeTag.ARRAY) {
sb.append("ArrayType");
} else {
- sb.append("UNKNOWN TAG: " + tag);
+ sb.append("UNKNOWN TAG: ").append(tag);
}
if (signature != null) {
- sb.append(", signature='" + signature + "'");
+ sb.append(", signature='").append(signature).append('\'');
}
- sb.append(", id=" + id);
+ sb.append(", id=").append(id);
vm.printTrace(sb.toString());
}
if (id == 0) {
--- a/jdk/src/jdk.jdwp.agent/share/native/libjdwp/transport.c Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/jdk.jdwp.agent/share/native/libjdwp/transport.c Thu Dec 11 12:27:27 2014 -0800
@@ -66,8 +66,10 @@
len = (int)strlen(msg);
maxlen = len+len/2+2; /* Should allow for plenty of room */
utf8msg = (jbyte*)jvmtiAllocate(maxlen+1);
- (void)utf8FromPlatform(msg, len, utf8msg, maxlen);
- utf8msg[maxlen] = 0;
+ if (utf8msg != NULL) {
+ (void)utf8FromPlatform(msg, len, utf8msg, maxlen);
+ utf8msg[maxlen] = 0;
+ }
}
if (rv == JDWPTRANSPORT_ERROR_NONE) {
ERROR_MESSAGE(("transport error %d: %s",err, utf8msg));
@@ -391,6 +393,10 @@
/* Convert commandLine from UTF-8 to platform encoding */
len = (int)strlen(commandLine);
buf = jvmtiAllocate(len*3+3);
+ if (buf == NULL) {
+ jvmtiDeallocate(commandLine);
+ return JDWP_ERROR(OUT_OF_MEMORY);
+ }
(void)utf8ToPlatform((jbyte*)commandLine, len, buf, len*3+3);
/* Exec commandLine */
@@ -447,21 +453,23 @@
if (info == NULL) {
return JDWP_ERROR(OUT_OF_MEMORY);
}
+ info->timeout = timeout;
+
info->name = jvmtiAllocate((int)strlen(name)+1);
- (void)strcpy(info->name, name);
- info->address = NULL;
- info->timeout = timeout;
if (info->name == NULL) {
serror = JDWP_ERROR(OUT_OF_MEMORY);
goto handleError;
}
+ (void)strcpy(info->name, name);
+
+ info->address = NULL;
if (address != NULL) {
info->address = jvmtiAllocate((int)strlen(address)+1);
- (void)strcpy(info->address, address);
if (info->address == NULL) {
serror = JDWP_ERROR(OUT_OF_MEMORY);
goto handleError;
}
+ (void)strcpy(info->address, address);
}
info->transport = trans;
@@ -478,6 +486,10 @@
*/
len = (int)strlen(name) + (int)strlen(retAddress) + 2; /* ':' and '\0' */
prop_value = (char*)jvmtiAllocate(len);
+ if (prop_value == NULL) {
+ serror = JDWP_ERROR(OUT_OF_MEMORY);
+ goto handleError;
+ }
strcpy(prop_value, name);
strcat(prop_value, ":");
strcat(prop_value, retAddress);
--- a/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/perfdata/monitor/PerfDataBufferImpl.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/perfdata/monitor/PerfDataBufferImpl.java Thu Dec 11 12:27:27 2014 -0800
@@ -158,6 +158,7 @@
* the sun.jvmstat.perfdata.aliasmap file indicates some other
* file as the source.
*/
+ @SuppressWarnings("deprecation")
private void buildAliasMap() {
assert Thread.holdsLock(this);
--- a/jdk/src/jdk.jvmstat/share/classes/sun/tools/jstatd/Jstatd.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/jdk.jvmstat/share/classes/sun/tools/jstatd/Jstatd.java Thu Dec 11 12:27:27 2014 -0800
@@ -76,6 +76,7 @@
}
}
+ @SuppressWarnings("deprecation") // Use of RMISecurityManager
public static void main(String[] args) {
String rminame = null;
int argc = 0;
--- a/jdk/src/jdk.jvmstat/share/classes/sun/tools/jstatd/RemoteHostImpl.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/jdk.jvmstat/share/classes/sun/tools/jstatd/RemoteHostImpl.java Thu Dec 11 12:27:27 2014 -0800
@@ -68,7 +68,7 @@
sb.append("local://").append(lvmid).append("@localhost");
if (mode != null) {
- sb.append("?mode=" + mode);
+ sb.append("?mode=").append(mode);
}
String vmidStr = sb.toString();
--- a/jdk/src/jdk.naming.dns/share/classes/sun/net/spi/nameservice/dns/DNSNameService.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/jdk.naming.dns/share/classes/sun/net/spi/nameservice/dns/DNSNameService.java Thu Dec 11 12:27:27 2014 -0800
@@ -463,12 +463,12 @@
// ---------
- private static void appendIfLiteralAddress(String addr, StringBuffer sb) {
+ private static void appendIfLiteralAddress(String addr, StringBuilder sb) {
if (IPAddressUtil.isIPv4LiteralAddress(addr)) {
- sb.append("dns://" + addr + " ");
+ sb.append("dns://").append(addr).append(' ');
} else {
if (IPAddressUtil.isIPv6LiteralAddress(addr)) {
- sb.append("dns://[" + addr + "] ");
+ sb.append("dns://[").append(addr).append("] ");
}
}
}
@@ -478,7 +478,7 @@
* corresponding to the supplied List of nameservers.
*/
private static String createProviderURL(List<String> nsList) {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
for (String s: nsList) {
appendIfLiteralAddress(s, sb);
}
@@ -491,7 +491,7 @@
* contained in the provided str.
*/
private static String createProviderURL(String str) {
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(str, ",");
while (st.hasMoreTokens()) {
appendIfLiteralAddress(st.nextToken(), sb);
--- a/jdk/src/jdk.naming.rmi/share/classes/com/sun/jndi/rmi/registry/RegistryContext.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/jdk.naming.rmi/share/classes/com/sun/jndi/rmi/registry/RegistryContext.java Thu Dec 11 12:27:27 2014 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -353,6 +353,7 @@
/**
* Wrap a RemoteException inside a NamingException.
*/
+ @SuppressWarnings("deprecation")
public static NamingException wrapRemoteException(RemoteException re) {
NamingException ne;
@@ -413,6 +414,7 @@
* Attempts to install a security manager if none is currently in
* place.
*/
+ @SuppressWarnings("deprecation")
private static void installSecurityMgr() {
try {
--- a/jdk/src/jdk.runtime/share/classes/sun/security/tools/policytool/PolicyTool.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/jdk.runtime/share/classes/sun/security/tools/policytool/PolicyTool.java Thu Dec 11 12:27:27 2014 -0800
@@ -980,8 +980,9 @@
grantEntry.principals.listIterator();
while (list.hasNext()) {
PolicyParser.PrincipalEntry pppe = list.next();
- sb.append(" Principal " + pppe.getDisplayClass() + " " +
- pppe.getDisplayName(true));
+ sb.append(" Principal ").append(pppe.getDisplayClass())
+ .append(' ')
+ .append(pppe.getDisplayName(true));
if (list.hasNext()) sb.append(", ");
}
result = sb.toString();
--- a/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipUtils.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipUtils.java Thu Dec 11 12:27:27 2014 -0800
@@ -103,6 +103,7 @@
/*
* Converts DOS time to Java time (number of milliseconds since epoch).
*/
+ @SuppressWarnings("deprecation")
public static long dosToJavaTime(long dtime) {
Date d = new Date((int)(((dtime >> 25) & 0x7f) + 80),
(int)(((dtime >> 21) & 0x0f) - 1),
@@ -116,6 +117,7 @@
/*
* Converts Java time to DOS time.
*/
+ @SuppressWarnings("deprecation")
public static long javaToDosTime(long time) {
Date d = new Date(time);
int year = d.getYear() + 1900;
--- a/jdk/test/Makefile Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/test/Makefile Thu Dec 11 12:27:27 2014 -0800
@@ -1,5 +1,5 @@
#
-# Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -258,6 +258,11 @@
# ------------------------------------------------------------------
+# When called from JPRT the TESTDIRS variable is set to the jtreg tests to run
+ifdef TESTDIRS
+ TEST_SELECTION = $(TESTDIRS)
+endif
+
ifdef CONCURRENCY
EXTRA_JTREG_OPTIONS += -concurrency:$(CONCURRENCY)
endif
--- a/jdk/test/com/sun/jndi/ldap/LdapTimeoutTest.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/test/com/sun/jndi/ldap/LdapTimeoutTest.java Thu Dec 11 12:27:27 2014 -0800
@@ -28,144 +28,59 @@
* @summary Timeout tests for ldap
*/
-import com.sun.jndi.ldap.Connection;
-
import java.net.Socket;
import java.net.ServerSocket;
import java.net.SocketTimeoutException;
import java.io.*;
import javax.naming.*;
import javax.naming.directory.*;
+import java.util.List;
import java.util.Hashtable;
+import java.util.ArrayList;
import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeoutException;
+import java.util.concurrent.TimeUnit;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static java.util.concurrent.TimeUnit.NANOSECONDS;
-public class LdapTimeoutTest {
- static volatile int passed = 0, failed = 0;
- static void pass() {passed++;}
- static void fail() {failed++; Thread.dumpStack();}
-
- public static void main(String[] args) throws Exception {
- ServerSocket serverSock = new ServerSocket(0);
- Server s = new Server(serverSock);
- s.start();
- Thread.sleep(200);
-
- Hashtable env = new Hashtable(11);
- env.put(Context.INITIAL_CONTEXT_FACTORY,
- "com.sun.jndi.ldap.LdapCtxFactory");
- env.put(Context.PROVIDER_URL, "ldap://localhost:" +
- serverSock.getLocalPort());
+abstract class LdapTest implements Callable {
- env.put(Context.SECURITY_AUTHENTICATION,"simple");
-
- env.put(Context.SECURITY_PRINCIPAL, "user");
- env.put(Context.SECURITY_CREDENTIALS, "password");
-
- InitialContext ctx = null;
- try {
- new LdapTimeoutTest().deadServerNoTimeout(env);
+ Hashtable env;
+ TestServer server;
+ ScheduledExecutorService killSwitchPool;
+ boolean passed = false;
+ private int HANGING_TEST_TIMEOUT = 20_000;
- env.put("com.sun.jndi.ldap.connect.timeout", "10");
- env.put("com.sun.jndi.ldap.read.timeout", "3000");
- new LdapTimeoutTest().ldapReadTimeoutTest(env, false);
- new LdapTimeoutTest().ldapReadTimeoutTest(env, true);
- new LdapTimeoutTest().simpleAuthConnectTest(env);
- } finally {
- s.interrupt();
- }
-
- System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
- if (failed > 0) throw new AssertionError("Some tests failed");
+ public LdapTest (TestServer server, Hashtable env) {
+ this.server = server;
+ this.env = env;
}
- void ldapReadTimeoutTest(Hashtable env, boolean ssl) {
- InitialContext ctx = null;
- if (ssl) env.put(Context.SECURITY_PROTOCOL, "ssl");
- long start = System.nanoTime();
- try {
- ctx = new InitialDirContext(env);
- SearchControls scl = new SearchControls();
- scl.setSearchScope(SearchControls.SUBTREE_SCOPE);
- NamingEnumeration<SearchResult> answer = ((InitialDirContext)ctx)
- .search("ou=People,o=JNDITutorial", "(objectClass=*)", scl);
- // shouldn't reach here
- fail();
- } catch (NamingException e) {
- if (ssl) {
- if (e.getCause() instanceof SocketTimeoutException) {
- pass();
- } else if (e.getCause() instanceof InterruptedIOException) {
- Thread.interrupted();
- fail();
- }
- } else {
- pass();
- }
- } finally {
- if (!shutItDown(ctx)) fail();
- }
+ public LdapTest(TestServer server, Hashtable env,
+ ScheduledExecutorService killSwitchPool)
+ {
+ this(server, env);
+ this.killSwitchPool = killSwitchPool;
}
- void simpleAuthConnectTest(Hashtable env) {
- InitialContext ctx = null;
- long start = System.nanoTime();
- try {
- ctx = new InitialDirContext(env);
- // shouldn't reach here
- System.err.println("Fail: InitialDirContext succeeded");
- fail();
- } catch (NamingException e) {
- long end = System.nanoTime();
- if (e.getCause() instanceof SocketTimeoutException) {
- if (NANOSECONDS.toMillis(end - start) < 2_900) {
- pass();
- } else {
- System.err.println("Fail: Waited too long");
- fail();
- }
- } else if (e.getCause() instanceof InterruptedIOException) {
- Thread.interrupted();
- fail();
- } else {
- fail();
- }
- } finally {
- if (!shutItDown(ctx)) fail();
- }
+ public abstract void performOp(InitialContext ctx) throws NamingException;
+ public abstract void handleNamingException(
+ NamingException e, long start, long end);
+
+ public void pass() {
+ this.passed = true;
}
- void deadServerNoTimeout(Hashtable env) {
- InitialContext ctx = null;
- long start = System.currentTimeMillis();
- try {
- ctx = new InitialDirContext(env);
- SearchControls scl = new SearchControls();
- scl.setSearchScope(SearchControls.SUBTREE_SCOPE);
- NamingEnumeration<SearchResult> answer = ((InitialDirContext)ctx)
- .search("ou=People,o=JNDITutorial", "(objectClass=*)", scl);
- // shouldn't reach here
- fail();
- } catch (NamingException e) {
- long elapsed = System.currentTimeMillis() - start;
- if (elapsed < Connection.DEFAULT_READ_TIMEOUT_MILLIS) {
- System.err.printf("fail: timeout should be at least %s ms, " +
- "actual time is %s ms%n",
- Connection.DEFAULT_READ_TIMEOUT_MILLIS, elapsed);
- e.printStackTrace();
- fail();
- } else {
- pass();
- }
- } finally {
- if (!shutItDown(ctx)) fail();
- }
+ public void fail() {
+ throw new RuntimeException("Test failed");
}
boolean shutItDown(InitialContext ctx) {
@@ -177,18 +92,376 @@
}
}
- static class Server extends Thread {
- final ServerSocket serverSock;
+ public Boolean call() {
+ InitialContext ctx = null;
+ ScheduledFuture killer = null;
+ long start = System.nanoTime();
+
+ try {
+ while(!server.accepting())
+ Thread.sleep(200); // allow the server to start up
+ Thread.sleep(200); // to be sure
- Server(ServerSocket serverSock) {
- this.serverSock = serverSock;
+ // if this is a hanging test, scheduled a thread to
+ // interrupt after a certain time
+ if (killSwitchPool != null) {
+ final Thread current = Thread.currentThread();
+ killer = killSwitchPool.schedule(
+ new Callable<Void>() {
+ public Void call() throws Exception {
+ current.interrupt();
+ return null;
+ }
+ }, HANGING_TEST_TIMEOUT, MILLISECONDS);
+ }
+
+ env.put(Context.PROVIDER_URL, "ldap://localhost:" +
+ server.getLocalPort());
+
+ try {
+ ctx = new InitialDirContext(env);
+ performOp(ctx);
+ fail();
+ } catch (NamingException e) {
+ long end = System.nanoTime();
+ System.out.println(this.getClass().toString() + " - elapsed: "
+ + NANOSECONDS.toMillis(end - start));
+ handleNamingException(e, start, end);
+ } finally {
+ if (killer != null && !killer.isDone())
+ killer.cancel(true);
+ shutItDown(ctx);
+ server.close();
+ }
+ return passed;
+ } catch (IOException|InterruptedException e) {
+ throw new RuntimeException(e);
}
+ }
+}
- public void run() {
- try {
- Socket socket = serverSock.accept();
- } catch (IOException e) {}
+abstract class ReadServerTest extends LdapTest {
+
+ public ReadServerTest(Hashtable env) throws IOException {
+ super(new BindableServer(), env);
+ }
+
+ public ReadServerTest(Hashtable env,
+ ScheduledExecutorService killSwitchPool)
+ throws IOException
+ {
+ super(new BindableServer(), env, killSwitchPool);
+ }
+
+ public void performOp(InitialContext ctx) throws NamingException {
+ SearchControls scl = new SearchControls();
+ scl.setSearchScope(SearchControls.SUBTREE_SCOPE);
+ NamingEnumeration<SearchResult> answer = ((InitialDirContext)ctx)
+ .search("ou=People,o=JNDITutorial", "(objectClass=*)", scl);
+ }
+}
+
+abstract class DeadServerTest extends LdapTest {
+
+ public DeadServerTest(Hashtable env) throws IOException {
+ super(new DeadServer(), env);
+ }
+
+ public DeadServerTest(Hashtable env,
+ ScheduledExecutorService killSwitchPool)
+ throws IOException
+ {
+ super(new DeadServer(), env, killSwitchPool);
+ }
+
+ public void performOp(InitialContext ctx) throws NamingException {}
+}
+
+class DeadServerNoTimeoutTest extends DeadServerTest {
+
+ public DeadServerNoTimeoutTest(Hashtable env,
+ ScheduledExecutorService killSwitchPool)
+ throws IOException
+ {
+ super(env, killSwitchPool);
+ }
+
+ public void handleNamingException(NamingException e, long start, long end) {
+ if (e instanceof InterruptedNamingException) Thread.interrupted();
+
+ if (NANOSECONDS.toMillis(end - start) < LdapTimeoutTest.MIN_TIMEOUT) {
+ System.err.printf("DeadServerNoTimeoutTest fail: timeout should be " +
+ "at least %s ms, actual time is %s ms%n",
+ LdapTimeoutTest.MIN_TIMEOUT,
+ NANOSECONDS.toMillis(end - start));
+ fail();
+ } else {
+ pass();
+ }
+ }
+}
+
+class DeadServerTimeoutTest extends DeadServerTest {
+
+ public DeadServerTimeoutTest(Hashtable env) throws IOException {
+ super(env);
+ }
+
+ public void handleNamingException(NamingException e, long start, long end)
+ {
+ // non SSL connect will timeout via readReply using connectTimeout
+ if (NANOSECONDS.toMillis(end - start) < 2_900) {
+ pass();
+ } else {
+ System.err.println("Fail: Waited too long");
+ fail();
+ }
+ }
+}
+
+class DeadServerTimeoutSSLTest extends DeadServerTest {
+
+ public DeadServerTimeoutSSLTest(Hashtable env) throws IOException {
+ super(env);
+ }
+
+ public void handleNamingException(NamingException e, long start, long end) {
+ if (e.getCause() instanceof SocketTimeoutException) {
+ // SSL connect will timeout via readReply using
+ // SocketTimeoutException
+ pass();
+ } else {
+ fail();
+ }
+ }
+}
+
+
+class ReadServerNoTimeoutTest extends ReadServerTest {
+
+ public ReadServerNoTimeoutTest(Hashtable env,
+ ScheduledExecutorService killSwitchPool)
+ throws IOException
+ {
+ super(env, killSwitchPool);
+ }
+
+ public void handleNamingException(NamingException e, long start, long end) {
+ if (e instanceof InterruptedNamingException) Thread.interrupted();
+
+ if (NANOSECONDS.toMillis(end - start) < LdapTimeoutTest.MIN_TIMEOUT) {
+ System.err.printf("ReadServerNoTimeoutTest fail: timeout should be " +
+ "at least %s ms, actual time is %s ms%n",
+ LdapTimeoutTest.MIN_TIMEOUT,
+ NANOSECONDS.toMillis(end - start));
+ fail();
+ } else {
+ pass();
+ }
+ }
+}
+
+class ReadServerTimeoutTest extends ReadServerTest {
+
+ public ReadServerTimeoutTest(Hashtable env) throws IOException {
+ super(env);
+ }
+
+ public void handleNamingException(NamingException e, long start, long end) {
+ if (NANOSECONDS.toMillis(end - start) < 2_900) {
+ fail();
+ } else {
+ pass();
}
}
}
+class TestServer extends Thread {
+ ServerSocket serverSock;
+ boolean accepting = false;
+
+ public TestServer() throws IOException {
+ this.serverSock = new ServerSocket(0);
+ start();
+ }
+
+ public int getLocalPort() {
+ return serverSock.getLocalPort();
+ }
+
+ public boolean accepting() {
+ return accepting;
+ }
+
+ public void close() throws IOException {
+ serverSock.close();
+ }
+}
+
+class BindableServer extends TestServer {
+
+ public BindableServer() throws IOException {
+ super();
+ }
+
+ private byte[] bindResponse = {
+ 0x30, 0x0C, 0x02, 0x01, 0x01, 0x61, 0x07, 0x0A,
+ 0x01, 0x00, 0x04, 0x00, 0x04, 0x00
+ };
+
+ public void run() {
+ try {
+ accepting = true;
+ Socket socket = serverSock.accept();
+ InputStream in = socket.getInputStream();
+ OutputStream out = socket.getOutputStream();
+
+ // Read the LDAP BindRequest
+ while (in.read() != -1) {
+ in.skip(in.available());
+ break;
+ }
+
+ // Write an LDAP BindResponse
+ out.write(bindResponse);
+ out.flush();
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+}
+
+class DeadServer extends TestServer {
+
+ public DeadServer() throws IOException {
+ super();
+ }
+
+ public void run() {
+ while(true) {
+ try {
+ accepting = true;
+ Socket socket = serverSock.accept();
+ } catch (Exception e) {
+ break;
+ }
+ }
+ }
+}
+
+public class LdapTimeoutTest {
+
+ private static final ExecutorService testPool =
+ Executors.newFixedThreadPool(3);
+ private static final ScheduledExecutorService killSwitchPool =
+ Executors.newScheduledThreadPool(3);
+ public static int MIN_TIMEOUT = 18_000;
+
+ static Hashtable createEnv() {
+ Hashtable env = new Hashtable(11);
+ env.put(Context.INITIAL_CONTEXT_FACTORY,
+ "com.sun.jndi.ldap.LdapCtxFactory");
+ return env;
+ }
+
+ public static void main(String[] args) throws Exception {
+
+ InitialContext ctx = null;
+ List<Future> results = new ArrayList<>();
+
+ try {
+ // run the DeadServerTest with no timeouts set
+ // this should get stuck indefinitely, so we need to kill
+ // it after a timeout
+ System.out.println("Running connect timeout test with 20s kill switch");
+ Hashtable env = createEnv();
+ results.add(
+ testPool.submit(new DeadServerNoTimeoutTest(env, killSwitchPool)));
+
+ // run the ReadServerTest with connect timeout set
+ // this should get stuck indefinitely so we need to kill
+ // it after a timeout
+ System.out.println("Running read timeout test with 10ms connect timeout & 20s kill switch");
+ Hashtable env1 = createEnv();
+ env1.put("com.sun.jndi.ldap.connect.timeout", "10");
+ results.add(testPool.submit(
+ new ReadServerNoTimeoutTest(env1, killSwitchPool)));
+
+ // run the ReadServerTest with no timeouts set
+ // this should get stuck indefinitely, so we need to kill
+ // it after a timeout
+ System.out.println("Running read timeout test with 20s kill switch");
+ Hashtable env2 = createEnv();
+ results.add(testPool.submit(
+ new ReadServerNoTimeoutTest(env2, killSwitchPool)));
+
+ // run the DeadServerTest with connect / read timeouts set
+ // this should exit after the connect timeout expires
+ System.out.println("Running connect timeout test with 10ms connect timeout, 3000ms read timeout");
+ Hashtable env3 = createEnv();
+ env3.put("com.sun.jndi.ldap.connect.timeout", "10");
+ env3.put("com.sun.jndi.ldap.read.timeout", "3000");
+ results.add(testPool.submit(new DeadServerTimeoutTest(env3)));
+
+
+ // run the ReadServerTest with connect / read timeouts set
+ // this should exit after the connect timeout expires
+ System.out.println("Running read timeout test with 10ms connect timeout, 3000ms read timeout");
+ Hashtable env4 = createEnv();
+ env4.put("com.sun.jndi.ldap.connect.timeout", "10");
+ env4.put("com.sun.jndi.ldap.read.timeout", "3000");
+ results.add(testPool.submit(new ReadServerTimeoutTest(env4)));
+
+ // run the DeadServerTest with connect timeout set
+ // this should exit after the connect timeout expires
+ System.out.println("Running connect timeout test with 10ms connect timeout");
+ Hashtable env5 = createEnv();
+ env5.put("com.sun.jndi.ldap.connect.timeout", "10");
+ results.add(testPool.submit(new DeadServerTimeoutTest(env5)));
+
+ // 8000487: Java JNDI connection library on ldap conn is
+ // not honoring configured timeout
+ System.out.println("Running simple auth connection test");
+ Hashtable env6 = createEnv();
+ env6.put("com.sun.jndi.ldap.connect.timeout", "10");
+ env6.put("com.sun.jndi.ldap.read.timeout", "3000");
+ env6.put(Context.SECURITY_AUTHENTICATION, "simple");
+ env6.put(Context.SECURITY_PRINCIPAL, "user");
+ env6.put(Context.SECURITY_CREDENTIALS, "password");
+ results.add(testPool.submit(new DeadServerTimeoutTest(env6)));
+
+ boolean testFailed = false;
+ for (Future test : results) {
+ while (!test.isDone()) {
+ if ((Boolean) test.get() == false)
+ testFailed = true;
+ }
+ }
+
+ //
+ // Running this test serially as it seems to tickle a problem
+ // on older kernels
+ //
+ // run the DeadServerTest with connect / read timeouts set
+ // and ssl enabled
+ // this should exit with a SocketTimeoutException as the root cause
+ // it should also use the connect timeout instead of the read timeout
+ System.out.println("Running connect timeout test with 10ms connect timeout, 3000ms read timeout & SSL");
+ Hashtable sslenv = createEnv();
+ sslenv.put("com.sun.jndi.ldap.connect.timeout", "10");
+ sslenv.put("com.sun.jndi.ldap.read.timeout", "3000");
+ sslenv.put(Context.SECURITY_PROTOCOL, "ssl");
+ testFailed = (new DeadServerTimeoutSSLTest(sslenv).call()) ? false : true;
+
+ if (testFailed) {
+ throw new AssertionError("some tests failed");
+ }
+
+ } finally {
+ LdapTimeoutTest.killSwitchPool.shutdown();
+ LdapTimeoutTest.testPool.shutdown();
+ }
+ }
+
+}
+
--- a/jdk/test/java/lang/invoke/ExplicitCastArgumentsTest.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/test/java/lang/invoke/ExplicitCastArgumentsTest.java Thu Dec 11 12:27:27 2014 -0800
@@ -32,21 +32,36 @@
*/
public class ExplicitCastArgumentsTest {
private static final boolean VERBOSE = Boolean.getBoolean("verbose");
+ private static final Class<?> THIS_CLASS = ExplicitCastArgumentsTest.class;
public static void main(String[] args) throws Throwable {
+ testVarargsCollector();
+ testRef2Prim();
+ System.out.println("TEST PASSED");
+ }
+
+ public static String[] f(String... args) { return args; }
+
+ public static void testVarargsCollector() throws Throwable {
+ MethodType mt = MethodType.methodType(String[].class, String[].class);
+ MethodHandle mh = MethodHandles.publicLookup().findStatic(THIS_CLASS, "f", mt);
+ mh = MethodHandles.explicitCastArguments(mh, MethodType.methodType(Object.class, Object.class));
+ mh.invokeWithArguments((Object)(new String[] {"str1", "str2"}));
+ }
+
+ public static void testRef2Prim() throws Throwable {
for (Wrapper from : Wrapper.values()) {
for (Wrapper to : Wrapper.values()) {
if (from == Wrapper.VOID || to == Wrapper.VOID) continue;
- testRef2Prim (from, to);
+ testRef2Prim(from, to);
}
}
- System.out.println("TEST PASSED");
}
public static void testRef2Prim(Wrapper from, Wrapper to) throws Throwable {
// MHs.eCA javadoc:
// If T0 is a reference and T1 a primitive, and if the reference is null at runtime, a zero value is introduced.
- test(from.wrapperType(), to.primitiveType(), null, false);
+ test(from.wrapperType(), to.primitiveType(), null, false);
}
public static void test(Class<?> from, Class<?> to, Object param, boolean failureExpected) throws Throwable {
--- a/jdk/test/java/lang/invoke/LFCaching/LFGarbageCollectedTest.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/test/java/lang/invoke/LFCaching/LFGarbageCollectedTest.java Thu Dec 11 12:27:27 2014 -0800
@@ -26,7 +26,6 @@
* @bug 8046703
* @summary Test verifies that lambda forms are garbage collected
* @author kshefov
- * @ignore 8057020
* @library /lib/testlibrary/jsr292 /lib/testlibrary
* @build TestMethods
* @build LambdaFormTestCase
--- a/jdk/test/java/lang/invoke/LFCaching/LambdaFormTestCase.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/test/java/lang/invoke/LFCaching/LambdaFormTestCase.java Thu Dec 11 12:27:27 2014 -0800
@@ -31,6 +31,7 @@
import java.util.List;
import java.util.function.Function;
import jdk.testlibrary.Utils;
+import jdk.testlibrary.TimeLimitedRunner;
/**
* Lambda forms caching test case class. Contains all necessary test routines to
@@ -45,7 +46,7 @@
private final static String INTERNAL_FORM_METHOD_NAME = "internalForm";
private static final double ITERATIONS_TO_CODE_CACHE_SIZE_RATIO
= 45 / (128.0 * 1024 * 1024);
- private static final long TIMEOUT = Utils.adjustTimeout(Utils.DEFAULT_TEST_TIMEOUT);
+ private static final long TIMEOUT = Helper.IS_THOROUGH ? 0L : (long) (Utils.adjustTimeout(Utils.DEFAULT_TEST_TIMEOUT) * 0.9);
/**
* Reflection link to {@code j.l.i.MethodHandle.internalForm} method. It is
@@ -68,13 +69,98 @@
}
gcInfo = ManagementFactory.getGarbageCollectorMXBeans();
- if (gcInfo.size() == 0) {
+ if (gcInfo.size() == 0) {
throw new Error("No GarbageCollectorMXBeans found.");
}
}
private final TestMethods testMethod;
private long gcCountAtStart;
+
+ private static class TestRun {
+
+ final Function<TestMethods, LambdaFormTestCase> ctor;
+ final Collection<TestMethods> testMethods;
+ final long totalIterations;
+ long doneIterations;
+ long testCounter;
+ long failCounter;
+ boolean passed;
+
+ TestRun(Function<TestMethods, LambdaFormTestCase> ctor, Collection<TestMethods> testMethods) {
+ this.ctor = ctor;
+ this.testMethods = testMethods;
+ long testCaseNum = testMethods.size();
+ long iterations = Math.max(1, Helper.TEST_LIMIT / testCaseNum);
+ System.out.printf("Number of iterations according to -DtestLimit is %d (%d cases)%n",
+ iterations, iterations * testCaseNum);
+ HotSpotDiagnosticMXBean hsDiagBean = ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class);
+ long codeCacheSize = Long.parseLong(
+ hsDiagBean.getVMOption("ReservedCodeCacheSize").getValue());
+ System.out.printf("Code cache size is %d bytes%n", codeCacheSize);
+ long iterationsByCodeCacheSize = (long) (codeCacheSize
+ * ITERATIONS_TO_CODE_CACHE_SIZE_RATIO);
+ long nonProfiledCodeCacheSize = Long.parseLong(
+ hsDiagBean.getVMOption("NonProfiledCodeHeapSize").getValue());
+ System.out.printf("Non-profiled code cache size is %d bytes%n", nonProfiledCodeCacheSize);
+ long iterationsByNonProfiledCodeCacheSize = (long) (nonProfiledCodeCacheSize
+ * ITERATIONS_TO_CODE_CACHE_SIZE_RATIO);
+ System.out.printf("Number of iterations limited by code cache size is %d (%d cases)%n",
+ iterationsByCodeCacheSize, iterationsByCodeCacheSize * testCaseNum);
+ System.out.printf("Number of iterations limited by non-profiled code cache size is %d (%d cases)%n",
+ iterationsByNonProfiledCodeCacheSize, iterationsByNonProfiledCodeCacheSize * testCaseNum);
+ iterations = Math.min(iterationsByCodeCacheSize,
+ Math.min(iterations, iterationsByNonProfiledCodeCacheSize));
+ if (iterations == 0) {
+ System.out.println("Warning: code cache size is too small to provide at"
+ + " least one iteration! Test will try to do one iteration.");
+ iterations = 1;
+ }
+ System.out.printf("Number of iterations is set to %d (%d cases)%n",
+ iterations, iterations * testCaseNum);
+ System.out.flush();
+ totalIterations = iterations;
+ doneIterations = 0L;
+ testCounter = 0L;
+ failCounter = 0L;
+ passed = true;
+ }
+
+ Boolean doIteration() {
+ if (doneIterations >= totalIterations) {
+ return false;
+ }
+ System.err.println(String.format("Iteration %d:", doneIterations));
+ for (TestMethods testMethod : testMethods) {
+ LambdaFormTestCase testCase = ctor.apply(testMethod);
+ try {
+ System.err.printf("Tested LF caching feature with MethodHandles.%s method.%n",
+ testCase.getTestMethod().name);
+ testCase.doTest();
+ System.err.println("PASSED");
+ } catch (Throwable t) {
+ t.printStackTrace();
+ System.err.printf("FAILED. Caused by %s%n", t.getMessage());
+ passed = false;
+ failCounter++;
+ }
+ testCounter++;
+ }
+ doneIterations++;
+ return true;
+ }
+
+ void checkPassed() {
+ if (!passed) {
+ throw new Error(String.format("%d of %d test cases FAILED! %n"
+ + "Rerun the test with the same \"-Dseed=\" option as in the log file!",
+ failCounter, testCounter));
+ } else {
+ System.err.printf("All %d test cases PASSED!%n", testCounter);
+ }
+ }
+ }
+
/**
* Test case constructor. Generates test cases with random method types for
* given methods form {@code j.l.i.MethodHandles} class.
@@ -108,71 +194,15 @@
* @param testMethods list of test methods
*/
public static void runTests(Function<TestMethods, LambdaFormTestCase> ctor, Collection<TestMethods> testMethods) {
- boolean passed = true;
- int testCounter = 0;
- int failCounter = 0;
- long testCaseNum = testMethods.size();
- long iterations = Math.max(1, Helper.TEST_LIMIT / testCaseNum);
- System.out.printf("Number of iterations according to -DtestLimit is %d (%d cases)%n",
- iterations, iterations * testCaseNum);
- HotSpotDiagnosticMXBean hsDiagBean = ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class);
- long codeCacheSize = Long.parseLong(
- hsDiagBean.getVMOption("ReservedCodeCacheSize").getValue());
- System.out.printf("Code cache size is %d bytes%n", codeCacheSize);
- long iterationsByCodeCacheSize = (long) (codeCacheSize
- * ITERATIONS_TO_CODE_CACHE_SIZE_RATIO);
- long nonProfiledCodeCacheSize = Long.parseLong(
- hsDiagBean.getVMOption("NonProfiledCodeHeapSize").getValue());
- System.out.printf("Non-profiled code cache size is %d bytes%n", nonProfiledCodeCacheSize);
- long iterationsByNonProfiledCodeCacheSize = (long) (nonProfiledCodeCacheSize
- * ITERATIONS_TO_CODE_CACHE_SIZE_RATIO);
- System.out.printf("Number of iterations limited by code cache size is %d (%d cases)%n",
- iterationsByCodeCacheSize, iterationsByCodeCacheSize * testCaseNum);
- System.out.printf("Number of iterations limited by non-profiled code cache size is %d (%d cases)%n",
- iterationsByNonProfiledCodeCacheSize, iterationsByNonProfiledCodeCacheSize * testCaseNum);
- iterations = Math.min(iterationsByCodeCacheSize,
- Math.min(iterations, iterationsByNonProfiledCodeCacheSize));
- if (iterations == 0) {
- System.out.println("Warning: code cache size is too small to provide at"
- + " least one iteration! Test will try to do one iteration.");
- iterations = 1;
+ LambdaFormTestCase.TestRun run =
+ new LambdaFormTestCase.TestRun(ctor, testMethods);
+ TimeLimitedRunner runner = new TimeLimitedRunner(TIMEOUT, 4.0d, run::doIteration);
+ try {
+ runner.call();
+ } catch (Exception ex) {
+ System.err.println("FAILED");
+ throw new Error("Unexpected error!", ex);
}
- System.out.printf("Number of iterations is set to %d (%d cases)%n",
- iterations, iterations * testCaseNum);
- System.out.flush();
- long startTime = System.currentTimeMillis();
- for (long i = 0; i < iterations; i++) {
- System.err.println(String.format("Iteration %d:", i));
- for (TestMethods testMethod : testMethods) {
- LambdaFormTestCase testCase = ctor.apply(testMethod);
- try {
- System.err.printf("Tested LF caching feature with MethodHandles.%s method.%n",
- testCase.getTestMethod().name);
- testCase.doTest();
- System.err.println("PASSED");
- } catch (Throwable t) {
- t.printStackTrace();
- System.err.println("FAILED");
- passed = false;
- failCounter++;
- }
- testCounter++;
- }
- long passedTime = System.currentTimeMillis() - startTime;
- long avgIterTime = passedTime / (i + 1);
- long remainTime = TIMEOUT - passedTime;
- if (avgIterTime > 2 * remainTime) {
- System.err.printf("Stopping iterations because of lack of time.%n"
- + "Increase timeout factor for more iterations.%n");
- break;
- }
- }
- if (!passed) {
- throw new Error(String.format("%d of %d test cases FAILED! %n"
- + "Rerun the test with the same \"-Dseed=\" option as in the log file!",
- failCounter, testCounter));
- } else {
- System.err.println(String.format("All %d test cases PASSED!", testCounter));
- }
+ run.checkPassed();
}
}
--- a/jdk/test/java/nio/channels/FileChannel/TransferToChannel.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/test/java/nio/channels/FileChannel/TransferToChannel.java Thu Dec 11 12:27:27 2014 -0800
@@ -24,6 +24,8 @@
/* @test
* @bug 4652496
* @summary Test transferTo with different target channels
+ * @run main TransferToChannel
+ * @run main/othervm -Djdk.net.enableFastFileTransfer TransferToChannel
*/
import java.nio.channels.FileChannel;
--- a/jdk/test/java/nio/file/Files/SBC.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/test/java/nio/file/Files/SBC.java Thu Dec 11 12:27:27 2014 -0800
@@ -22,7 +22,7 @@
*/
/* @test
- * @bug 4313887
+ * @bug 4313887 8066915
* @summary Unit test for java.nio.file.Files.newByteChannel
* @library ..
*/
@@ -59,6 +59,7 @@
dosSharingOptionTests(dir);
// misc. tests
+ directoryOpenTests(dir);
badCombinations(dir);
unsupportedOptions(dir);
nullTests(dir);
@@ -278,6 +279,21 @@
}
}
+ // test opening a directory for read or write
+ static void directoryOpenTests(Path dir) throws Exception {
+ try (SeekableByteChannel sbc = Files.newByteChannel(dir, READ)) {
+ throw new RuntimeException("Opened directory for read");
+ } catch (IOException expected) { }
+
+ try (SeekableByteChannel sbc = Files.newByteChannel(dir, WRITE)) {
+ throw new RuntimeException("Opened directory for write");
+ } catch (IOException expected) { }
+
+ try (SeekableByteChannel sbc = Files.newByteChannel(dir, APPEND)) {
+ throw new RuntimeException("Opened directory for append ");
+ } catch (IOException expected) { }
+ }
+
// Windows specific options for the use by applications that really want
// to use legacy DOS sharing options
static void dosSharingOptionTests(Path dir) throws Exception {
--- a/jdk/test/java/rmi/testlibrary/JavaVM.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/test/java/rmi/testlibrary/JavaVM.java Thu Dec 11 12:27:27 2014 -0800
@@ -34,6 +34,8 @@
*/
public class JavaVM {
+ public static final long POLLTIME_MS = 100L;
+
protected Process vm = null;
private String classname = "";
@@ -192,23 +194,21 @@
throws InterruptedException, TimeoutException {
if (vm == null)
throw new IllegalStateException("can't wait for JavaVM that isn't running");
- long startTime = System.currentTimeMillis();
- long rem = timeout;
+ long deadline = computeDeadline(System.currentTimeMillis(), timeout);
- do {
+ while (true) {
try {
int status = vm.exitValue();
outPipe.join();
errPipe.join();
return status;
- } catch (IllegalThreadStateException ex) {
- if (rem > 0) {
- Thread.sleep(Math.min(rem, 100));
- }
- }
- rem = timeout - (System.currentTimeMillis() - startTime);
- } while (rem > 0);
- throw new TimeoutException();
+ } catch (IllegalThreadStateException ignore) { }
+
+ if (System.currentTimeMillis() > deadline)
+ throw new TimeoutException();
+
+ Thread.sleep(POLLTIME_MS);
+ }
}
/**
@@ -218,4 +218,21 @@
start();
return waitFor();
}
+
+ /**
+ * Computes a deadline from a timestamp and a timeout value.
+ * Maximum timeout (before multipliers are applied) is one hour.
+ */
+ public static long computeDeadline(long timestamp, long timeout) {
+ final long MAX_TIMEOUT_MS = 3_600_000L;
+
+ if (timeout < 0L || timeout > MAX_TIMEOUT_MS) {
+ throw new IllegalArgumentException("timeout " + timeout + "ms out of range");
+ }
+
+ // TODO apply test.timeout.factor (and possibly jcov.sleep.multiplier)
+ // here instead of upstream
+
+ return timestamp + timeout;
+ }
}
--- a/jdk/test/java/rmi/testlibrary/RMID.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/test/java/rmi/testlibrary/RMID.java Thu Dec 11 12:27:27 2014 -0800
@@ -256,19 +256,28 @@
} catch (NumberFormatException ignore) {}
waitTime = waitTime * slopFactor;
- // We check several times, for a maximum of waitTime, until we have
- // verified that rmid is running.
- do {
+ long startTime = System.currentTimeMillis();
+ long deadline = computeDeadline(startTime, waitTime);
+
+ while (true) {
try {
- Thread.sleep(Math.min(waitTime, POLLTIME_MS));
+ Thread.sleep(POLLTIME_MS);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
- mesg("Interrupted while starting activation system, giving up.");
+ mesg("Starting rmid interrupted, giving up at " +
+ (System.currentTimeMillis() - startTime) + "ms.");
return;
}
- waitTime -= POLLTIME_MS;
- // Checking if rmid is present
+ try {
+ int status = vm.exitValue();
+ TestLibrary.bomb("Rmid process exited with status " + status + " after " +
+ (System.currentTimeMillis() - startTime) + "ms.");
+ } catch (IllegalThreadStateException ignore) { }
+
+ // The rmid process is alive; check to see whether
+ // it responds to a remote call.
+
if (lookupSystem(port) != null) {
/*
* We need to set the java.rmi.activation.port value as the
@@ -278,15 +287,16 @@
* incorrect value.
*/
System.setProperty("java.rmi.activation.port", Integer.toString(port));
- mesg("Started successfully.");
+ mesg("Started successfully after " +
+ (System.currentTimeMillis() - startTime) + "ms.");
return;
- } else {
- if (waitTime > 0) {
- mesg("rmid not started, will retry for " + waitTime + "ms");
- }
}
- } while (waitTime > 0);
- TestLibrary.bomb("Failed to start rmid, giving up.", null);
+
+ if (System.currentTimeMillis() > deadline) {
+ TestLibrary.bomb("Failed to start rmid, giving up after " +
+ (System.currentTimeMillis() - startTime) + "ms.", null);
+ }
+ }
}
/**
@@ -309,9 +319,11 @@
*/
private boolean shutdown() throws InterruptedException {
mesg("shutdown()");
+ long startTime = System.currentTimeMillis();
ActivationSystem system = lookupSystem(port);
if (system == null) {
- mesg("lookupSystem() returned null");
+ mesg("lookupSystem() returned null after " +
+ (System.currentTimeMillis() - startTime) + "ms.");
return false;
}
@@ -325,10 +337,12 @@
try {
waitFor(TIMEOUT_SHUTDOWN_MS);
- mesg("Shutdown successful.");
+ mesg("Shutdown successful after " +
+ (System.currentTimeMillis() - startTime) + "ms.");
return true;
} catch (TimeoutException ex) {
- mesg("Shutdown timed out:");
+ mesg("Shutdown timed out after " +
+ (System.currentTimeMillis() - startTime) + "ms:");
ex.printStackTrace();
return false;
}
@@ -344,6 +358,8 @@
throw new IllegalStateException("can't wait for RMID that isn't running");
}
+ long startTime = System.currentTimeMillis();
+
// First, attempt graceful shutdown of the activation system.
try {
if (! shutdown()) {
@@ -352,14 +368,17 @@
vm.destroy();
try {
waitFor(TIMEOUT_DESTROY_MS);
- mesg("Destroy successful.");
+ mesg("Destroy successful after " +
+ (System.currentTimeMillis() - startTime) + "ms.");
} catch (TimeoutException ex) {
- mesg("Destroy timed out, giving up.");
+ mesg("Destroy timed out, giving up after " +
+ (System.currentTimeMillis() - startTime) + "ms:");
ex.printStackTrace();
}
}
} catch (InterruptedException ie) {
- mesg("Shutdown/destroy interrupted, giving up.");
+ mesg("Shutdown/destroy interrupted, giving up at " +
+ (System.currentTimeMillis() - startTime) + "ms.");
ie.printStackTrace();
Thread.currentThread().interrupt();
return;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/logging/LogManagerAppContextDeadlock.java Thu Dec 11 12:27:27 2014 -0800
@@ -0,0 +1,370 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.lang.management.ManagementFactory;
+import java.lang.management.ThreadInfo;
+import java.security.CodeSource;
+import java.security.Permission;
+import java.security.PermissionCollection;
+import java.security.Permissions;
+import java.security.Policy;
+import java.security.ProtectionDomain;
+import java.util.Enumeration;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.logging.LogManager;
+import java.util.logging.Logger;
+
+/**
+ * @test
+ * @bug 8065991
+ * @summary check that when LogManager is initialized, a deadlock similar
+ * to that described in 8065709 will not occur.
+ * @run main/othervm LogManagerAppContextDeadlock UNSECURE
+ * @run main/othervm LogManagerAppContextDeadlock SECURE
+ *
+ * @author danielfuchs
+ */
+public class LogManagerAppContextDeadlock {
+
+ public static final Semaphore sem = new Semaphore(0);
+ public static final Semaphore sem2 = new Semaphore(0);
+ public static final Semaphore sem3 = new Semaphore(-2);
+ public static volatile boolean goOn = true;
+ public static volatile Exception thrown;
+
+ // Emulate EventQueue
+ static class FakeEventQueue {
+ static final Logger logger = Logger.getLogger("foo");
+ }
+
+ // Emulate AppContext
+ static class FakeAppContext {
+
+ final static AtomicInteger numAppContexts = new AtomicInteger(0);
+ static final class FakeAppContextLock {}
+ static final FakeAppContextLock lock = new FakeAppContextLock();
+ static volatile FakeAppContext appContext;
+
+ final FakeEventQueue queue;
+ FakeAppContext() {
+ appContext = this;
+ numAppContexts.incrementAndGet();
+ // release sem2 to let Thread t2 call Logger.getLogger().
+ sem2.release();
+ try {
+ // Wait until we JavaAWTAccess is called by LogManager.
+ // Thread 2 will call Logger.getLogger() which will
+ // trigger a call to JavaAWTAccess - which will release
+ // sem, thus ensuring that Thread #2 is where we want it.
+ sem.acquire();
+ System.out.println("Sem acquired: Thread #2 has called JavaAWTAccess");
+ } catch(InterruptedException x) {
+ Thread.interrupted();
+ }
+ queue = new FakeEventQueue();
+ }
+
+ static FakeAppContext getAppContext() {
+ synchronized (lock) {
+ if (numAppContexts.get() == 0) {
+ return new FakeAppContext();
+ }
+ return appContext;
+ }
+ }
+
+ static {
+ sun.misc.SharedSecrets.setJavaAWTAccess(new sun.misc.JavaAWTAccess() {
+ @Override
+ public Object getAppletContext() {
+ if (numAppContexts.get() == 0) return null;
+ // We are in JavaAWTAccess, we can release sem and let
+ // FakeAppContext constructor proceeed.
+ System.out.println("Releasing Sem");
+ sem.release();
+ return getAppContext();
+ }
+
+ });
+ }
+
+ }
+
+
+ // Test with or without a security manager
+ public static enum TestCase {
+ UNSECURE, SECURE;
+ public void run() throws Exception {
+ System.out.println("Running test case: " + name());
+ Configure.setUp(this);
+ test(this);
+ }
+ }
+
+ public static void test(TestCase test) throws Exception {
+ Thread t1 = new Thread() {
+ @Override
+ public void run() {
+ sem3.release();
+ System.out.println("FakeAppContext.getAppContext()");
+ FakeAppContext.getAppContext();
+ System.out.println("Done: FakeAppContext.getAppContext()");
+ }
+ };
+ t1.setDaemon(true);
+ t1.start();
+ Thread t2 = new Thread() {
+ public void run() {
+ sem3.release();
+ try {
+ // Wait until Thread1 is in FakeAppContext constructor
+ sem2.acquire();
+ System.out.println("Sem2 acquired: Thread #1 will be waiting to acquire Sem");
+ } catch (InterruptedException ie) {
+ Thread.interrupted();
+ }
+ System.out.println("Logger.getLogger(name).info(name)");
+ Logger.getLogger(test.name());//.info(name);
+ System.out.println("Done: Logger.getLogger(name).info(name)");
+ }
+ };
+ t2.setDaemon(true);
+ t2.start();
+ System.out.println("Should exit now...");
+ Thread detector = new DeadlockDetector();
+ detector.start();
+
+ // Wait for the 3 threads to start
+ sem3.acquire();
+
+ // Now wait for t1 & t2 to finish, or for a deadlock to be detected.
+ while (goOn && (t1.isAlive() || t2.isAlive())) {
+ if (t2.isAlive()) t2.join(1000);
+ if (test == TestCase.UNSECURE && System.getSecurityManager() == null) {
+ // if there's no security manager, AppContext.getAppContext() is
+ // not called - so Thread t2 will not end up calling
+ // sem.release(). In that case we must release the semaphore here
+ // so that t1 can proceed.
+ if (LogManager.getLogManager().getLogger(TestCase.UNSECURE.name()) != null) {
+ // means Thread t2 has created the logger
+ sem.release();
+ }
+ }
+ if (t1.isAlive()) t1.join(1000);
+ }
+ if (thrown != null) {
+ throw thrown;
+ }
+ }
+
+ // Thrown by the deadlock detector
+ static final class DeadlockException extends RuntimeException {
+ public DeadlockException(String message) {
+ super(message);
+ }
+ @Override
+ public void printStackTrace() {
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+
+ if (args.length == 0) {
+ args = new String[] { "SECURE" };
+ }
+
+ // If we don't initialize LogManager here, there will be
+ // a deadlock.
+ // See <https://bugs.openjdk.java.net/browse/JDK-8065709?focusedCommentId=13582038&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13582038>
+ // for more details.
+ Logger.getLogger("main").info("starting...");
+ try {
+ TestCase.valueOf(args[0]).run();
+ System.out.println("Test "+args[0]+" Passed");
+ } catch(Throwable t) {
+ System.err.println("Test " + args[0] +" failed: " + t);
+ t.printStackTrace();
+ }
+ }
+
+ // Called by the deadlock detector when a deadlock is found.
+ static void fail(Exception x) {
+ x.printStackTrace();
+ if (thrown == null) {
+ thrown = x;
+ }
+ goOn = false;
+ }
+
+ // A thread that detect deadlocks.
+ final static class DeadlockDetector extends Thread {
+
+ public DeadlockDetector() {
+ this.setDaemon(true);
+ }
+
+ @Override
+ public void run() {
+ sem3.release();
+ Configure.doPrivileged(this::loop);
+ }
+ public void loop() {
+ while(goOn) {
+ try {
+ long[] ids = ManagementFactory.getThreadMXBean().findDeadlockedThreads();
+ ids = ids == null ? new long[0] : ids;
+ if (ids.length == 1) {
+ throw new RuntimeException("Found 1 deadlocked thread: "+ids[0]);
+ } else if (ids.length > 0) {
+ ThreadInfo[] infos = ManagementFactory.getThreadMXBean().getThreadInfo(ids, Integer.MAX_VALUE);
+ System.err.println("Found "+ids.length+" deadlocked threads: ");
+ for (ThreadInfo inf : infos) {
+ System.err.println(inf);
+ }
+ throw new DeadlockException("Found "+ids.length+" deadlocked threads");
+ }
+ Thread.sleep(100);
+ } catch(InterruptedException | RuntimeException x) {
+ fail(x);
+ }
+ }
+ }
+
+ }
+
+ // A helper class to configure the security manager for the test,
+ // and bypass it when needed.
+ static class Configure {
+ static Policy policy = null;
+ static final ThreadLocal<AtomicBoolean> allowAll = new ThreadLocal<AtomicBoolean>() {
+ @Override
+ protected AtomicBoolean initialValue() {
+ return new AtomicBoolean(false);
+ }
+ };
+ static void setUp(TestCase test) {
+ switch (test) {
+ case SECURE:
+ if (policy == null && System.getSecurityManager() != null) {
+ throw new IllegalStateException("SecurityManager already set");
+ } else if (policy == null) {
+ policy = new SimplePolicy(TestCase.SECURE, allowAll);
+ Policy.setPolicy(policy);
+ System.setSecurityManager(new SecurityManager());
+ }
+ if (System.getSecurityManager() == null) {
+ throw new IllegalStateException("No SecurityManager.");
+ }
+ if (policy == null) {
+ throw new IllegalStateException("policy not configured");
+ }
+ break;
+ case UNSECURE:
+ if (System.getSecurityManager() != null) {
+ throw new IllegalStateException("SecurityManager already set");
+ }
+ break;
+ default:
+ new InternalError("No such testcase: " + test);
+ }
+ }
+ static void doPrivileged(Runnable run) {
+ allowAll.get().set(true);
+ try {
+ run.run();
+ } finally {
+ allowAll.get().set(false);
+ }
+ }
+ }
+
+ // A Helper class to build a set of permissions.
+ final static class PermissionsBuilder {
+ final Permissions perms;
+ public PermissionsBuilder() {
+ this(new Permissions());
+ }
+ public PermissionsBuilder(Permissions perms) {
+ this.perms = perms;
+ }
+ public PermissionsBuilder add(Permission p) {
+ perms.add(p);
+ return this;
+ }
+ public PermissionsBuilder addAll(PermissionCollection col) {
+ if (col != null) {
+ for (Enumeration<Permission> e = col.elements(); e.hasMoreElements(); ) {
+ perms.add(e.nextElement());
+ }
+ }
+ return this;
+ }
+ public Permissions toPermissions() {
+ final PermissionsBuilder builder = new PermissionsBuilder();
+ builder.addAll(perms);
+ return builder.perms;
+ }
+ }
+
+ // Policy for the test...
+ public static class SimplePolicy extends Policy {
+
+ final Permissions permissions;
+ final Permissions allPermissions;
+ final ThreadLocal<AtomicBoolean> allowAll; // actually: this should be in a thread locale
+ public SimplePolicy(TestCase test, ThreadLocal<AtomicBoolean> allowAll) {
+ this.allowAll = allowAll;
+ // we don't actually need any permission to create our
+ // FileHandlers because we're passing invalid parameters
+ // which will make the creation fail...
+ permissions = new Permissions();
+ permissions.add(new RuntimePermission("accessClassInPackage.sun.misc"));
+
+ // these are used for configuring the test itself...
+ allPermissions = new Permissions();
+ allPermissions.add(new java.security.AllPermission());
+
+ }
+
+ @Override
+ public boolean implies(ProtectionDomain domain, Permission permission) {
+ if (allowAll.get().get()) return allPermissions.implies(permission);
+ return permissions.implies(permission);
+ }
+
+ @Override
+ public PermissionCollection getPermissions(CodeSource codesource) {
+ return new PermissionsBuilder().addAll(allowAll.get().get()
+ ? allPermissions : permissions).toPermissions();
+ }
+
+ @Override
+ public PermissionCollection getPermissions(ProtectionDomain domain) {
+ return new PermissionsBuilder().addAll(allowAll.get().get()
+ ? allPermissions : permissions).toPermissions();
+ }
+ }
+
+}
--- a/jdk/test/javax/management/remote/mandatory/connection/RMIConnector_NPETest.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/test/javax/management/remote/mandatory/connection/RMIConnector_NPETest.java Thu Dec 11 12:27:27 2014 -0800
@@ -38,7 +38,7 @@
public class RMIConnector_NPETest {
public static void main(String argv[]) throws Exception {
RMID rmid = RMID.createRMID();
- rmid.start(Long.MAX_VALUE);
+ rmid.start();
int rmidPort = rmid.getPort();
Exception failureCause = null;
RMIConnector agent = null;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSClientPropertyTest.java Thu Dec 11 12:27:27 2014 -0800
@@ -0,0 +1,204 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
+import java.util.List;
+import javax.net.ssl.SSLContext;
+
+/*
+ * @test
+ * @bug 8049432
+ * @summary New tests for TLS property jdk.tls.client.protocols
+ * @run main/othervm TLSClientPropertyTest NoProperty
+ * @run main/othervm TLSClientPropertyTest SSLv3
+ * @run main/othervm TLSClientPropertyTest TLSv1
+ * @run main/othervm TLSClientPropertyTest TLSv11
+ * @run main/othervm TLSClientPropertyTest TLSv12
+ * @run main/othervm TLSClientPropertyTest WrongProperty
+ */
+
+/**
+ * Sets the property jdk.tls.client.protocols to one of this protocols:
+ * SSLv3,TLSv1,TLSv1.1,TLSv1.2 and TLSV(invalid) or removes this
+ * property (if any),then validates the default, supported and current
+ * protocols in the SSLContext.
+ */
+public class TLSClientPropertyTest {
+ private final String[] expecteSupportedProtos = new String[] {
+ "SSLv2Hello", "SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2"
+ };
+
+ public static void main(String[] args) throws Exception {
+
+ if (args.length < 1) {
+ throw new RuntimeException(
+ "Incorrect arguments,expected arguments: testCase");
+ }
+
+ String[] expectedDefaultProtos;
+ String testCase = args[0];
+ String contextProtocol;
+ switch (testCase) {
+ case "NoProperty":
+ if (System.getProperty("jdk.tls.client.protocols") != null) {
+ System.getProperties().remove("jdk.tls.client.protocols");
+ }
+ contextProtocol = null;
+ expectedDefaultProtos = new String[] {
+ "SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2"
+ };
+ break;
+ case "SSLv3":
+ contextProtocol = "SSLv3";
+ expectedDefaultProtos = new String[] {
+ "SSLv3"
+ };
+ break;
+ case "TLSv1":
+ contextProtocol = "TLSv1";
+ expectedDefaultProtos = new String[] {
+ "SSLv3", "TLSv1"
+ };
+ break;
+ case "TLSv11":
+ contextProtocol = "TLSv1.1";
+ expectedDefaultProtos = new String[] {
+ "SSLv3", "TLSv1", "TLSv1.1"
+ };
+ break;
+ case "TLSv12":
+ contextProtocol = "TLSv1.2";
+ expectedDefaultProtos = new String[] {
+ "SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2"
+ };
+ break;
+ case "WrongProperty":
+ expectedDefaultProtos = new String[] {};
+ contextProtocol = "TLSV";
+ break;
+ default:
+ throw new RuntimeException("test case is wrong");
+ }
+ if (contextProtocol != null) {
+ System.setProperty("jdk.tls.client.protocols", contextProtocol);
+ }
+ try {
+ TLSClientPropertyTest test = new TLSClientPropertyTest();
+ test.test(contextProtocol, expectedDefaultProtos);
+ if (testCase.equals("WrongProperty")) {
+ throw new RuntimeException(
+ "Test failed: NoSuchAlgorithmException " +
+ "is expected when input wrong protocol");
+ } else {
+ System.out.println("Test " + contextProtocol + " passed");
+ }
+ } catch (NoSuchAlgorithmException nsae) {
+ if (testCase.equals("WrongProperty")) {
+ System.out.println("NoSuchAlgorithmException is expected,"
+ + contextProtocol + " test passed");
+ } else {
+ throw nsae;
+ }
+ }
+
+ }
+
+ /**
+ * The parameter passed is the user enforced protocol. Does not catch
+ * NoSuchAlgorithmException, WrongProperty test will use it.
+ */
+ public void test(String expectedContextProto,
+ String[] expectedDefaultProtos) throws NoSuchAlgorithmException {
+
+ SSLContext context = null;
+ try {
+ if (expectedContextProto != null) {
+ context = SSLContext.getInstance(expectedContextProto);
+ context.init(null, null, null);
+ } else {
+ context = SSLContext.getDefault();
+ }
+ printContextDetails(context);
+ } catch (KeyManagementException ex) {
+ error(null, ex);
+ }
+
+ validateContext(expectedContextProto, expectedDefaultProtos, context);
+ }
+
+ /**
+ * Simple print utility for SSLContext's protocol details.
+ */
+ private void printContextDetails(SSLContext context) {
+ System.out.println("Default Protocols: "
+ + Arrays.toString(context.getDefaultSSLParameters()
+ .getProtocols()));
+ System.out.println("Supported Protocols: "
+ + Arrays.toString(context.getSupportedSSLParameters()
+ .getProtocols()));
+ System.out.println("Current Protocol : " + context.getProtocol());
+
+ }
+
+ /**
+ * Error handler.
+ */
+ private void error(String msg, Throwable tble) {
+ String finalMsg = "FAILED " + (msg != null ? msg : "");
+ if (tble != null) {
+ throw new RuntimeException(finalMsg, tble);
+ }
+ throw new RuntimeException(finalMsg);
+ }
+
+ /**
+ * Validates the SSLContext's protocols against the user enforced protocol.
+ */
+ private void validateContext(String expectedProto,
+ String[] expectedDefaultProtos, SSLContext context) {
+ if (expectedProto == null) {
+ expectedProto = "Default";
+ }
+ if (!context.getProtocol().equals(expectedProto)) {
+ error("Invalid current protocol:" + context.getProtocol()
+ + ", Expected:" + expectedProto, null);
+ }
+ List<String> actualDefaultProtos = Arrays.asList(context
+ .getDefaultSSLParameters().getProtocols());
+ for (String p: expectedDefaultProtos) {
+ if (!actualDefaultProtos.contains(p)) {
+ error("Default protocol " + p + "missing", null);
+ }
+ }
+ List<String> actualSupportedProtos = Arrays.asList(context
+ .getSupportedSSLParameters().getProtocols());
+
+ for (String p: expecteSupportedProtos) {
+ if (!actualSupportedProtos.contains(p)) {
+ error("Expected to support protocol:" + p, null);
+ }
+ }
+ }
+}
--- a/jdk/test/sun/security/krb5/auto/KDC.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/test/sun/security/krb5/auto/KDC.java Thu Dec 11 12:27:27 2014 -0800
@@ -35,6 +35,7 @@
import sun.security.krb5.*;
import sun.security.krb5.internal.*;
import sun.security.krb5.internal.ccache.CredentialsCache;
+import sun.security.krb5.internal.crypto.EType;
import sun.security.krb5.internal.crypto.KeyUsage;
import sun.security.krb5.internal.ktab.KeyTab;
import sun.security.util.DerInputStream;
@@ -120,6 +121,9 @@
*/
public class KDC {
+ public static final int DEFAULT_LIFETIME = 39600;
+ public static final int DEFAULT_RENEWTIME = 86400;
+
// Under the hood.
// The random generator to generate random keys (including session keys)
@@ -204,7 +208,8 @@
* A standalone KDC server.
*/
public static void main(String[] args) throws Exception {
- KDC kdc = create("RABBIT.HOLE", "kdc.rabbit.hole", 0, false);
+ int port = args.length > 0 ? Integer.parseInt(args[0]) : 0;
+ KDC kdc = create("RABBIT.HOLE", "kdc.rabbit.hole", port, false);
kdc.addPrincipal("dummy", "bogus".toCharArray());
kdc.addPrincipal("foo", "bar".toCharArray());
kdc.addPrincipalRandKey("krbtgt/RABBIT.HOLE");
@@ -871,6 +876,14 @@
eTypes = KDCReqBodyDotEType(body);
int eType = eTypes[0];
+ // Maybe server does not support aes256, but a kinit does
+ if (!EType.isSupported(eType)) {
+ if (eTypes.length < 2) {
+ throw new KrbException(Krb5.KDC_ERR_ETYPE_NOSUPP);
+ }
+ eType = eTypes[1];
+ }
+
EncryptionKey ckey = keyForUser(body.cname, eType, false);
EncryptionKey skey = keyForUser(service, eType, true);
@@ -899,10 +912,16 @@
EncryptionKey key = generateRandomKey(eType);
// Check time, TODO
KerberosTime till = body.till;
+ KerberosTime rtime = body.rtime;
if (till == null) {
throw new KrbException(Krb5.KDC_ERR_NEVER_VALID); // TODO
} else if (till.isZero()) {
- till = new KerberosTime(new Date().getTime() + 1000 * 3600 * 11);
+ till = new KerberosTime(
+ new Date().getTime() + 1000 * DEFAULT_LIFETIME);
+ }
+ if (rtime == null && body.kdcOptions.get(KDCOptions.RENEWABLE)) {
+ rtime = new KerberosTime(
+ new Date().getTime() + 1000 * DEFAULT_RENEWTIME);
}
//body.from
boolean[] bFlags = new boolean[Krb5.TKT_OPTS_MAX+1];
@@ -1053,7 +1072,7 @@
new TransitedEncoding(1, new byte[0]),
new KerberosTime(new Date()),
body.from,
- till, body.rtime,
+ till, rtime,
body.addresses,
null);
Ticket t = new Ticket(
@@ -1071,7 +1090,7 @@
tFlags,
new KerberosTime(new Date()),
body.from,
- till, body.rtime,
+ till, rtime,
service,
body.addresses
);
--- a/jdk/test/sun/security/krb5/auto/LifeTimeInSeconds.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/test/sun/security/krb5/auto/LifeTimeInSeconds.java Thu Dec 11 12:27:27 2014 -0800
@@ -40,7 +40,7 @@
int time = cred.getRemainingLifetime();
int time2 = cred.getRemainingInitLifetime(null);
// The test KDC issues a TGT with a default lifetime of 11 hours
- int elevenhrs = 11*3600;
+ int elevenhrs = KDC.DEFAULT_LIFETIME;
if (time > elevenhrs+60 || time < elevenhrs-60) {
throw new Exception("getRemainingLifetime returns wrong value.");
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/krb5/auto/Renewal.java Thu Dec 11 12:27:27 2014 -0800
@@ -0,0 +1,164 @@
+/*
+ * Copyright (c) 2012, 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 8044500
+ * @summary Add kinit options and krb5.conf flags that allow users to
+ * obtain renewable tickets and specify ticket lifetimes
+ * @library ../../../../java/security/testlibrary/
+ * @compile -XDignore.symbol.file Renewal.java
+ * @run main/othervm Renewal
+ */
+
+import sun.security.jgss.GSSUtil;
+import sun.security.krb5.Config;
+import sun.security.krb5.internal.ccache.Credentials;
+import sun.security.krb5.internal.ccache.FileCredentialsCache;
+
+import javax.security.auth.kerberos.KerberosTicket;
+import java.util.Date;
+import java.util.Random;
+import java.util.Set;
+
+// The basic krb5 test skeleton you can copy from
+public class Renewal {
+
+ static OneKDC kdc;
+ static String clazz = "sun.security.krb5.internal.tools.Kinit";
+
+ public static void main(String[] args) throws Exception {
+
+ kdc = new OneKDC(null);
+ kdc.writeJAASConf();
+ kdc.setOption(KDC.Option.PREAUTH_REQUIRED, false);
+
+ checkLogin(null, null, KDC.DEFAULT_LIFETIME, -1);
+ checkLogin("1h", null, 3600, -1);
+ checkLogin(null, "2d", KDC.DEFAULT_LIFETIME, 86400*2);
+ checkLogin("1h", "10h", 3600, 36000);
+ // When rtime is before till, use till as rtime
+ checkLogin("10h", "1h", 36000, 36000);
+
+ try {
+ Class.forName(clazz);
+ } catch (ClassNotFoundException cnfe) {
+ return;
+ }
+
+ checkKinit(null, null, null, null, KDC.DEFAULT_LIFETIME, -1);
+ checkKinit("1h", "10h", null, null, 3600, 36000);
+ checkKinit(null, null, "30m", "5h", 1800, 18000);
+ checkKinit("1h", "10h", "30m", "5h", 1800, 18000);
+
+ checkKinitRenew();
+ }
+
+ static int count = 0;
+
+ static void checkKinit(
+ String s1, // ticket_lifetime in krb5.conf, null if none
+ String s2, // renew_lifetime in krb5.conf, null if none
+ String c1, // -l on kinit, null if none
+ String c2, // -r on kinit, null if none
+ int t1, int t2 // expected lifetimes, -1 of unexpected
+ ) throws Exception {
+ KDC.saveConfig(OneKDC.KRB5_CONF, kdc,
+ s1 != null ? ("ticket_lifetime = " + s1) : "",
+ s2 != null ? ("renew_lifetime = " + s2) : "");
+ Proc p = Proc.create(clazz);
+ if (c1 != null) {
+ p.args("-l", c1);
+ }
+ if (c2 != null) {
+ p.args("-r", c2);
+ }
+ count++;
+ p.args(OneKDC.USER, new String(OneKDC.PASS))
+ .inheritIO()
+ .prop("sun.net.spi.nameservice.provider.1", "ns,mock")
+ .prop("java.security.krb5.conf", OneKDC.KRB5_CONF)
+ .env("KRB5CCNAME", "ccache" + count)
+ .start();
+ if (p.waitFor() != 0) {
+ throw new Exception();
+ }
+ FileCredentialsCache fcc =
+ FileCredentialsCache.acquireInstance(null, "ccache" + count);
+ Credentials cred = fcc.getDefaultCreds();
+ checkRough(cred.getEndTime().toDate(), t1);
+ if (cred.getRenewTill() == null) {
+ checkRough(null, t2);
+ } else {
+ checkRough(cred.getRenewTill().toDate(), t2);
+ }
+ }
+
+ static void checkKinitRenew() throws Exception {
+ Proc p = Proc.create(clazz)
+ .args("-R")
+ .inheritIO()
+ .prop("sun.net.spi.nameservice.provider.1", "ns,mock")
+ .prop("java.security.krb5.conf", OneKDC.KRB5_CONF)
+ .env("KRB5CCNAME", "ccache" + count)
+ .start();
+ if (p.waitFor() != 0) {
+ throw new Exception();
+ }
+ }
+
+ static void checkLogin(
+ String s1, // ticket_lifetime in krb5.conf, null if none
+ String s2, // renew_lifetime in krb5.conf, null if none
+ int t1, int t2 // expected lifetimes, -1 of unexpected
+ ) throws Exception {
+ KDC.saveConfig(OneKDC.KRB5_CONF, kdc,
+ s1 != null ? ("ticket_lifetime = " + s1) : "",
+ s2 != null ? ("renew_lifetime = " + s2) : "");
+ Config.refresh();
+
+ Context c;
+ c = Context.fromJAAS("client");
+
+ Set<KerberosTicket> tickets =
+ c.s().getPrivateCredentials(KerberosTicket.class);
+ if (tickets.size() != 1) {
+ throw new Exception();
+ }
+ KerberosTicket ticket = tickets.iterator().next();
+
+ checkRough(ticket.getEndTime(), t1);
+ checkRough(ticket.getRenewTill(), t2);
+ }
+
+ static void checkRough(Date t, int duration) throws Exception {
+ Date now = new Date();
+ if (t == null && duration == -1) {
+ return;
+ }
+ long change = (t.getTime() - System.currentTimeMillis()) / 1000;
+ if (change > duration + 20 || change < duration - 20) {
+ throw new Exception(t + " is not " + duration);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/krb5/config/Duration.java Thu Dec 11 12:27:27 2014 -0800
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8044500
+ * @summary Add kinit options and krb5.conf flags that allow users to
+ * obtain renewable tickets and specify ticket lifetimes
+ * @compile -XDignore.symbol.file Duration.java
+ * @run main Duration
+ */
+import sun.security.krb5.Config;
+import sun.security.krb5.KrbException;
+
+public class Duration {
+ public static void main(String[] args) throws Exception {
+ check("123", 123);
+ check("1:1", 3660);
+ check("1:1:1", 3661);
+ check("1d", 86400);
+ check("1h", 3600);
+ check("1h1m", 3660);
+ check("1h 1m", 3660);
+ check("1d 1h 1m 1s", 90061);
+ check("1d1h1m1s", 90061);
+
+ check("", -1);
+ check("abc", -1);
+ check("1ms", -1);
+ check("1d1d", -1);
+ check("1h1d", -1);
+ check("x1h", -1);
+ check("1h x 1m", -1);
+ check(":", -1);
+ check("1:60", -1);
+ check("1:1:1:1", -1);
+ check("1:1:1:", -1);
+ }
+
+ static void check(String s, int ex) throws Exception {
+ System.out.print("\u001b[1;37;41m" +s + " " + ex);
+ System.out.print("\u001b[m\n");
+ try {
+ int result = Config.duration(s);
+ if (result != ex) throw new Exception("for " + s + " is " + result);
+ } catch (KrbException ke) {
+ ke.printStackTrace();
+ if (ex != -1) throw new Exception();
+ }
+ }
+}
--- a/jdk/test/tools/launcher/Arrrghs.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/test/tools/launcher/Arrrghs.java Thu Dec 11 12:27:27 2014 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -734,23 +734,6 @@
System.out.println(tr);
}
- @Test
- static void testJreRestrictSearchFlag() {
- // test both arguments to ensure they exist
- TestResult tr = null;
- tr = doExec(javaCmd,
- "-no-jre-restrict-search", "-version");
- tr.checkPositive();
- if (!tr.testStatus)
- System.out.println(tr);
-
- tr = doExec(javaCmd,
- "-jre-restrict-search", "-version");
- tr.checkPositive();
- if (!tr.testStatus)
- System.out.println(tr);
- }
-
/**
* @param args the command line arguments
* @throws java.io.FileNotFoundException
--- a/jdk/test/tools/launcher/MultipleJRE.sh Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/test/tools/launcher/MultipleJRE.sh Thu Dec 11 12:27:27 2014 -0800
@@ -5,7 +5,7 @@
# @build UglyPrintVersion
# @build ZipMeUp
# @run shell MultipleJRE.sh
-# @summary Verify Multiple JRE version support
+# @summary Verify Multiple JRE version support has been removed
# @author Joseph E. Kowalski
#
@@ -222,37 +222,76 @@
# long file name (path) or a long "Ext" entry, but adding the long
# comment is the easiest way.
#
+MONDO=" Mondo comment line 00 is designed to take up space - lots and lots of space. Mondo comment line 01 is designed to take up space - lots and lots of space. Mondo comment line 02 is designed to take up space - lots and lots of space. Mondo comment line 03 is designed to take up space - lots and lots of space. Mondo comment line 04 is designed to take up space - lots and lots of space. Mondo comment line 05 is designed to take up space - lots and lots of space. Mondo comment line 06 is designed to take up space - lots and lots of space. Mondo comment line 07 is designed to take up space - lots and lots of space. Mondo comment line 08 is designed to take up space - lots and lots of space. Mondo comment line 09 is designed to take up space - lots and lots of space. Mondo comment line 0a is designed to take up space - lots and lots of space. Mondo comment line 0b is designed to take up space - lots and lots of space. Mondo comment line 0c is designed to take up space - lots and lots of space. Mondo comment line 0d is designed to take up space - lots and lots of space. Mondo comment line 0e is designed to take up space - lots and lots of space. Mondo comment line 0f is designed to take up space - lots and lots of space. Mondo comment line 10 is designed to take up space - lots and lots of space. Mondo comment line 11 is designed to take up space - lots and lots of space. Mondo comment line 12 is designed to take up space - lots and lots of space. Mondo comment line 13 is designed to take up space - lots and lots of space. Mondo comment line 14 is designed to take up space - lots and lots of space. Mondo comment line 15 is designed to take up space - lots and lots of space. Mondo comment line 16 is designed to take up space - lots and lots of space. Mondo comment line 17 is designed to take up space - lots and lots of space. Mondo comment line 18 is designed to take up space - lots and lots of space. Mondo comment line 19 is designed to take up space - lots and lots of space. Mondo comment line 1a is designed to take up space - lots and lots of space. Mondo comment line 1b is designed to take up space - lots and lots of space. Mondo comment line 1c is designed to take up space - lots and lots of space. Mondo comment line 1d is designed to take up space - lots and lots of space. Mondo comment line 1e is designed to take up space - lots and lots of space. Mondo comment line 1f is designed to take up space - lots and lots of space. Mondo comment line 20 is designed to take up space - lots and lots of space. Mondo comment line 21 is designed to take up space - lots and lots of space. Mondo comment line 22 is designed to take up space - lots and lots of space. Mondo comment line 23 is designed to take up space - lots and lots of space. Mondo comment line 24 is designed to take up space - lots and lots of space. Mondo comment line 25 is designed to take up space - lots and lots of space. Mondo comment line 26 is designed to take up space - lots and lots of space. Mondo comment line 27 is designed to take up space - lots and lots of space. Mondo comment line 28 is designed to take up space - lots and lots of space. Mondo comment line 29 is designed to take up space - lots and lots of space. Mondo comment line 2a is designed to take up space - lots and lots of space. Mondo comment line 2b is designed to take up space - lots and lots of space. Mondo comment line 2c is designed to take up space - lots and lots of space. Mondo comment line 2d is designed to take up space - lots and lots of space. Mondo comment line 2e is designed to take up space - lots and lots of space. Mondo comment line 2f is designed to take up space - lots and lots of space. Mondo comment line 30 is designed to take up space - lots and lots of space. Mondo comment line 31 is designed to take up space - lots and lots of space. Mondo comment line 32 is designed to take up space - lots and lots of space. Mondo comment line 33 is designed to take up space - lots and lots of space. Mondo comment line 34 is designed to take up space - lots and lots of space. Mondo comment line 35 is designed to take up space - lots and lots of space. Mondo comment line 36 is designed to take up space - lots and lots of space. Mondo comment line 37 is designed to take up space - lots and lots of space. Mondo comment line 38 is designed to take up space - lots and lots of space. Mondo comment line 39 is designed to take up space - lots and lots of space. Mondo comment line 3a is designed to take up space - lots and lots of space. Mondo comment line 3b is designed to take up space - lots and lots of space. Mondo comment line 3c is designed to take up space - lots and lots of space. Mondo comment line 3d is designed to take up space - lots and lots of space. Mondo comment line 3e is designed to take up space - lots and lots of space. Mondo comment line 3f is designed to take up space - lots and lots of space. Mondo comment line 40 is designed to take up space - lots and lots of space. Mondo comment line 41 is designed to take up space - lots and lots of space. Mondo comment line 42 is designed to take up space - lots and lots of space. Mondo comment line 43 is designed to take up space - lots and lots of space. Mondo comment line 44 is designed to take up space - lots and lots of space. Mondo comment line 45 is designed to take up space - lots and lots of space. Mondo comment line 46 is designed to take up space - lots and lots of space. Mondo comment line 47 is designed to take up space - lots and lots of space. Mondo comment line 48 is designed to take up space - lots and lots of space. Mondo comment line 49 is designed to take up space - lots and lots of space. Mondo comment line 4a is designed to take up space - lots and lots of space. Mondo comment line 4b is designed to take up space - lots and lots of space. Mondo comment line 4c is designed to take up space - lots and lots of space. Mondo comment line 4d is designed to take up space - lots and lots of space. Mondo comment line 4e is designed to take up space - lots and lots of space. Mondo comment line 4f is designed to take up space - lots and lots of space. Mondo comment line 50 is designed to take up space - lots and lots of space. Mondo comment line 51 is designed to take up space - lots and lots of space. Mondo comment line 52 is designed to take up space - lots and lots of space. Mondo comment line 53 is designed to take up space - lots and lots of space. Mondo comment line 54 is designed to take up space - lots and lots of space. Mondo comment line 55 is designed to take up space - lots and lots of space. Mondo comment line 56 is designed to take up space - lots and lots of space. Mondo comment line 57 is designed to take up space - lots and lots of space. Mondo comment line 58 is designed to take up space - lots and lots of space. Mondo comment line 59 is designed to take up space - lots and lots of space. Mondo comment line 5a is designed to take up space - lots and lots of space. Mondo comment line 5b is designed to take up space - lots and lots of space. Mondo comment line 5c is designed to take up space - lots and lots of space. Mondo comment line 5d is designed to take up space - lots and lots of space. Mondo comment line 5e is designed to take up space - lots and lots of space. Mondo comment line 5f is designed to take up space - lots and lots of space. Mondo comment line 60 is designed to take up space - lots and lots of space. Mondo comment line 61 is designed to take up space - lots and lots of space. Mondo comment line 62 is designed to take up space - lots and lots of space. Mondo comment line 63 is designed to take up space - lots and lots of space. Mondo comment line 64 is designed to take up space - lots and lots of space. Mondo comment line 65 is designed to take up space - lots and lots of space. Mondo comment line 66 is designed to take up space - lots and lots of space. Mondo comment line 67 is designed to take up space - lots and lots of space. Mondo comment line 68 is designed to take up space - lots and lots of space. Mondo comment line 69 is designed to take up space - lots and lots of space. Mondo comment line 6a is designed to take up space - lots and lots of space. Mondo comment line 6b is designed to take up space - lots and lots of space. Mondo comment line 6c is designed to take up space - lots and lots of space. Mondo comment line 6d is designed to take up space - lots and lots of space. Mondo comment line 6e is designed to take up space - lots and lots of space. Mondo comment line 6f is designed to take up space - lots and lots of space. Mondo comment line 70 is designed to take up space - lots and lots of space. Mondo comment line 71 is designed to take up space - lots and lots of space. Mondo comment line 72 is designed to take up space - lots and lots of space. Mondo comment line 73 is designed to take up space - lots and lots of space. Mondo comment line 74 is designed to take up space - lots and lots of space. Mondo comment line 75 is designed to take up space - lots and lots of space. Mondo comment line 76 is designed to take up space - lots and lots of space. Mondo comment line 77 is designed to take up space - lots and lots of space. Mondo comment line 78 is designed to take up space - lots and lots of space. Mondo comment line 79 is designed to take up space - lots and lots of space. Mondo comment line 7a is designed to take up space - lots and lots of space. Mondo comment line 7b is designed to take up space - lots and lots of space. Mondo comment line 7c is designed to take up space - lots and lots of space. Mondo comment line 7d is designed to take up space - lots and lots of space. Mondo comment line 7e is designed to take up space - lots and lots of space. Mondo comment line 7f is designed to take up space - lots and lots of space. Mondo comment line 80 is designed to take up space - lots and lots of space. Mondo comment line 81 is designed to take up space - lots and lots of space. Mondo comment line 82 is designed to take up space - lots and lots of space. Mondo comment line 83 is designed to take up space - lots and lots of space. Mondo comment line 84 is designed to take up space - lots and lots of space. Mondo comment line 85 is designed to take up space - lots and lots of space. Mondo comment line 86 is designed to take up space - lots and lots of space. Mondo comment line 87 is designed to take up space - lots and lots of space. Mondo comment line 88 is designed to take up space - lots and lots of space. Mondo comment line 89 is designed to take up space - lots and lots of space. Mondo comment line 8a is designed to take up space - lots and lots of space. Mondo comment line 8b is designed to take up space - lots and lots of space. Mondo comment line 8c is designed to take up space - lots and lots of space. Mondo comment line 8d is designed to take up space - lots and lots of space. Mondo comment line 8e is designed to take up space - lots and lots of space. Mondo comment line 8f is designed to take up space - lots and lots of space. Mondo comment line 90 is designed to take up space - lots and lots of space. Mondo comment line 91 is designed to take up space - lots and lots of space. Mondo comment line 92 is designed to take up space - lots and lots of space. Mondo comment line 93 is designed to take up space - lots and lots of space. Mondo comment line 94 is designed to take up space - lots and lots of space. Mondo comment line 95 is designed to take up space - lots and lots of space. Mondo comment line 96 is designed to take up space - lots and lots of space. Mondo comment line 97 is designed to take up space - lots and lots of space. Mondo comment line 98 is designed to take up space - lots and lots of space. Mondo comment line 99 is designed to take up space - lots and lots of space. Mondo comment line 9a is designed to take up space - lots and lots of space. Mondo comment line 9b is designed to take up space - lots and lots of space. Mondo comment line 9c is designed to take up space - lots and lots of space. Mondo comment line 9d is designed to take up space - lots and lots of space. Mondo comment line 9e is designed to take up space - lots and lots of space. Mondo comment line 9f is designed to take up space - lots and lots of space. Mondo comment line a0 is designed to take up space - lots and lots of space. Mondo comment line a1 is designed to take up space - lots and lots of space. Mondo comment line a2 is designed to take up space - lots and lots of space. Mondo comment line a3 is designed to take up space - lots and lots of space. Mondo comment line a4 is designed to take up space - lots and lots of space. Mondo comment line a5 is designed to take up space - lots and lots of space. Mondo comment line a6 is designed to take up space - lots and lots of space. Mondo comment line a7 is designed to take up space - lots and lots of space. Mondo comment line a8 is designed to take up space - lots and lots of space. Mondo comment line a9 is designed to take up space - lots and lots of space. Mondo comment line aa is designed to take up space - lots and lots of space. Mondo comment line ab is designed to take up space - lots and lots of space. Mondo comment line ac is designed to take up space - lots and lots of space. Mondo comment line ad is designed to take up space - lots and lots of space. Mondo comment line ae is designed to take up space - lots and lots of space. Mondo comment line af is designed to take up space - lots and lots of space. Mondo comment line b0 is designed to take up space - lots and lots of space. Mondo comment line b1 is designed to take up space - lots and lots of space. Mondo comment line b2 is designed to take up space - lots and lots of space. Mondo comment line b3 is designed to take up space - lots and lots of space. Mondo comment line b4 is designed to take up space - lots and lots of space. Mondo comment line b5 is designed to take up space - lots and lots of space. Mondo comment line b6 is designed to take up space - lots and lots of space. Mondo comment line b7 is designed to take up space - lots and lots of space. Mondo comment line b8 is designed to take up space - lots and lots of space. Mondo comment line b9 is designed to take up space - lots and lots of space. Mondo comment line ba is designed to take up space - lots and lots of space. Mondo comment line bb is designed to take up space - lots and lots of space. Mondo comment line bc is designed to take up space - lots and lots of space. Mondo comment line bd is designed to take up space - lots and lots of space. Mondo comment line be is designed to take up space - lots and lots of space. Mondo comment line bf is designed to take up space - lots and lots of space. Mondo comment line c0 is designed to take up space - lots and lots of space. Mondo comment line c1 is designed to take up space - lots and lots of space. Mondo comment line c2 is designed to take up space - lots and lots of space. Mondo comment line c3 is designed to take up space - lots and lots of space. Mondo comment line c4 is designed to take up space - lots and lots of space. Mondo comment line c5 is designed to take up space - lots and lots of space. Mondo comment line c6 is designed to take up space - lots and lots of space. Mondo comment line c7 is designed to take up space - lots and lots of space. Mondo comment line c8 is designed to take up space - lots and lots of space. Mondo comment line c9 is designed to take up space - lots and lots of space. Mondo comment line ca is designed to take up space - lots and lots of space. Mondo comment line cb is designed to take up space - lots and lots of space. Mondo comment line cc is designed to take up space - lots and lots of space. Mondo comment line cd is designed to take up space - lots and lots of space. Mondo comment line ce is designed to take up space - lots and lots of space. Mondo comment line cf is designed to take up space - lots and lots of space. Mondo comment line d0 is designed to take up space - lots and lots of space. Mondo comment line d1 is designed to take up space - lots and lots of space. Mondo comment line d2 is designed to take up space - lots and lots of space. Mondo comment line d3 is designed to take up space - lots and lots of space. Mondo comment line d4 is designed to take up space - lots and lots of space. Mondo comment line d5 is designed to take up space - lots and lots of space. Mondo comment line d6 is designed to take up space - lots and lots of space. Mondo comment line d7 is designed to take up space - lots and lots of space. Mondo comment line d8 is designed to take up space - lots and lots of space. Mondo comment line d9 is designed to take up space - lots and lots of space. Mondo comment line da is designed to take up space - lots and lots of space. Mondo comment line db is designed to take up space - lots and lots of space. Mondo comment line dc is designed to take up space - lots and lots of space. Mondo comment line dd is designed to take up space - lots and lots of space. Mondo comment line de is designed to take up space - lots and lots of space. Mondo comment line df is designed to take up space - lots and lots of space. Mondo comment line e0 is designed to take up space - lots and lots of space. Mondo comment line e1 is designed to take up space - lots and lots of space. Mondo comment line e2 is designed to take up space - lots and lots of space. Mondo comment line e3 is designed to take up space - lots and lots of space. Mondo comment line e4 is designed to take up space - lots and lots of space. Mondo comment line e5 is designed to take up space - lots and lots of space. Mondo comment line e6 is designed to take up space - lots and lots of space. Mondo comment line e7 is designed to take up space - lots and lots of space. Mondo comment line e8 is designed to take up space - lots and lots of space. Mondo comment line e9 is designed to take up space - lots and lots of space. Mondo comment line ea is designed to take up space - lots and lots of space. Mondo comment line eb is designed to take up space - lots and lots of space. Mondo comment line ec is designed to take up space - lots and lots of space. Mondo comment line ed is designed to take up space - lots and lots of space. Mondo comment line ee is designed to take up space - lots and lots of space. Mondo comment line ef is designed to take up space - lots and lots of space. Mondo comment line f0 is designed to take up space - lots and lots of space. Mondo comment line f1 is designed to take up space - lots and lots of space. Mondo comment line f2 is designed to take up space - lots and lots of space. Mondo comment line f3 is designed to take up space - lots and lots of space. Mondo comment line f4 is designed to take up space - lots and lots of space. Mondo comment line f5 is designed to take up space - lots and lots of space. Mondo comment line f6 is designed to take up space - lots and lots of space. Mondo comment line f7 is designed to take up space - lots and lots of space. Mondo comment line f8 is designed to take up space - lots and lots of space. Mondo comment line f9 is designed to take up space - lots and lots of space. Mondo comment line fa is designed to take up space - lots and lots of space. Mondo comment line fb is designed to take up space - lots and lots of space. Mondo comment line fc is designed to take up space - lots and lots of space. Mondo comment line fd is designed to take up space - lots and lots of space. Mondo comment line fe is designed to take up space - lots and lots of space. Mondo comment line ff is designed to take up space - lots and lots of space."
CommentZipFile() {
- file=
- tail="is designed to take up space - lots and lots of space."
- mv PrintVersion PrintVersion.zip
- /usr/bin/zipnote PrintVersion.zip > zipout
- while read ampersand line; do
- if [ "$ampersand" = "@" ]; then
- if [ "$line" = "(comment above this line)" ]; then
- echo "File Comment Line." >> zipin
- if [ "$file" = "$1" ]; then
- for i in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do
- for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do
- echo "Mondo comment line $i$j $tail" >> zipin
- done
- done
- fi
- else
- file=$line
- fi
+ mkdir -p META-INF
+ echo "Manifest-Version: 1.0" > META-INF/MANIFEST.MF
+ echo "Main-Class: PrintVersion" >> META-INF/MANIFEST.MF
+ if [ "$1" != "" ]; then
+ echo "JRE-Version: $1" >> META-INF/MANIFEST.MF
fi
- echo "$ampersand $line" >> zipin
- if [ "$ampersand" = "@" ]; then
- if [ "$line" = "(zip file comment below this line)" ]; then
- echo "Zip File Comment Line number 1" >> zipin
- echo "Zip File Comment Line number 2" >> zipin
- fi
- fi
- done < zipout
- /usr/bin/zipnote -w PrintVersion.zip < zipin
+ cp $TESTCLASSES/PrintVersion.class .
+
+ # The remaining code in CommentZipFile essentially replaces the
+ # following code, which added comments to the jar file.
+ # Unfortunately zipnote has been broken since 3.0 [ 2008 ] and
+ # there has been no new [ fixed ] version. zipnote has probably
+ # always failed, or failed for a long time without causing the
+ # test to fail. So no comments were added to the file.
+ # The comments are added using zip(1) during the creation of the
+ # zip file.
+ #
+ # NOTE:
+ # It seems the original intent of this test was to add a very long
+ # comment for one file. But zip allows a max of 256 characters, so
+ # we settle for adding 256-character comments to lots of files.
+ #
+ # $JAR $2cMf PrintVersion PrintVersion.class AfairlyLong*
+ # $JAR $2umf META-INF/MANIFEST.MF PrintVersion
+ # /usr/bin/zipnote PrintVersion.zip > zipout
+ # ... code to modify zipout adding comments
+ # /usr/bin/zipnote -w PrintVersion.zip < zipin
+ # mv PrintVersion.zip PrintVersion
+ #
+
+
+ for i in 0 1 2 3 4 5 6 7 8 9 ; do
+ for j in 0 1 2 3 4 5 6 7 8 9 ; do
+ touch AfairlyLongNameEatsUpDirectorySpaceBetter$i$j
+ done
+ done
+
+ zip -$2c PrintVersion.zip PrintVersion.class AfairlyLong* META-INF/MANIFEST.MF << FINI
+File Comment Line.
+File Comment Line.
+File Comment Line.
+File Comment Line.
+File Comment Line.
+File Comment Line.
+File Comment Line.
+File Comment Line.
+File Comment Line.
+File Comment Line.
+File Comment Line.
+File Comment Line.
+File Comment Line.
+File Comment Line.
+File Comment Line.
+File Comment Line.
+File Comment Line.
+File Comment Line.
+File Comment Line.
+File Comment Line.
+$MONDO
+File Comment Line.
+File Comment Line.
+File Comment Line.
+FINI
+
+ rm -f AfairlyLong*
+
mv PrintVersion.zip PrintVersion
- rm zipout zipin
+
}
#
@@ -261,22 +300,29 @@
#
LaunchVM() {
if [ "$1" != "" ]; then
- mess="`$JAVA -version:\"$1\" -jar PrintVersion 2>&1`"
- else
- mess="`$JAVA -jar PrintVersion 2>&1`"
- fi
- if [ $? -ne 0 ]; then
- prefix=`echo "$mess" | cut -d ' ' -f 1-3`
- if [ "$prefix" != "Unable to locate" ]; then
+ mess="`$JAVA \"$1\" -jar PrintVersion 2>&1`"
+ if [ $? -eq 0 ]; then
+ echo "Unexpected success of -Version:$1"
echo "$mess"
exit 1
fi
- echo "Unexpected error in attempting to locate $1"
- exit 1
+ else
+ mess="`$JAVA -jar PrintVersion 2>&1`"
+ if [ $? -ne 0 ]; then
+ prefix=`echo "$mess" | cut -d ' ' -f 1-3`
+ if [ "$prefix" != "Unable to locate" ]; then
+ echo "$mess"
+ exit 1
+ fi
+ echo "Unexpected error in attempting to locate $1"
+ exit 1
+ fi
+
fi
+
echo $mess | grep "$2" > /dev/null 2>&1
if [ $? != 0 ]; then
- echo "Launched $mess, expected $2"
+ echo "Launched $mess, expected $1"
exit 1
fi
}
@@ -307,6 +353,7 @@
#
# Main test sequence starts here
#
+
RELEASE=`$JAVA -version 2>&1 | head -n 1 | cut -d ' ' -f 3 | \
sed -e "s/\"//g"`
BASE_RELEASE=`echo $RELEASE | sed -e "s/-.*//g"`
@@ -386,91 +433,31 @@
fi
#
-# Throw some syntactically challenged (illegal) version specifiers at
-# the interface. Failure (of the launcher) is success for the test.
+# Now test specification of mJRE
#
-TestSyntax "1.2..3" # Two adjacent separators
-TestSyntax "_1.2.3" # Begins with a separator
-TestSyntax "1.2.3-" # Ends with a separator
-TestSyntax "1.2+.3" # Embedded modifier
-TestSyntax "1.2.4+&1.2*&1++" # Long and invalid
-
-# On windows we see if there is another jre installed, usually
-# there is, then we test using that, otherwise links are created
-# to get through to SelectVersion.
-if [ `IsWindows` = "false" ]; then
- TestLongMainClass "mklink"
-else
- $JAVAEXE -version:1.0+
- if [ $? -eq 0 ]; then
- TestLongMainClass "1.0+"
- else
- printf "Warning: TestLongMainClass skipped as there is no"
- printf "viable MJRE installed.\n"
- fi
-fi
-
-#
-# Because scribbling in the registry can be rather destructive, only a
-# subset of the tests are run on Windows.
-#
-if [ `IsWindows` = "true" ]; then
- exit 0;
-fi
-
-#
-# Additional version specifiers containing spaces. (Sigh, unable to
-# figure out the glomming on Windows)
-#
-TestSyntax "1.2.3_99 1.3.2+ 1.2.4+&1.2*&1++" # Long and invalid
-
-#
-# Create a mock installation of a number of shell scripts named as though
-# they were installed JREs. Then test to see if the launcher can cause
-# the right shell scripts to be invoked.
+# In some cases this should result in failure of the command,
+# in some cases, a warning messages, with the command succeeding.
#
-# Note, that as a side effect, this test verifies that JAVA_VERSION_PATH
-# works.
-#
-rm -rf jdk
-JAVA_VERSION_PATH="`pwd`/jdk"
-export JAVA_VERSION_PATH
-CreateMockVM 1.10
-CreateMockVM 1.11.3
-CreateMockVM 1.11.3_03
-CreateMockVM 1.11.4
-CreateMockVM 1.12.3_03
-CreateMockVM 1.12.3_03-lastweek
-CreateMockVM 1.13.3_03
-CreateMockVM 1.13.3_03-lastweek
-CreateMockVM 1.13.3_03_lastweek
-CreateMockVM 1.20.0
+ # Commandline use of "-version:" should fail
+ # with a message containing "no longer supported"
+ LaunchVM "-version:1.10+" "Error: Specifying an alternate JDK/JRE"
+ LaunchVM "-version:prettymuchanything" "Error: Specifying an alternate JDK/JRE"
-#
-# Test extracting the version information from the jar file:
-#
-# Requested Expected
-CreateJar "1.10+" ""
-LaunchVM "" "1.20.0"
-CreateJar "1.11.3_03+&1.11*" ""
-LaunchVM "" "1.11.4"
-CreateJar "1.12.3_03+&1.12.3*" ""
-LaunchVM "" "1.12.3_03"
-CreateJar "1.13.3_03+&1.13.3*" ""
-LaunchVM "" "1.13.3_03_lastweek" # Strange but true
+ # Commandline use of "-jre-restrict-search" should now fail
+ LaunchVM "-jre-restrict-search" "\-jre\-no\-restrict\-search are also no longer valid"
+ # Commandline use of "-jre-no-restrict-search" should now fail
+ LaunchVM "-jre-no-restrict-search" "\-jre\-no\-restrict\-search are also no longer valid"
+
-#
-# Test obtaining the version information from the command line (and that
-# it overrides the manifest).
-#
-CreateJar "${BASERELEASE}*" ""
-LaunchVM "1.10+" "1.20.0"
-LaunchVM "1.11.3_03+&1.11*" "1.11.4"
-LaunchVM "1.12.3_03+&1.12.3*" "1.12.3_03"
-LaunchVM "1.13.3_03+&1.13.3*" "1.13.3_03_lastweek" # Strange but true
-
-[ -d jdk ] && rm -rf jdk
-[ -d META_INF ] && rm -rf META_INF
+ # mJRE directives to use a specific version should be flagged
+ # with a warning, but the jar should be executed with the
+ # current jre
+ CreateFullJar "junk request" ""
+ LaunchVM "" "${RELEASE}"
+ # Going to silently ignore JRE-Version setting in jar file manifest
+ #LaunchVM "" "warning: The jarfile JRE-Version"
+
exit 0
+
--- a/jdk/test/tools/launcher/VersionCheck.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/test/tools/launcher/VersionCheck.java Thu Dec 11 12:27:27 2014 -0800
@@ -69,6 +69,7 @@
"java-rmi",
"java-rmi.cgi",
"javadoc",
+ "javacpl",
"javaws",
"jcmd",
"jconsole",
--- a/jdk/test/tools/pack200/Pack200Props.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/test/tools/pack200/Pack200Props.java Thu Dec 11 12:27:27 2014 -0800
@@ -62,6 +62,8 @@
List<String> cmdsList = new ArrayList<>();
cmdsList.add(Utils.getPack200Cmd());
+ cmdsList.add("-J-Xshare:off");
+ cmdsList.add("-J-Xmx1280m");
cmdsList.add("--effort=1");
cmdsList.add("--verbose");
cmdsList.add("--no-gzip");
--- a/jdk/test/tools/pack200/Pack200Test.java Thu Dec 11 11:44:03 2014 -0800
+++ b/jdk/test/tools/pack200/Pack200Test.java Thu Dec 11 12:27:27 2014 -0800
@@ -34,7 +34,7 @@
* @summary check for memory leaks, test general packer/unpacker functionality\
* using native and java unpackers
* @compile -XDignore.symbol.file Utils.java Pack200Test.java
- * @run main/othervm/timeout=1200 -Xmx512m Pack200Test
+ * @run main/othervm/timeout=1200 -Xmx1280m -Xshare:off Pack200Test
* @author ksrini
*/