提交 e87d4cb2 编写于 作者: L lana

Merge

...@@ -85,6 +85,7 @@ FILES_src = \ ...@@ -85,6 +85,7 @@ FILES_src = \
sun/io/ByteToCharCp500.java \ sun/io/ByteToCharCp500.java \
sun/io/ByteToCharCp737.java \ sun/io/ByteToCharCp737.java \
sun/io/ByteToCharCp775.java \ sun/io/ByteToCharCp775.java \
sun/io/ByteToCharCp833.java \
sun/io/ByteToCharCp834.java \ sun/io/ByteToCharCp834.java \
sun/io/ByteToCharCp838.java \ sun/io/ByteToCharCp838.java \
sun/io/ByteToCharCp850.java \ sun/io/ByteToCharCp850.java \
...@@ -214,6 +215,7 @@ FILES_src = \ ...@@ -214,6 +215,7 @@ FILES_src = \
sun/io/CharToByteCp500.java \ sun/io/CharToByteCp500.java \
sun/io/CharToByteCp737.java \ sun/io/CharToByteCp737.java \
sun/io/CharToByteCp775.java \ sun/io/CharToByteCp775.java \
sun/io/CharToByteCp833.java \
sun/io/CharToByteCp834.java \ sun/io/CharToByteCp834.java \
sun/io/CharToByteCp838.java \ sun/io/CharToByteCp838.java \
sun/io/CharToByteCp850.java \ sun/io/CharToByteCp850.java \
...@@ -331,6 +333,7 @@ FILES_gen_extcs = \ ...@@ -331,6 +333,7 @@ FILES_gen_extcs = \
sun/nio/cs/ext/IBM420.java \ sun/nio/cs/ext/IBM420.java \
sun/nio/cs/ext/IBM424.java \ sun/nio/cs/ext/IBM424.java \
sun/nio/cs/ext/IBM500.java \ sun/nio/cs/ext/IBM500.java \
sun/nio/cs/ext/IBM833.java \
sun/nio/cs/ext/IBM838.java \ sun/nio/cs/ext/IBM838.java \
sun/nio/cs/ext/IBM856.java \ sun/nio/cs/ext/IBM856.java \
sun/nio/cs/ext/IBM860.java \ sun/nio/cs/ext/IBM860.java \
......
0x5A U+FF01
0x7F U+FF02
0x7B U+FF03
0x5B U+FF04
0x6C U+FF05
0x50 U+FF06
0x7D U+FF07
0x4D U+FF08
0x5D U+FF09
0x5C U+FF0A
0x4E U+FF0B
0x6B U+FF0C
0x60 U+FF0D
0x4B U+FF0E
0x61 U+FF0F
0xF0 U+FF10
0xF1 U+FF11
0xF2 U+FF12
0xF3 U+FF13
0xF4 U+FF14
0xF5 U+FF15
0xF6 U+FF16
0xF7 U+FF17
0xF8 U+FF18
0xF9 U+FF19
0x7A U+FF1A
0x5E U+FF1B
0x4C U+FF1C
0x7E U+FF1D
0x6E U+FF1E
0x6F U+FF1F
0x7C U+FF20
0xC1 U+FF21
0xC2 U+FF22
0xC3 U+FF23
0xC4 U+FF24
0xC5 U+FF25
0xC6 U+FF26
0xC7 U+FF27
0xC8 U+FF28
0xC9 U+FF29
0xD1 U+FF2A
0xD2 U+FF2B
0xD3 U+FF2C
0xD4 U+FF2D
0xD5 U+FF2E
0xD6 U+FF2F
0xD7 U+FF30
0xD8 U+FF31
0xD9 U+FF32
0xE2 U+FF33
0xE3 U+FF34
0xE4 U+FF35
0xE5 U+FF36
0xE6 U+FF37
0xE7 U+FF38
0xE8 U+FF39
0xE9 U+FF3A
0x70 U+FF3B
0xB2 U+FF3C
0x80 U+FF3D
0xB0 U+FF3E
0x6D U+FF3F
0x79 U+FF40
0x81 U+FF41
0x82 U+FF42
0x83 U+FF43
0x84 U+FF44
0x85 U+FF45
0x86 U+FF46
0x87 U+FF47
0x88 U+FF48
0x89 U+FF49
0x91 U+FF4A
0x92 U+FF4B
0x93 U+FF4C
0x94 U+FF4D
0x95 U+FF4E
0x96 U+FF4F
0x97 U+FF50
0x98 U+FF51
0x99 U+FF52
0xA2 U+FF53
0xA3 U+FF54
0xA4 U+FF55
0xA5 U+FF56
0xA6 U+FF57
0xA7 U+FF58
0xA8 U+FF59
0xA9 U+FF5A
0xC0 U+FF5B
0x4F U+FF5C
0xD0 U+FF5D
0xA1 U+FF5E
0x00 U+0000
0x01 U+0001
0x02 U+0002
0x03 U+0003
0x37 U+0004
0x2D U+0005
0x2E U+0006
0x2F U+0007
0x16 U+0008
0x05 U+0009
0x25 U+000A
0x0B U+000B
0x0C U+000C
0x0D U+000D
0x0E U+000E
0x0F U+000F
0x10 U+0010
0x11 U+0011
0x12 U+0012
0x13 U+0013
0x3C U+0014
0x3D U+0015
0x32 U+0016
0x26 U+0017
0x18 U+0018
0x19 U+0019
0x3F U+001A
0x27 U+001B
0x1C U+001C
0x1D U+001D
0x1E U+001E
0x1F U+001F
0x40 U+0020
0x5A U+0021
0x7F U+0022
0x7B U+0023
0x5B U+0024
0x6C U+0025
0x50 U+0026
0x7D U+0027
0x4D U+0028
0x5D U+0029
0x5C U+002A
0x4E U+002B
0x6B U+002C
0x60 U+002D
0x4B U+002E
0x61 U+002F
0xF0 U+0030
0xF1 U+0031
0xF2 U+0032
0xF3 U+0033
0xF4 U+0034
0xF5 U+0035
0xF6 U+0036
0xF7 U+0037
0xF8 U+0038
0xF9 U+0039
0x7A U+003A
0x5E U+003B
0x4C U+003C
0x7E U+003D
0x6E U+003E
0x6F U+003F
0x7C U+0040
0xC1 U+0041
0xC2 U+0042
0xC3 U+0043
0xC4 U+0044
0xC5 U+0045
0xC6 U+0046
0xC7 U+0047
0xC8 U+0048
0xC9 U+0049
0xD1 U+004A
0xD2 U+004B
0xD3 U+004C
0xD4 U+004D
0xD5 U+004E
0xD6 U+004F
0xD7 U+0050
0xD8 U+0051
0xD9 U+0052
0xE2 U+0053
0xE3 U+0054
0xE4 U+0055
0xE5 U+0056
0xE6 U+0057
0xE7 U+0058
0xE8 U+0059
0xE9 U+005A
0x70 U+005B
0xB2 U+005C
0x80 U+005D
0xB0 U+005E
0x6D U+005F
0x79 U+0060
0x81 U+0061
0x82 U+0062
0x83 U+0063
0x84 U+0064
0x85 U+0065
0x86 U+0066
0x87 U+0067
0x88 U+0068
0x89 U+0069
0x91 U+006A
0x92 U+006B
0x93 U+006C
0x94 U+006D
0x95 U+006E
0x96 U+006F
0x97 U+0070
0x98 U+0071
0x99 U+0072
0xA2 U+0073
0xA3 U+0074
0xA4 U+0075
0xA5 U+0076
0xA6 U+0077
0xA7 U+0078
0xA8 U+0079
0xA9 U+007A
0xC0 U+007B
0x4F U+007C
0xD0 U+007D
0xA1 U+007E
0x07 U+007F
0x20 U+0080
0x21 U+0081
0x22 U+0082
0x23 U+0083
0x24 U+0084
0x15 U+0085
0x06 U+0086
0x17 U+0087
0x28 U+0088
0x29 U+0089
0x2A U+008A
0x2B U+008B
0x2C U+008C
0x09 U+008D
0x0A U+008E
0x1B U+008F
0x30 U+0090
0x31 U+0091
0x1A U+0092
0x33 U+0093
0x34 U+0094
0x35 U+0095
0x36 U+0096
0x08 U+0097
0x38 U+0098
0x39 U+0099
0x3A U+009A
0x3B U+009B
0x04 U+009C
0x14 U+009D
0x3E U+009E
0xFF U+009F
0x4A U+00A2
0x6A U+00A6
0x5F U+00AC
0xA0 U+203E
0xE0 U+20A9
0x42 U+FFA0
0x43 U+FFA1
0x44 U+FFA2
0x45 U+FFA3
0x46 U+FFA4
0x47 U+FFA5
0x48 U+FFA6
0x49 U+FFA7
0x52 U+FFA8
0x53 U+FFA9
0x54 U+FFAA
0x55 U+FFAB
0x56 U+FFAC
0x57 U+FFAD
0x58 U+FFAE
0x59 U+FFAF
0x62 U+FFB0
0x63 U+FFB1
0x64 U+FFB2
0x65 U+FFB3
0x66 U+FFB4
0x67 U+FFB5
0x68 U+FFB6
0x69 U+FFB7
0x72 U+FFB8
0x73 U+FFB9
0x74 U+FFBA
0x75 U+FFBB
0x76 U+FFBC
0x77 U+FFBD
0x78 U+FFBE
0x8A U+FFC2
0x8B U+FFC3
0x8C U+FFC4
0x8D U+FFC5
0x8E U+FFC6
0x8F U+FFC7
0x9A U+FFCA
0x9B U+FFCB
0x9C U+FFCC
0x9D U+FFCD
0x9E U+FFCE
0x9F U+FFCF
0xAA U+FFD2
0xAB U+FFD3
0xAC U+FFD4
0xAD U+FFD5
0xAE U+FFD6
0xAF U+FFD7
0xBA U+FFDA
0xBB U+FFDB
0xBC U+FFDC
...@@ -32,6 +32,7 @@ IBM297 IBM297 Cp297 false sun.nio.cs.ext ...@@ -32,6 +32,7 @@ IBM297 IBM297 Cp297 false sun.nio.cs.ext
IBM420 IBM420 Cp420 false sun.nio.cs.ext IBM420 IBM420 Cp420 false sun.nio.cs.ext
IBM424 IBM424 Cp424 false sun.nio.cs.ext IBM424 IBM424 Cp424 false sun.nio.cs.ext
IBM500 IBM500 Cp500 false sun.nio.cs.ext IBM500 IBM500 Cp500 false sun.nio.cs.ext
IBM833 x-IBM833 Cp833 false sun.nio.cs.ext
IBM838 IBM-Thai Cp838 false sun.nio.cs.ext IBM838 IBM-Thai Cp838 false sun.nio.cs.ext
IBM856 x-IBM856 Cp856 false sun.nio.cs.ext IBM856 x-IBM856 Cp856 false sun.nio.cs.ext
IBM860 IBM860 Cp860 false sun.nio.cs.ext IBM860 IBM860 Cp860 false sun.nio.cs.ext
......
...@@ -65,6 +65,7 @@ static jboolean printVersion = JNI_FALSE; /* print and exit */ ...@@ -65,6 +65,7 @@ static jboolean printVersion = JNI_FALSE; /* print and exit */
static jboolean showVersion = JNI_FALSE; /* print but continue */ static jboolean showVersion = JNI_FALSE; /* print but continue */
static jboolean printUsage = JNI_FALSE; /* print and exit*/ static jboolean printUsage = JNI_FALSE; /* print and exit*/
static jboolean printXUsage = JNI_FALSE; /* print and exit*/ static jboolean printXUsage = JNI_FALSE; /* print and exit*/
static char *showSettings = NULL; /* print but continue */
static const char *_program_name; static const char *_program_name;
static const char *_launcher_name; static const char *_launcher_name;
...@@ -109,6 +110,7 @@ static void SetApplicationClassPath(const char**); ...@@ -109,6 +110,7 @@ static void SetApplicationClassPath(const char**);
static void PrintJavaVersion(JNIEnv *env, jboolean extraLF); static void PrintJavaVersion(JNIEnv *env, jboolean extraLF);
static void PrintUsage(JNIEnv* env, jboolean doXUsage); static void PrintUsage(JNIEnv* env, jboolean doXUsage);
static void ShowSettings(JNIEnv* env, char *optString);
static void SetPaths(int argc, char **argv); static void SetPaths(int argc, char **argv);
...@@ -157,6 +159,7 @@ static jboolean IsWildCardEnabled(); ...@@ -157,6 +159,7 @@ static jboolean IsWildCardEnabled();
* create a new thread to invoke JVM. See 6316197 for more information. * create a new thread to invoke JVM. See 6316197 for more information.
*/ */
static jlong threadStackSize = 0; /* stack size of the new thread */ static jlong threadStackSize = 0; /* stack size of the new thread */
static jlong heapSize = 0; /* heap size */
int JNICALL JavaMain(void * args); /* entry point */ int JNICALL JavaMain(void * args); /* entry point */
...@@ -376,6 +379,10 @@ JavaMain(void * _args) ...@@ -376,6 +379,10 @@ JavaMain(void * _args)
} }
} }
if (showSettings != NULL) {
ShowSettings(env, showSettings);
CHECK_EXCEPTION_LEAVE(0);
}
/* If the user specified neither a class name nor a JAR file */ /* If the user specified neither a class name nor a JAR file */
if (printXUsage || printUsage || (jarfile == 0 && classname == 0)) { if (printXUsage || printUsage || (jarfile == 0 && classname == 0)) {
PrintUsage(env, printXUsage); PrintUsage(env, printXUsage);
...@@ -611,7 +618,7 @@ CheckJvmType(int *pargc, char ***argv, jboolean speculative) { ...@@ -611,7 +618,7 @@ CheckJvmType(int *pargc, char ***argv, jboolean speculative) {
/* copied from HotSpot function "atomll()" */ /* copied from HotSpot function "atomll()" */
static int static int
parse_stack_size(const char *s, jlong *result) { parse_size(const char *s, jlong *result) {
jlong n = 0; jlong n = 0;
int args_read = sscanf(s, jlong_format_specifier(), &n); int args_read = sscanf(s, jlong_format_specifier(), &n);
if (args_read != 1) { if (args_read != 1) {
...@@ -673,10 +680,17 @@ AddOption(char *str, void *info) ...@@ -673,10 +680,17 @@ AddOption(char *str, void *info)
options[numOptions++].extraInfo = info; options[numOptions++].extraInfo = info;
if (JLI_StrCCmp(str, "-Xss") == 0) { if (JLI_StrCCmp(str, "-Xss") == 0) {
jlong tmp; jlong tmp;
if (parse_stack_size(str + 4, &tmp)) { if (parse_size(str + 4, &tmp)) {
threadStackSize = tmp; threadStackSize = tmp;
} }
}
if (JLI_StrCCmp(str, "-Xmx") == 0) {
jlong tmp;
if (parse_size(str + 4, &tmp)) {
heapSize = tmp;
}
} }
} }
...@@ -1014,6 +1028,13 @@ ParseArguments(int *pargc, char ***pargv, char **pjarfile, ...@@ -1014,6 +1028,13 @@ ParseArguments(int *pargc, char ***pargv, char **pjarfile,
} else if (JLI_StrCmp(arg, "-X") == 0) { } else if (JLI_StrCmp(arg, "-X") == 0) {
printXUsage = JNI_TRUE; printXUsage = JNI_TRUE;
return JNI_TRUE; return JNI_TRUE;
/*
* The following case checks for -XshowSettings OR -XshowSetting:SUBOPT.
* In the latter case, any SUBOPT value not recognized will default to "all"
*/
} else if (JLI_StrCmp(arg, "-XshowSettings") == 0 ||
JLI_StrCCmp(arg, "-XshowSettings:") == 0) {
showSettings = arg;
/* /*
* The following case provide backward compatibility with old-style * The following case provide backward compatibility with old-style
* command line options. * command line options.
...@@ -1474,6 +1495,27 @@ PrintJavaVersion(JNIEnv *env, jboolean extraLF) ...@@ -1474,6 +1495,27 @@ PrintJavaVersion(JNIEnv *env, jboolean extraLF)
(*env)->CallStaticVoidMethod(env, ver, print); (*env)->CallStaticVoidMethod(env, ver, print);
} }
/*
* Prints all the Java settings, see the java implementation for more details.
*/
static void
ShowSettings(JNIEnv *env, char *optString)
{
jclass cls;
jmethodID showSettingsID;
jstring joptString;
NULL_CHECK(cls = FindBootStrapClass(env, "sun/launcher/LauncherHelper"));
NULL_CHECK(showSettingsID = (*env)->GetStaticMethodID(env, cls,
"showSettings", "(ZLjava/lang/String;JJZ)V"));
joptString = (*env)->NewStringUTF(env, optString);
(*env)->CallStaticVoidMethod(env, cls, showSettingsID,
JNI_TRUE,
joptString,
(jlong)heapSize,
(jlong)threadStackSize,
ServerClassMachine());
}
/* /*
* Prints default usage or the Xusage message, see sun.launcher.LauncherHelper.java * Prints default usage or the Xusage message, see sun.launcher.LauncherHelper.java
*/ */
......
...@@ -91,6 +91,7 @@ public class HttpsConfigurator { ...@@ -91,6 +91,7 @@ public class HttpsConfigurator {
return context; return context;
} }
//BEGIN_TIGER_EXCLUDE
/** /**
* Called by the HttpsServer to configure the parameters * Called by the HttpsServer to configure the parameters
* for a https connection currently being established. * for a https connection currently being established.
...@@ -111,4 +112,5 @@ public class HttpsConfigurator { ...@@ -111,4 +112,5 @@ public class HttpsConfigurator {
public void configure (HttpsParameters params) { public void configure (HttpsParameters params) {
params.setSSLParameters (getSSLContext().getDefaultSSLParameters()); params.setSSLParameters (getSSLContext().getDefaultSSLParameters());
} }
//END_TIGER_EXCLUDE
} }
...@@ -25,7 +25,9 @@ ...@@ -25,7 +25,9 @@
package com.sun.net.httpserver; package com.sun.net.httpserver;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
//BEGIN_TIGER_EXCLUDE
import javax.net.ssl.SSLParameters; import javax.net.ssl.SSLParameters;
//END_TIGER_EXCLUDE
/** /**
* Represents the set of parameters for each https * Represents the set of parameters for each https
...@@ -67,6 +69,7 @@ public abstract class HttpsParameters { ...@@ -67,6 +69,7 @@ public abstract class HttpsParameters {
*/ */
public abstract InetSocketAddress getClientAddress(); public abstract InetSocketAddress getClientAddress();
//BEGIN_TIGER_EXCLUDE
/** /**
* Sets the SSLParameters to use for this HttpsParameters. * Sets the SSLParameters to use for this HttpsParameters.
* The parameters must be supported by the SSLContext contained * The parameters must be supported by the SSLContext contained
...@@ -79,6 +82,7 @@ public abstract class HttpsParameters { ...@@ -79,6 +82,7 @@ public abstract class HttpsParameters {
* invalid or unsupported. * invalid or unsupported.
*/ */
public abstract void setSSLParameters (SSLParameters params); public abstract void setSSLParameters (SSLParameters params);
//END_TIGER_EXCLUDE
/** /**
* Returns a copy of the array of ciphersuites or null if none * Returns a copy of the array of ciphersuites or null if none
......
# #
# Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
# #
# This code is free software; you can redistribute it and/or modify it # This code is free software; you can redistribute it and/or modify it
...@@ -140,7 +140,7 @@ syncrsimpl.valtores = Value to be resolved can either be in the database or in c ...@@ -140,7 +140,7 @@ syncrsimpl.valtores = Value to be resolved can either be in the database or in c
#WebRowSetXmlReader exception #WebRowSetXmlReader exception
wrsxmlreader.invalidcp = End of RowSet reached. Invalid cursor position wrsxmlreader.invalidcp = End of RowSet reached. Invalid cursor position
wrsxmlreader.readxml = readXML : {0} wrsxmlreader.readxml = readXML : {0}
wrsxmlreader.parseerr = ** Parsing Error : {0} , line : {0} , uri : {0} wrsxmlreader.parseerr = ** Parsing Error : {0} , line : {1} , uri : {2}
#WebRowSetXmlWriter exceptions #WebRowSetXmlWriter exceptions
wrsxmlwriter.ioex = IOException : {0} wrsxmlwriter.ioex = IOException : {0}
...@@ -151,7 +151,7 @@ wsrxmlwriter.notproper = Not a proper type ...@@ -151,7 +151,7 @@ wsrxmlwriter.notproper = Not a proper type
#XmlReaderContentHandler exceptions #XmlReaderContentHandler exceptions
xmlrch.errmap = Error setting Map : {0} xmlrch.errmap = Error setting Map : {0}
xmlrch.errmetadata = Error setting metadata : {0} xmlrch.errmetadata = Error setting metadata : {0}
xmlrch.errinsert = Error inserting values : {0} xmlrch.errinsertval = Error inserting values : {0}
xmlrch.errconstr = Error constructing row : {0} xmlrch.errconstr = Error constructing row : {0}
xmlrch.errdel = Error deleting row : {0} xmlrch.errdel = Error deleting row : {0}
xmlrch.errinsert = Error constructing insert row : {0} xmlrch.errinsert = Error constructing insert row : {0}
...@@ -161,7 +161,7 @@ xmlrch.errupdrow = Error updating row : {0} ...@@ -161,7 +161,7 @@ xmlrch.errupdrow = Error updating row : {0}
xmlrch.chars = characters : xmlrch.chars = characters :
xmlrch.badvalue = Bad value ; non-nullable property xmlrch.badvalue = Bad value ; non-nullable property
xmlrch.badvalue1 = Bad value ; non-nullable metadata xmlrch.badvalue1 = Bad value ; non-nullable metadata
xmlrch.warning = ** Warning : {0} , line : {0} , uri : {0} xmlrch.warning = ** Warning : {0} , line : {1} , uri : {2}
#RIOptimisticProvider Exceptions #RIOptimisticProvider Exceptions
riop.locking = Locking classification is not supported riop.locking = Locking classification is not supported
......
...@@ -738,7 +738,7 @@ public class XmlReaderContentHandler extends DefaultHandler { ...@@ -738,7 +738,7 @@ public class XmlReaderContentHandler extends DefaultHandler {
// columnValue now need to be reset to the empty string // columnValue now need to be reset to the empty string
columnValue = ""; columnValue = "";
} catch (SQLException ex) { } catch (SQLException ex) {
throw new SAXException(MessageFormat.format(resBundle.handleGetObject("xmlrch.errinsert").toString(), ex.getMessage())); throw new SAXException(MessageFormat.format(resBundle.handleGetObject("xmlrch.errinsertval").toString(), ex.getMessage()));
} }
break; break;
case RowTag: case RowTag:
......
...@@ -395,7 +395,11 @@ class BufferedInputStream extends FilterInputStream { ...@@ -395,7 +395,11 @@ class BufferedInputStream extends FilterInputStream {
* or an I/O error occurs. * or an I/O error occurs.
*/ */
public synchronized int available() throws IOException { public synchronized int available() throws IOException {
return getInIfOpen().available() + (count - pos); int n = count - pos;
int avail = getInIfOpen().available();
return n > (Integer.MAX_VALUE - avail)
? Integer.MAX_VALUE
: n + avail;
} }
/** /**
......
...@@ -273,7 +273,11 @@ class PushbackInputStream extends FilterInputStream { ...@@ -273,7 +273,11 @@ class PushbackInputStream extends FilterInputStream {
*/ */
public int available() throws IOException { public int available() throws IOException {
ensureOpen(); ensureOpen();
return (buf.length - pos) + super.available(); int n = buf.length - pos;
int avail = super.available();
return n > (Integer.MAX_VALUE - avail)
? Integer.MAX_VALUE
: n + avail;
} }
/** /**
......
...@@ -44,11 +44,11 @@ public interface Readable { ...@@ -44,11 +44,11 @@ public interface Readable {
* rewinding of the buffer is performed. * rewinding of the buffer is performed.
* *
* @param cb the buffer to read characters into * @param cb the buffer to read characters into
* @return @return The number of <tt>char</tt> values added to the buffer, * @return The number of {@code char} values added to the buffer,
* or -1 if this source of characters is at its end * or -1 if this source of characters is at its end
* @throws IOException if an I/O error occurs * @throws IOException if an I/O error occurs
* @throws NullPointerException if cb is null * @throws NullPointerException if cb is null
* @throws ReadOnlyBufferException if cb is a read only buffer * @throws java.nio.ReadOnlyBufferException if cb is a read only buffer
*/ */
public int read(java.nio.CharBuffer cb) throws IOException; public int read(java.nio.CharBuffer cb) throws IOException;
......
...@@ -47,7 +47,7 @@ class StringCharBuffer // package-private ...@@ -47,7 +47,7 @@ class StringCharBuffer // package-private
0, 0,
this.remaining(), this.remaining(),
this.remaining(), this.remaining(),
this.position()); offset + this.position());
} }
private StringCharBuffer(CharSequence s, private StringCharBuffer(CharSequence s,
......
...@@ -110,7 +110,8 @@ import java.nio.ByteBuffer; ...@@ -110,7 +110,8 @@ import java.nio.ByteBuffer;
* state of the {@link ByteBuffer}, or the sequence of buffers, for the I/O * state of the {@link ByteBuffer}, or the sequence of buffers, for the I/O
* operation is not defined. Buffers should be discarded or at least care must * operation is not defined. Buffers should be discarded or at least care must
* be taken to ensure that the buffers are not accessed while the channel remains * be taken to ensure that the buffers are not accessed while the channel remains
* open. * open. All methods that accept timeout parameters treat values less than or
* equal to zero to mean that the I/O operation does not timeout.
* *
* @since 1.7 * @since 1.7
*/ */
...@@ -367,7 +368,7 @@ public abstract class AsynchronousSocketChannel ...@@ -367,7 +368,7 @@ public abstract class AsynchronousSocketChannel
* @param dst * @param dst
* The buffer into which bytes are to be transferred * The buffer into which bytes are to be transferred
* @param timeout * @param timeout
* The timeout, or {@code 0L} for no timeout * The maximum time for the I/O operation to complete
* @param unit * @param unit
* The time unit of the {@code timeout} argument * The time unit of the {@code timeout} argument
* @param attachment * @param attachment
...@@ -376,8 +377,7 @@ public abstract class AsynchronousSocketChannel ...@@ -376,8 +377,7 @@ public abstract class AsynchronousSocketChannel
* The handler for consuming the result * The handler for consuming the result
* *
* @throws IllegalArgumentException * @throws IllegalArgumentException
* If the {@code timeout} parameter is negative or the buffer is * If the buffer is read-only
* read-only
* @throws ReadPendingException * @throws ReadPendingException
* If a read operation is already in progress on this channel * If a read operation is already in progress on this channel
* @throws NotYetConnectedException * @throws NotYetConnectedException
...@@ -471,7 +471,7 @@ public abstract class AsynchronousSocketChannel ...@@ -471,7 +471,7 @@ public abstract class AsynchronousSocketChannel
* The maximum number of buffers to be accessed; must be non-negative * The maximum number of buffers to be accessed; must be non-negative
* and no larger than {@code dsts.length - offset} * and no larger than {@code dsts.length - offset}
* @param timeout * @param timeout
* The timeout, or {@code 0L} for no timeout * The maximum time for the I/O operation to complete
* @param unit * @param unit
* The time unit of the {@code timeout} argument * The time unit of the {@code timeout} argument
* @param attachment * @param attachment
...@@ -483,8 +483,7 @@ public abstract class AsynchronousSocketChannel ...@@ -483,8 +483,7 @@ public abstract class AsynchronousSocketChannel
* If the pre-conditions for the {@code offset} and {@code length} * If the pre-conditions for the {@code offset} and {@code length}
* parameter aren't met * parameter aren't met
* @throws IllegalArgumentException * @throws IllegalArgumentException
* If the {@code timeout} parameter is negative, or a buffer is * If the buffer is read-only
* read-only
* @throws ReadPendingException * @throws ReadPendingException
* If a read operation is already in progress on this channel * If a read operation is already in progress on this channel
* @throws NotYetConnectedException * @throws NotYetConnectedException
...@@ -524,7 +523,7 @@ public abstract class AsynchronousSocketChannel ...@@ -524,7 +523,7 @@ public abstract class AsynchronousSocketChannel
* @param src * @param src
* The buffer from which bytes are to be retrieved * The buffer from which bytes are to be retrieved
* @param timeout * @param timeout
* The timeout, or {@code 0L} for no timeout * The maximum time for the I/O operation to complete
* @param unit * @param unit
* The time unit of the {@code timeout} argument * The time unit of the {@code timeout} argument
* @param attachment * @param attachment
...@@ -532,8 +531,6 @@ public abstract class AsynchronousSocketChannel ...@@ -532,8 +531,6 @@ public abstract class AsynchronousSocketChannel
* @param handler * @param handler
* The handler for consuming the result * The handler for consuming the result
* *
* @throws IllegalArgumentException
* If the {@code timeout} parameter is negative
* @throws WritePendingException * @throws WritePendingException
* If a write operation is already in progress on this channel * If a write operation is already in progress on this channel
* @throws NotYetConnectedException * @throws NotYetConnectedException
...@@ -623,7 +620,7 @@ public abstract class AsynchronousSocketChannel ...@@ -623,7 +620,7 @@ public abstract class AsynchronousSocketChannel
* The maximum number of buffers to be accessed; must be non-negative * The maximum number of buffers to be accessed; must be non-negative
* and no larger than {@code srcs.length - offset} * and no larger than {@code srcs.length - offset}
* @param timeout * @param timeout
* The timeout, or {@code 0L} for no timeout * The maximum time for the I/O operation to complete
* @param unit * @param unit
* The time unit of the {@code timeout} argument * The time unit of the {@code timeout} argument
* @param attachment * @param attachment
...@@ -634,8 +631,6 @@ public abstract class AsynchronousSocketChannel ...@@ -634,8 +631,6 @@ public abstract class AsynchronousSocketChannel
* @throws IndexOutOfBoundsException * @throws IndexOutOfBoundsException
* If the pre-conditions for the {@code offset} and {@code length} * If the pre-conditions for the {@code offset} and {@code length}
* parameter aren't met * parameter aren't met
* @throws IllegalArgumentException
* If the {@code timeout} parameter is negative
* @throws WritePendingException * @throws WritePendingException
* If a write operation is already in progress on this channel * If a write operation is already in progress on this channel
* @throws NotYetConnectedException * @throws NotYetConnectedException
......
...@@ -84,7 +84,7 @@ import java.security.*; ...@@ -84,7 +84,7 @@ import java.security.*;
* {@code setJNDIContext} and {@code setLogger}</td> * {@code setJNDIContext} and {@code setLogger}</td>
* <td>Permits an application to specify the JNDI context from which the * <td>Permits an application to specify the JNDI context from which the
* {@code SyncProvider} implementations can be retrieved from and the logging * {@code SyncProvider} implementations can be retrieved from and the logging
* object to be used by the{@codeSyncProvider} implementation.</td> * object to be used by the {@code SyncProvider} implementation.</td>
* </tr> * </tr>
* *
* <tr> * <tr>
......
...@@ -1581,6 +1581,7 @@ import sun.misc.FormattedFloatingDecimal; ...@@ -1581,6 +1581,7 @@ import sun.misc.FormattedFloatingDecimal;
* instance of the Java virtual machine. * instance of the Java virtual machine.
* *
* <tr><td valign="top">{@code 'Z'} * <tr><td valign="top">{@code 'Z'}
* <td valign="top"> <tt>'&#92;u005a'</tt>
* <td> A string representing the abbreviation for the time zone. This * <td> A string representing the abbreviation for the time zone. This
* value will be adjusted as necessary for Daylight Saving Time. For * value will be adjusted as necessary for Daylight Saving Time. For
* {@code long}, {@link Long}, and {@link Date} the time zone used is * {@code long}, {@link Long}, and {@link Date} the time zone used is
......
...@@ -25,6 +25,9 @@ ...@@ -25,6 +25,9 @@
package javax.security.auth; package javax.security.auth;
import java.security.Security;
import sun.security.util.Debug;
/** /**
* <p> This is an abstract class for representing the system policy for * <p> This is an abstract class for representing the system policy for
* Subject-based authorization. A subclass implementation * Subject-based authorization. A subclass implementation
...@@ -159,6 +162,10 @@ public abstract class Policy { ...@@ -159,6 +162,10 @@ public abstract class Policy {
private static Policy policy; private static Policy policy;
private static ClassLoader contextClassLoader; private static ClassLoader contextClassLoader;
// true if a custom (not com.sun.security.auth.PolicyFile) system-wide
// policy object is set
private static boolean isCustomPolicy;
static { static {
contextClassLoader = java.security.AccessController.doPrivileged contextClassLoader = java.security.AccessController.doPrivileged
(new java.security.PrivilegedAction<ClassLoader>() { (new java.security.PrivilegedAction<ClassLoader>() {
...@@ -234,6 +241,8 @@ public abstract class Policy { ...@@ -234,6 +241,8 @@ public abstract class Policy {
contextClassLoader).newInstance(); contextClassLoader).newInstance();
} }
}); });
isCustomPolicy =
!finalClass.equals("com.sun.security.auth.PolicyFile");
} catch (Exception e) { } catch (Exception e) {
throw new SecurityException throw new SecurityException
(sun.security.util.ResourcesMgr.getString (sun.security.util.ResourcesMgr.getString
...@@ -265,6 +274,46 @@ public abstract class Policy { ...@@ -265,6 +274,46 @@ public abstract class Policy {
java.lang.SecurityManager sm = System.getSecurityManager(); java.lang.SecurityManager sm = System.getSecurityManager();
if (sm != null) sm.checkPermission(new AuthPermission("setPolicy")); if (sm != null) sm.checkPermission(new AuthPermission("setPolicy"));
Policy.policy = policy; Policy.policy = policy;
// all non-null policy objects are assumed to be custom
isCustomPolicy = policy != null ? true : false;
}
/**
* Returns true if a custom (not com.sun.security.auth.PolicyFile)
* system-wide policy object has been set or installed. This method is
* called by SubjectDomainCombiner to provide backwards compatibility for
* developers that provide their own javax.security.auth.Policy
* implementations.
*
* @return true if a custom (not com.sun.security.auth.PolicyFile)
* system-wide policy object has been set; false otherwise
*/
static boolean isCustomPolicySet(Debug debug) {
if (policy != null) {
if (debug != null && isCustomPolicy) {
debug.println("Providing backwards compatibility for " +
"javax.security.auth.policy implementation: " +
policy.toString());
}
return isCustomPolicy;
}
// check if custom policy has been set using auth.policy.provider prop
String policyClass = java.security.AccessController.doPrivileged
(new java.security.PrivilegedAction<String>() {
public String run() {
return Security.getProperty("auth.policy.provider");
}
});
if (policyClass != null
&& !policyClass.equals("com.sun.security.auth.PolicyFile")) {
if (debug != null) {
debug.println("Providing backwards compatibility for " +
"javax.security.auth.policy implementation: " +
policyClass);
}
return true;
}
return false;
} }
/** /**
......
/* /*
* Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -26,8 +26,6 @@ ...@@ -26,8 +26,6 @@
package javax.security.auth; package javax.security.auth;
import java.security.AccessController; import java.security.AccessController;
import java.security.AccessControlContext;
import java.security.AllPermission;
import java.security.Permission; import java.security.Permission;
import java.security.Permissions; import java.security.Permissions;
import java.security.PermissionCollection; import java.security.PermissionCollection;
...@@ -35,10 +33,8 @@ import java.security.Policy; ...@@ -35,10 +33,8 @@ import java.security.Policy;
import java.security.Principal; import java.security.Principal;
import java.security.PrivilegedAction; import java.security.PrivilegedAction;
import java.security.ProtectionDomain; import java.security.ProtectionDomain;
import java.lang.ClassLoader;
import java.security.Security; import java.security.Security;
import java.util.Set; import java.util.Set;
import java.util.Iterator;
import java.util.WeakHashMap; import java.util.WeakHashMap;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
...@@ -61,7 +57,8 @@ public class SubjectDomainCombiner implements java.security.DomainCombiner { ...@@ -61,7 +57,8 @@ public class SubjectDomainCombiner implements java.security.DomainCombiner {
"\t[SubjectDomainCombiner]"); "\t[SubjectDomainCombiner]");
// Note: check only at classloading time, not dynamically during combine() // Note: check only at classloading time, not dynamically during combine()
private static final boolean useJavaxPolicy = compatPolicy(); private static final boolean useJavaxPolicy =
javax.security.auth.Policy.isCustomPolicySet(debug);
// Relevant only when useJavaxPolicy is true // Relevant only when useJavaxPolicy is true
private static final boolean allowCaching = private static final boolean allowCaching =
...@@ -202,8 +199,8 @@ public class SubjectDomainCombiner implements java.security.DomainCombiner { ...@@ -202,8 +199,8 @@ public class SubjectDomainCombiner implements java.security.DomainCombiner {
return null; return null;
} }
// maintain backwards compatibility for people who provide // maintain backwards compatibility for developers who provide
// their own javax.security.auth.Policy implementations // their own custom javax.security.auth.Policy implementations
if (useJavaxPolicy) { if (useJavaxPolicy) {
return combineJavaxPolicy(currentDomains, assignedDomains); return combineJavaxPolicy(currentDomains, assignedDomains);
} }
...@@ -476,8 +473,7 @@ public class SubjectDomainCombiner implements java.security.DomainCombiner { ...@@ -476,8 +473,7 @@ public class SubjectDomainCombiner implements java.security.DomainCombiner {
String s = AccessController.doPrivileged String s = AccessController.doPrivileged
(new PrivilegedAction<String>() { (new PrivilegedAction<String>() {
public String run() { public String run() {
return java.security.Security.getProperty return Security.getProperty("cache.auth.policy");
("cache.auth.policy");
} }
}); });
if (s != null) { if (s != null) {
...@@ -488,29 +484,6 @@ public class SubjectDomainCombiner implements java.security.DomainCombiner { ...@@ -488,29 +484,6 @@ public class SubjectDomainCombiner implements java.security.DomainCombiner {
return true; return true;
} }
// maintain backwards compatibility for people who provide
// their own javax.security.auth.Policy implementations
private static boolean compatPolicy() {
javax.security.auth.Policy javaxPolicy = AccessController.doPrivileged
(new PrivilegedAction<javax.security.auth.Policy>() {
public javax.security.auth.Policy run() {
return javax.security.auth.Policy.getPolicy();
}
});
if (!(javaxPolicy instanceof com.sun.security.auth.PolicyFile)) {
if (debug != null) {
debug.println("Providing backwards compatibility for " +
"javax.security.auth.policy implementation: " +
javaxPolicy.toString());
}
return true;
} else {
return false;
}
}
private static void printInputDomains(ProtectionDomain[] currentDomains, private static void printInputDomains(ProtectionDomain[] currentDomains,
ProtectionDomain[] assignedDomains) { ProtectionDomain[] assignedDomains) {
if (currentDomains == null || currentDomains.length == 0) { if (currentDomains == null || currentDomains.length == 0) {
......
/*
* Copyright (c) 2010 Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package sun.io;
import sun.nio.cs.ext.IBM833;
public class ByteToCharCp833 extends ByteToCharSingleByte {
private final static IBM833 nioCoder = new IBM833();
public String getCharacterEncoding() {
return "Cp833";
}
public ByteToCharCp833() {
super.byteToCharTable = nioCoder.getDecoderSingleByteMappings();
}
}
/*
* Copyright (c) 2010 Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package sun.io;
import sun.nio.cs.ext.IBM833;
public class CharToByteCp833 extends CharToByteSingleByte {
private final static IBM833 nioCoder = new IBM833();
public String getCharacterEncoding() {
return "Cp833";
}
public CharToByteCp833() {
super.mask1 = 0xFF00;
super.mask2 = 0x00FF;
super.shift = 8;
super.index1 = nioCoder.getEncoderIndex1();
super.index2 = nioCoder.getEncoderIndex2();
}
}
/* /*
* Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -406,6 +406,11 @@ public class CharacterEncoding { ...@@ -406,6 +406,11 @@ public class CharacterEncoding {
aliasTable.put("cp775", "Cp775"); aliasTable.put("cp775", "Cp775");
aliasTable.put("775", "Cp775"); aliasTable.put("775", "Cp775");
aliasTable.put("ibm833", "Cp833");
aliasTable.put("ibm-833", "Cp833");
aliasTable.put("cp833", "Cp833");
aliasTable.put("833", "Cp833");
aliasTable.put("ibm834", "Cp834"); aliasTable.put("ibm834", "Cp834");
aliasTable.put("ibm-834", "Cp834"); aliasTable.put("ibm-834", "Cp834");
aliasTable.put("cp834", "Cp834"); aliasTable.put("cp834", "Cp834");
......
...@@ -44,8 +44,16 @@ import java.io.IOException; ...@@ -44,8 +44,16 @@ import java.io.IOException;
import java.io.PrintStream; import java.io.PrintStream;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Properties;
import java.util.jar.Attributes; import java.util.jar.Attributes;
import java.util.jar.JarFile; import java.util.jar.JarFile;
import java.util.jar.Manifest; import java.util.jar.Manifest;
...@@ -59,6 +67,17 @@ public enum LauncherHelper { ...@@ -59,6 +67,17 @@ public enum LauncherHelper {
private static StringBuilder outBuf = new StringBuilder(); private static StringBuilder outBuf = new StringBuilder();
private static ResourceBundle javarb = null; private static ResourceBundle javarb = null;
private static final String INDENT = " ";
private static final String VM_SETTINGS = "VM settings:";
private static final String PROP_SETTINGS = "Property settings:";
private static final String LOCALE_SETTINGS = "Locale settings:";
private static final long K = 1024;
private static final long M = K * K;
private static final long G = M * K;
private static final long T = G * K;
private static synchronized ResourceBundle getLauncherResourceBundle() { private static synchronized ResourceBundle getLauncherResourceBundle() {
if (javarb == null) { if (javarb == null) {
javarb = ResourceBundle.getBundle(defaultBundleName); javarb = ResourceBundle.getBundle(defaultBundleName);
...@@ -66,6 +85,184 @@ public enum LauncherHelper { ...@@ -66,6 +85,184 @@ public enum LauncherHelper {
return javarb; return javarb;
} }
/*
* A method called by the launcher to print out the standard settings,
* by default -XshowSettings is equivalent to -XshowSettings:all,
* Specific information may be gotten by using suboptions with possible
* values vm, properties and locale.
*
* printToStderr: choose between stdout and stderr
*
* optionFlag: specifies which options to print default is all other
* possible values are vm, properties, locale.
*
* maxHeapSize: in bytes, as set by the launcher, a zero-value indicates
* this code should determine this value, using a suitable method.
*
* stackSize: in bytes, as set by the launcher, a zero-value indicates
* this code determine this value, using a suitable method.
*/
static void showSettings(boolean printToStderr, String optionFlag,
long maxHeapSize, long stackSize, boolean isServer) {
PrintStream ostream = (printToStderr) ? System.err : System.out;
String opts[] = optionFlag.split(":");
String optStr = (opts.length > 1 && opts[1] != null)
? opts[1].trim()
: "all";
switch (optStr) {
case "vm":
printVmSettings(ostream, maxHeapSize, stackSize, isServer);
break;
case "properties":
printProperties(ostream);
break;
case "locale":
printLocale(ostream);
break;
default:
printVmSettings(ostream, maxHeapSize, stackSize, isServer);
printProperties(ostream);
printLocale(ostream);
break;
}
}
/*
* prints the main vm settings subopt/section
*/
private static void printVmSettings(PrintStream ostream, long maxHeapSize,
long stackSize, boolean isServer) {
ostream.println(VM_SETTINGS);
if (stackSize != 0L) {
ostream.println(INDENT + "Stack Size: " + scaleValue(stackSize));
}
if (maxHeapSize != 0L) {
ostream.println(INDENT + "Max. Heap Size: " + scaleValue(maxHeapSize));
} else {
ostream.println(INDENT + "Max. Heap Size (Estimated): "
+ scaleValue(Runtime.getRuntime().maxMemory()));
}
ostream.println(INDENT + "Ergonomics Machine Class: "
+ ((isServer) ? "server" : "client"));
ostream.println(INDENT + "Using VM: "
+ System.getProperty("java.vm.name"));
ostream.println();
}
/*
* scale the incoming values to a human readable form, represented as
* K, M, G and T, see java.c parse_size for the scaled values and
* suffixes.
*/
private static String scaleValue(double v) {
MathContext mc2 = new MathContext(3, RoundingMode.HALF_EVEN);
if (v >= K && v < M) {
return (new BigDecimal(v / K, mc2)).toPlainString() + "K";
} else if (v >= M && v < G) {
return (new BigDecimal(v / M, mc2)).toPlainString() + "M";
} else if (v >= G && v < T) {
return (new BigDecimal(v / G, mc2)).toPlainString() + "G";
} else if (v >= T) {
return (new BigDecimal(v / T, mc2)).toPlainString() + "T";
} else {
return String.format("%.0f", v);
}
}
/*
* prints the properties subopt/section
*/
private static void printProperties(PrintStream ostream) {
Properties p = System.getProperties();
ostream.println(PROP_SETTINGS);
List<String> sortedPropertyKeys = new ArrayList<>();
sortedPropertyKeys.addAll(p.stringPropertyNames());
Collections.sort(sortedPropertyKeys);
for (String x : sortedPropertyKeys) {
printPropertyValue(ostream, x, p.getProperty(x));
}
ostream.println();
}
private static boolean isPath(String key) {
return key.endsWith(".dirs") || key.endsWith(".path");
}
private static void printPropertyValue(PrintStream ostream,
String key, String value) {
ostream.print(INDENT + key + " = ");
if (key.equals("line.separator")) {
byte[] bytes = value.getBytes();
for (byte b : bytes) {
switch (b) {
case 0xd:
ostream.print("CR ");
break;
case 0xa:
ostream.print("LF ");
break;
default:
ostream.printf("0x%02X", b & 0xff);
break;
}
}
ostream.println();
return;
}
if (!isPath(key)) {
ostream.println(value);
return;
}
// pretty print the path values as a list
String[] values = value.split(System.getProperty("path.separator"));
int len = values.length;
for (int i = 0 ; i < len ; i++) {
if (i == 0) { // first line treated specially
ostream.println(values[i]);
} else { // following lines prefix with indents
ostream.print(INDENT + INDENT);
ostream.println(values[i]);
}
}
}
/*
* prints the locale subopt/section
*/
private static void printLocale(PrintStream ostream) {
Locale locale = Locale.getDefault();
ostream.println(LOCALE_SETTINGS);
ostream.println(INDENT + "default locale = " + locale.getDisplayLanguage());
printLocales(ostream);
ostream.println();
}
private static void printLocales(PrintStream ostream) {
Locale[] locales = Locale.getAvailableLocales();
final int len = locales == null ? 0 : locales.length;
if (len < 1 ) {
return;
}
ostream.print(INDENT + "available locales = ");
final int last = len - 1 ;
for (int i = 0; i < last ; i++) {
ostream.print(locales[i]);
if (i != last) {
ostream.print(", ");
}
// print columns of 8
if ((i + 1) % 8 == 0) {
ostream.println();
ostream.print(INDENT + INDENT);
}
}
ostream.println(locales[last]);
}
/** /**
* A private helper method to get a localized message and also * A private helper method to get a localized message and also
* apply any arguments that we might pass. * apply any arguments that we might pass.
......
# #
# Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
# #
# This code is free software; you can redistribute it and/or modify it # This code is free software; you can redistribute it and/or modify it
...@@ -97,7 +97,15 @@ java.launcher.X.usage=\ ...@@ -97,7 +97,15 @@ java.launcher.X.usage=\
\ -Xcheck:jni perform additional checks for JNI functions\n\ \ -Xcheck:jni perform additional checks for JNI functions\n\
\ -Xshare:off do not attempt to use shared class data\n\ \ -Xshare:off do not attempt to use shared class data\n\
\ -Xshare:auto use shared class data if possible (default)\n\ \ -Xshare:auto use shared class data if possible (default)\n\
\ -Xshare:on require using shared class data, otherwise fail.\n\n\ \ -Xshare:on require using shared class data, otherwise fail.\n\
\ -XshowSettings show all settings and continue\n\
\ -XshowSettings:all\n\
\ show all settings and continue\n\
\ -XshowSettings:vm show all vm related settings and continue\n\
\ -XshowSettings:properties\n\
\ show all property settings and continue\n\
\ -XshowSettings:locale\n\
\ show all locale related settings and continue\n\n\
The -X options are non-standard and subject to change without notice.\n The -X options are non-standard and subject to change without notice.\n
java.launcher.cls.error1=\ java.launcher.cls.error1=\
......
...@@ -110,6 +110,7 @@ class ChunkedInputStream extends LeftOverInputStream { ...@@ -110,6 +110,7 @@ class ChunkedInputStream extends LeftOverInputStream {
if (remaining == 0) { if (remaining == 0) {
eof = true; eof = true;
consumeCRLF(); consumeCRLF();
t.getServerImpl().requestCompleted (t.getConnection());
return -1; return -1;
} }
needToReadHeader = false; needToReadHeader = false;
......
...@@ -40,5 +40,7 @@ class Event { ...@@ -40,5 +40,7 @@ class Event {
class WriteFinishedEvent extends Event { class WriteFinishedEvent extends Event {
WriteFinishedEvent (ExchangeImpl t) { WriteFinishedEvent (ExchangeImpl t) {
super (t); super (t);
assert !t.writefinished;
t.writefinished = true;
} }
} }
...@@ -38,6 +38,7 @@ class ExchangeImpl { ...@@ -38,6 +38,7 @@ class ExchangeImpl {
Headers reqHdrs, rspHdrs; Headers reqHdrs, rspHdrs;
Request req; Request req;
String method; String method;
boolean writefinished;
URI uri; URI uri;
HttpConnection connection; HttpConnection connection;
long reqContentLen; long reqContentLen;
......
...@@ -56,6 +56,9 @@ class FixedLengthInputStream extends LeftOverInputStream { ...@@ -56,6 +56,9 @@ class FixedLengthInputStream extends LeftOverInputStream {
int n = in.read(b, off, len); int n = in.read(b, off, len);
if (n > -1) { if (n > -1) {
remaining -= n; remaining -= n;
if (remaining == 0) {
t.getServerImpl().requestCompleted (t.getConnection());
}
} }
return n; return n;
} }
......
...@@ -55,10 +55,15 @@ class HttpConnection { ...@@ -55,10 +55,15 @@ class HttpConnection {
SelectionKey selectionKey; SelectionKey selectionKey;
String protocol; String protocol;
long time; long time;
volatile long creationTime; // time this connection was created
volatile long rspStartedTime; // time we started writing the response
int remaining; int remaining;
boolean closed = false; boolean closed = false;
Logger logger; Logger logger;
public enum State {IDLE, REQUEST, RESPONSE};
volatile State state;
public String toString() { public String toString() {
String s = null; String s = null;
if (chan != null) { if (chan != null) {
...@@ -78,6 +83,14 @@ class HttpConnection { ...@@ -78,6 +83,14 @@ class HttpConnection {
context = ctx; context = ctx;
} }
State getState() {
return state;
}
void setState (State s) {
state = s;
}
void setParameters ( void setParameters (
InputStream in, OutputStream rawout, SocketChannel chan, InputStream in, OutputStream rawout, SocketChannel chan,
SSLEngine engine, SSLStreams sslStreams, SSLContext sslContext, String protocol, SSLEngine engine, SSLStreams sslStreams, SSLContext sslContext, String protocol,
......
...@@ -201,32 +201,22 @@ class Request { ...@@ -201,32 +201,22 @@ class Request {
static class ReadStream extends InputStream { static class ReadStream extends InputStream {
SocketChannel channel; SocketChannel channel;
SelectorCache sc;
Selector selector;
ByteBuffer chanbuf; ByteBuffer chanbuf;
SelectionKey key;
int available;
byte[] one; byte[] one;
boolean closed = false, eof = false; private boolean closed = false, eof = false;
ByteBuffer markBuf; /* reads may be satisifed from this buffer */ ByteBuffer markBuf; /* reads may be satisifed from this buffer */
boolean marked; boolean marked;
boolean reset; boolean reset;
int readlimit; int readlimit;
static long readTimeout; static long readTimeout;
ServerImpl server; ServerImpl server;
final static int BUFSIZE = 8 * 1024;
static {
readTimeout = ServerConfig.getReadTimeout();
}
public ReadStream (ServerImpl server, SocketChannel chan) throws IOException { public ReadStream (ServerImpl server, SocketChannel chan) throws IOException {
this.channel = chan; this.channel = chan;
this.server = server; this.server = server;
sc = SelectorCache.getSelectorCache(); chanbuf = ByteBuffer.allocate (BUFSIZE);
selector = sc.getSelector(); chanbuf.clear();
chanbuf = ByteBuffer.allocate (8* 1024);
key = chan.register (selector, SelectionKey.OP_READ);
available = 0;
one = new byte[1]; one = new byte[1];
closed = marked = reset = false; closed = marked = reset = false;
} }
...@@ -255,6 +245,12 @@ class Request { ...@@ -255,6 +245,12 @@ class Request {
return -1; return -1;
} }
assert channel.isBlocking();
if (off < 0 || srclen < 0|| srclen > (b.length-off)) {
throw new IndexOutOfBoundsException ();
}
if (reset) { /* satisfy from markBuf */ if (reset) { /* satisfy from markBuf */
canreturn = markBuf.remaining (); canreturn = markBuf.remaining ();
willreturn = canreturn>srclen ? srclen : canreturn; willreturn = canreturn>srclen ? srclen : canreturn;
...@@ -263,17 +259,19 @@ class Request { ...@@ -263,17 +259,19 @@ class Request {
reset = false; reset = false;
} }
} else { /* satisfy from channel */ } else { /* satisfy from channel */
canreturn = available(); chanbuf.clear ();
while (canreturn == 0 && !eof) { if (srclen < BUFSIZE) {
block (); chanbuf.limit (srclen);
canreturn = available();
} }
if (eof) { do {
willreturn = channel.read (chanbuf);
} while (willreturn == 0);
if (willreturn == -1) {
eof = true;
return -1; return -1;
} }
willreturn = canreturn>srclen ? srclen : canreturn; chanbuf.flip ();
chanbuf.get(b, off, willreturn); chanbuf.get(b, off, willreturn);
available -= willreturn;
if (marked) { /* copy into markBuf */ if (marked) { /* copy into markBuf */
try { try {
...@@ -286,6 +284,11 @@ class Request { ...@@ -286,6 +284,11 @@ class Request {
return willreturn; return willreturn;
} }
public boolean markSupported () {
return true;
}
/* Does not query the OS socket */
public synchronized int available () throws IOException { public synchronized int available () throws IOException {
if (closed) if (closed)
throw new IOException ("Stream is closed"); throw new IOException ("Stream is closed");
...@@ -296,36 +299,7 @@ class Request { ...@@ -296,36 +299,7 @@ class Request {
if (reset) if (reset)
return markBuf.remaining(); return markBuf.remaining();
if (available > 0) return chanbuf.remaining();
return available;
chanbuf.clear ();
available = channel.read (chanbuf);
if (available > 0) {
chanbuf.flip();
} else if (available == -1) {
eof = true;
available = 0;
}
return available;
}
/**
* block() only called when available==0 and buf is empty
*/
private synchronized void block () throws IOException {
long currtime = server.getTime();
long maxtime = currtime + readTimeout;
while (currtime < maxtime) {
if (selector.select (readTimeout) == 1) {
selector.selectedKeys().clear();
available ();
return;
}
currtime = server.getTime();
}
throw new SocketTimeoutException ("no data received");
} }
public void close () throws IOException { public void close () throws IOException {
...@@ -333,8 +307,6 @@ class Request { ...@@ -333,8 +307,6 @@ class Request {
return; return;
} }
channel.close (); channel.close ();
selector.selectNow();
sc.freeSelector(selector);
closed = true; closed = true;
} }
...@@ -362,23 +334,14 @@ class Request { ...@@ -362,23 +334,14 @@ class Request {
SocketChannel channel; SocketChannel channel;
ByteBuffer buf; ByteBuffer buf;
SelectionKey key; SelectionKey key;
SelectorCache sc;
Selector selector;
boolean closed; boolean closed;
byte[] one; byte[] one;
ServerImpl server; ServerImpl server;
static long writeTimeout;
static {
writeTimeout = ServerConfig.getWriteTimeout();
}
public WriteStream (ServerImpl server, SocketChannel channel) throws IOException { public WriteStream (ServerImpl server, SocketChannel channel) throws IOException {
this.channel = channel; this.channel = channel;
this.server = server; this.server = server;
sc = SelectorCache.getSelectorCache(); assert channel.isBlocking();
selector = sc.getSelector();
key = channel.register (selector, SelectionKey.OP_WRITE);
closed = false; closed = false;
one = new byte [1]; one = new byte [1];
buf = ByteBuffer.allocate (4096); buf = ByteBuffer.allocate (4096);
...@@ -411,31 +374,14 @@ class Request { ...@@ -411,31 +374,14 @@ class Request {
l -= n; l -= n;
if (l == 0) if (l == 0)
return; return;
block();
}
}
void block () throws IOException {
long currtime = server.getTime();
long maxtime = currtime + writeTimeout;
while (currtime < maxtime) {
if (selector.select (writeTimeout) == 1) {
selector.selectedKeys().clear ();
return;
}
currtime = server.getTime();
} }
throw new SocketTimeoutException ("write blocked too long");
} }
public void close () throws IOException { public void close () throws IOException {
if (closed) if (closed)
return; return;
//server.logStackTrace ("Request.OS.close: isOpen="+channel.isOpen());
channel.close (); channel.close ();
selector.selectNow();
sc.freeSelector(selector);
closed = true; closed = true;
} }
} }
......
...@@ -53,8 +53,6 @@ class SSLStreams { ...@@ -53,8 +53,6 @@ class SSLStreams {
EngineWrapper wrapper; EngineWrapper wrapper;
OutputStream os; OutputStream os;
InputStream is; InputStream is;
static long readTimeout = ServerConfig.getReadTimeout();
static long writeTimeout = ServerConfig.getWriteTimeout();
/* held by thread doing the hand-shake on this connection */ /* held by thread doing the hand-shake on this connection */
Lock handshaking = new ReentrantLock(); Lock handshaking = new ReentrantLock();
...@@ -77,10 +75,13 @@ class SSLStreams { ...@@ -77,10 +75,13 @@ class SSLStreams {
if (cfg != null) { if (cfg != null) {
Parameters params = new Parameters (cfg, addr); Parameters params = new Parameters (cfg, addr);
cfg.configure (params); cfg.configure (params);
//BEGIN_TIGER_EXCLUDE
SSLParameters sslParams = params.getSSLParameters(); SSLParameters sslParams = params.getSSLParameters();
if (sslParams != null) { if (sslParams != null) {
engine.setSSLParameters (sslParams); engine.setSSLParameters (sslParams);
} else { } else
//END_TIGER_EXCLUDE
{
/* tiger compatibility */ /* tiger compatibility */
if (params.getCipherSuites() != null) { if (params.getCipherSuites() != null) {
try { try {
...@@ -104,7 +105,6 @@ class SSLStreams { ...@@ -104,7 +105,6 @@ class SSLStreams {
class Parameters extends HttpsParameters { class Parameters extends HttpsParameters {
InetSocketAddress addr; InetSocketAddress addr;
SSLParameters params;
HttpsConfigurator cfg; HttpsConfigurator cfg;
Parameters (HttpsConfigurator cfg, InetSocketAddress addr) { Parameters (HttpsConfigurator cfg, InetSocketAddress addr) {
...@@ -117,12 +117,15 @@ class SSLStreams { ...@@ -117,12 +117,15 @@ class SSLStreams {
public HttpsConfigurator getHttpsConfigurator() { public HttpsConfigurator getHttpsConfigurator() {
return cfg; return cfg;
} }
//BEGIN_TIGER_EXCLUDE
SSLParameters params;
public void setSSLParameters (SSLParameters p) { public void setSSLParameters (SSLParameters p) {
params = p; params = p;
} }
SSLParameters getSSLParameters () { SSLParameters getSSLParameters () {
return params; return params;
} }
//END_TIGER_EXCLUDE
} }
/** /**
...@@ -245,9 +248,6 @@ class SSLStreams { ...@@ -245,9 +248,6 @@ class SSLStreams {
SocketChannel chan; SocketChannel chan;
SSLEngine engine; SSLEngine engine;
SelectorCache sc;
Selector write_selector, read_selector;
SelectionKey wkey, rkey;
Object wrapLock, unwrapLock; Object wrapLock, unwrapLock;
ByteBuffer unwrap_src, wrap_dst; ByteBuffer unwrap_src, wrap_dst;
boolean closed = false; boolean closed = false;
...@@ -260,16 +260,9 @@ class SSLStreams { ...@@ -260,16 +260,9 @@ class SSLStreams {
unwrapLock = new Object(); unwrapLock = new Object();
unwrap_src = allocate(BufType.PACKET); unwrap_src = allocate(BufType.PACKET);
wrap_dst = allocate(BufType.PACKET); wrap_dst = allocate(BufType.PACKET);
sc = SelectorCache.getSelectorCache();
write_selector = sc.getSelector();
wkey = chan.register (write_selector, SelectionKey.OP_WRITE);
read_selector = sc.getSelector();
wkey = chan.register (read_selector, SelectionKey.OP_READ);
} }
void close () throws IOException { void close () throws IOException {
sc.freeSelector (write_selector);
sc.freeSelector (read_selector);
} }
/* try to wrap and send the data in src. Handles OVERFLOW. /* try to wrap and send the data in src. Handles OVERFLOW.
...@@ -304,15 +297,7 @@ class SSLStreams { ...@@ -304,15 +297,7 @@ class SSLStreams {
wrap_dst.flip(); wrap_dst.flip();
int l = wrap_dst.remaining(); int l = wrap_dst.remaining();
assert l == r.result.bytesProduced(); assert l == r.result.bytesProduced();
long currtime = time.getTime();
long maxtime = currtime + writeTimeout;
while (l>0) { while (l>0) {
write_selector.select(writeTimeout); // timeout
currtime = time.getTime();
if (currtime > maxtime) {
throw new SocketTimeoutException ("write timed out");
}
write_selector.selectedKeys().clear();
l -= chan.write (wrap_dst); l -= chan.write (wrap_dst);
} }
} }
...@@ -342,20 +327,12 @@ class SSLStreams { ...@@ -342,20 +327,12 @@ class SSLStreams {
needData = true; needData = true;
} }
synchronized (unwrapLock) { synchronized (unwrapLock) {
int x,y; int x;
do { do {
if (needData) { if (needData) {
long currTime = time.getTime();
long maxtime = currTime + readTimeout;
do { do {
if (currTime > maxtime) {
throw new SocketTimeoutException ("read timedout");
}
y = read_selector.select (readTimeout);
currTime = time.getTime();
} while (y != 1);
read_selector.selectedKeys().clear();
x = chan.read (unwrap_src); x = chan.read (unwrap_src);
} while (x == 0);
if (x == -1) { if (x == -1) {
throw new IOException ("connection closed for reading"); throw new IOException ("connection closed for reading");
} }
......
/*
* Copyright (c) 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.
*/
package sun.net.httpserver;
import java.util.*;
import java.nio.*;
import java.net.*;
import java.io.*;
import java.security.*;
import java.nio.channels.*;
/*
* Implements a cache of java.nio.channels.Selector
* where Selectors are allocated on demand and placed
* in a temporary cache for a period of time, so they
* can be reused. If a period of between 2 and 4 minutes
* elapses without being used, then they are closed.
*/
public class SelectorCache {
static SelectorCache cache = null;
private SelectorCache () {
freeSelectors = new LinkedList<SelectorWrapper>();
CacheCleaner c = AccessController.doPrivileged(
new PrivilegedAction<CacheCleaner>() {
public CacheCleaner run() {
CacheCleaner cleaner = new CacheCleaner();
cleaner.setDaemon (true);
return cleaner;
}
});
c.start();
}
/**
* factory method for creating single instance
*/
public static SelectorCache getSelectorCache () {
synchronized (SelectorCache.class) {
if (cache == null) {
cache = new SelectorCache ();
}
}
return cache;
}
private static class SelectorWrapper {
private Selector sel;
private boolean deleteFlag;
private SelectorWrapper (Selector sel) {
this.sel = sel;
this.deleteFlag = false;
}
public Selector getSelector() { return sel;}
public boolean getDeleteFlag () {return deleteFlag;}
public void setDeleteFlag (boolean b) {deleteFlag = b;}
}
/* list of free selectors. Can be re-allocated for a period
* of time, after which if not allocated will be closed
* and removed from the list (by CacheCleaner thread)
*/
LinkedList<SelectorWrapper> freeSelectors;
synchronized Selector getSelector () throws IOException {
SelectorWrapper wrapper = null;
Selector selector;
if (freeSelectors.size() > 0) {
wrapper = freeSelectors.remove();
selector = wrapper.getSelector();
} else {
selector = Selector.open();
}
return selector;
}
synchronized void freeSelector (Selector selector) {
freeSelectors.add (new SelectorWrapper (selector));
}
/* Thread ensures that entries on freeSelector list
* remain there for at least 2 minutes and no longer
* than 4 minutes.
*/
class CacheCleaner extends Thread {
public void run () {
long timeout = ServerConfig.getSelCacheTimeout() * 1000;
while (true) {
try {Thread.sleep (timeout); } catch (Exception e) {}
synchronized (freeSelectors) {
ListIterator<SelectorWrapper> l = freeSelectors.listIterator();
while (l.hasNext()) {
SelectorWrapper w = l.next();
if (w.getDeleteFlag()) {
/* 2nd pass. Close the selector */
try {
w.getSelector().close();
} catch (IOException e) {}
l.remove();
} else {
/* 1st pass. Set the flag */
w.setDeleteFlag (true);
}
}
}
}
}
}
}
...@@ -27,6 +27,8 @@ package sun.net.httpserver; ...@@ -27,6 +27,8 @@ package sun.net.httpserver;
import com.sun.net.httpserver.*; import com.sun.net.httpserver.*;
import com.sun.net.httpserver.spi.*; import com.sun.net.httpserver.spi.*;
import java.util.logging.Logger;
import java.security.PrivilegedAction;
/** /**
* Parameters that users will not likely need to set * Parameters that users will not likely need to set
...@@ -37,23 +39,26 @@ class ServerConfig { ...@@ -37,23 +39,26 @@ class ServerConfig {
static int clockTick; static int clockTick;
static int defaultClockTick = 10000 ; // 10 sec. static final int DEFAULT_CLOCK_TICK = 10000 ; // 10 sec.
/* These values must be a reasonable multiple of clockTick */ /* These values must be a reasonable multiple of clockTick */
static long defaultReadTimeout = 20 ; // 20 sec. static final long DEFAULT_IDLE_INTERVAL = 300 ; // 5 min
static long defaultWriteTimeout = 60 ; // 60 sec. static final int DEFAULT_MAX_IDLE_CONNECTIONS = 200 ;
static long defaultIdleInterval = 300 ; // 5 min
static long defaultSelCacheTimeout = 120 ; // seconds
static int defaultMaxIdleConnections = 200 ;
static long defaultDrainAmount = 64 * 1024; static final long DEFAULT_MAX_REQ_TIME = -1; // default: forever
static final long DEFAULT_MAX_RSP_TIME = -1; // default: forever
static final long DEFAULT_TIMER_MILLIS = 1000;
static final long DEFAULT_DRAIN_AMOUNT = 64 * 1024;
static long readTimeout;
static long writeTimeout;
static long idleInterval; static long idleInterval;
static long selCacheTimeout;
static long drainAmount; // max # of bytes to drain from an inputstream static long drainAmount; // max # of bytes to drain from an inputstream
static int maxIdleConnections; static int maxIdleConnections;
// max time a request or response is allowed to take
static long maxReqTime;
static long maxRspTime;
static long timerMillis;
static boolean debug = false; static boolean debug = false;
static { static {
...@@ -61,49 +66,79 @@ class ServerConfig { ...@@ -61,49 +66,79 @@ class ServerConfig {
idleInterval = ((Long)java.security.AccessController.doPrivileged( idleInterval = ((Long)java.security.AccessController.doPrivileged(
new sun.security.action.GetLongAction( new sun.security.action.GetLongAction(
"sun.net.httpserver.idleInterval", "sun.net.httpserver.idleInterval",
defaultIdleInterval))).longValue() * 1000; DEFAULT_IDLE_INTERVAL))).longValue() * 1000;
clockTick = ((Integer)java.security.AccessController.doPrivileged( clockTick = ((Integer)java.security.AccessController.doPrivileged(
new sun.security.action.GetIntegerAction( new sun.security.action.GetIntegerAction(
"sun.net.httpserver.clockTick", "sun.net.httpserver.clockTick",
defaultClockTick))).intValue(); DEFAULT_CLOCK_TICK))).intValue();
maxIdleConnections = ((Integer)java.security.AccessController.doPrivileged( maxIdleConnections = ((Integer)java.security.AccessController.doPrivileged(
new sun.security.action.GetIntegerAction( new sun.security.action.GetIntegerAction(
"sun.net.httpserver.maxIdleConnections", "sun.net.httpserver.maxIdleConnections",
defaultMaxIdleConnections))).intValue(); DEFAULT_MAX_IDLE_CONNECTIONS))).intValue();
readTimeout = ((Long)java.security.AccessController.doPrivileged( drainAmount = ((Long)java.security.AccessController.doPrivileged(
new sun.security.action.GetLongAction( new sun.security.action.GetLongAction(
"sun.net.httpserver.readTimeout", "sun.net.httpserver.drainAmount",
defaultReadTimeout))).longValue()* 1000; DEFAULT_DRAIN_AMOUNT))).longValue();
selCacheTimeout = ((Long)java.security.AccessController.doPrivileged( maxReqTime = ((Long)java.security.AccessController.doPrivileged(
new sun.security.action.GetLongAction( new sun.security.action.GetLongAction(
"sun.net.httpserver.selCacheTimeout", "sun.net.httpserver.maxReqTime",
defaultSelCacheTimeout))).longValue()* 1000; DEFAULT_MAX_REQ_TIME))).longValue();
writeTimeout = ((Long)java.security.AccessController.doPrivileged( maxRspTime = ((Long)java.security.AccessController.doPrivileged(
new sun.security.action.GetLongAction( new sun.security.action.GetLongAction(
"sun.net.httpserver.writeTimeout", "sun.net.httpserver.maxRspTime",
defaultWriteTimeout))).longValue()* 1000; DEFAULT_MAX_RSP_TIME))).longValue();
drainAmount = ((Long)java.security.AccessController.doPrivileged( timerMillis = ((Long)java.security.AccessController.doPrivileged(
new sun.security.action.GetLongAction( new sun.security.action.GetLongAction(
"sun.net.httpserver.drainAmount", "sun.net.httpserver.timerMillis",
defaultDrainAmount))).longValue(); DEFAULT_TIMER_MILLIS))).longValue();
debug = ((Boolean)java.security.AccessController.doPrivileged( debug = ((Boolean)java.security.AccessController.doPrivileged(
new sun.security.action.GetBooleanAction( new sun.security.action.GetBooleanAction(
"sun.net.httpserver.debug"))).booleanValue(); "sun.net.httpserver.debug"))).booleanValue();
} }
static long getReadTimeout () {
return readTimeout;
}
static long getSelCacheTimeout () { static void checkLegacyProperties (final Logger logger) {
return selCacheTimeout;
// legacy properties that are no longer used
// print a warning to logger if they are set.
java.security.AccessController.doPrivileged(
new PrivilegedAction<Void>() {
public Void run () {
if (System.getProperty("sun.net.httpserver.readTimeout")
!=null)
{
logger.warning ("sun.net.httpserver.readTimeout "+
"property is no longer used. "+
"Use sun.net.httpserver.maxReqTime instead."
);
}
if (System.getProperty("sun.net.httpserver.writeTimeout")
!=null)
{
logger.warning ("sun.net.httpserver.writeTimeout "+
"property is no longer used. Use "+
"sun.net.httpserver.maxRspTime instead."
);
}
if (System.getProperty("sun.net.httpserver.selCacheTimeout")
!=null)
{
logger.warning ("sun.net.httpserver.selCacheTimeout "+
"property is no longer used."
);
}
return null;
}
}
);
} }
static boolean debugEnabled () { static boolean debugEnabled () {
...@@ -122,11 +157,19 @@ class ServerConfig { ...@@ -122,11 +157,19 @@ class ServerConfig {
return maxIdleConnections; return maxIdleConnections;
} }
static long getWriteTimeout () {
return writeTimeout;
}
static long getDrainAmount () { static long getDrainAmount () {
return drainAmount; return drainAmount;
} }
static long getMaxReqTime () {
return maxReqTime;
}
static long getMaxRspTime () {
return maxRspTime;
}
static long getTimerMillis () {
return timerMillis;
}
} }
...@@ -37,6 +37,7 @@ import java.util.logging.Level; ...@@ -37,6 +37,7 @@ import java.util.logging.Level;
import javax.net.ssl.*; import javax.net.ssl.*;
import com.sun.net.httpserver.*; import com.sun.net.httpserver.*;
import com.sun.net.httpserver.spi.*; import com.sun.net.httpserver.spi.*;
import sun.net.httpserver.HttpConnection.State;
/** /**
* Provides implementation for both HTTP and HTTPS * Provides implementation for both HTTP and HTTPS
...@@ -55,6 +56,12 @@ class ServerImpl implements TimeSource { ...@@ -55,6 +56,12 @@ class ServerImpl implements TimeSource {
private SelectionKey listenerKey; private SelectionKey listenerKey;
private Set<HttpConnection> idleConnections; private Set<HttpConnection> idleConnections;
private Set<HttpConnection> allConnections; private Set<HttpConnection> allConnections;
/* following two are used to keep track of the times
* when a connection/request is first received
* and when we start to send the response
*/
private Set<HttpConnection> reqConnections;
private Set<HttpConnection> rspConnections;
private List<Event> events; private List<Event> events;
private Object lolock = new Object(); private Object lolock = new Object();
private volatile boolean finished = false; private volatile boolean finished = false;
...@@ -62,14 +69,19 @@ class ServerImpl implements TimeSource { ...@@ -62,14 +69,19 @@ class ServerImpl implements TimeSource {
private boolean bound = false; private boolean bound = false;
private boolean started = false; private boolean started = false;
private volatile long time; /* current time */ private volatile long time; /* current time */
private volatile long subticks = 0;
private volatile long ticks; /* number of clock ticks since server started */ private volatile long ticks; /* number of clock ticks since server started */
private HttpServer wrapper; private HttpServer wrapper;
final static int CLOCK_TICK = ServerConfig.getClockTick(); final static int CLOCK_TICK = ServerConfig.getClockTick();
final static long IDLE_INTERVAL = ServerConfig.getIdleInterval(); final static long IDLE_INTERVAL = ServerConfig.getIdleInterval();
final static int MAX_IDLE_CONNECTIONS = ServerConfig.getMaxIdleConnections(); final static int MAX_IDLE_CONNECTIONS = ServerConfig.getMaxIdleConnections();
final static long TIMER_MILLIS = ServerConfig.getTimerMillis ();
final static long MAX_REQ_TIME=getTimeMillis(ServerConfig.getMaxReqTime());
final static long MAX_RSP_TIME=getTimeMillis(ServerConfig.getMaxRspTime());
final static boolean timer1Enabled = MAX_REQ_TIME != -1 || MAX_RSP_TIME != -1;
private Timer timer; private Timer timer, timer1;
private Logger logger; private Logger logger;
ServerImpl ( ServerImpl (
...@@ -79,6 +91,7 @@ class ServerImpl implements TimeSource { ...@@ -79,6 +91,7 @@ class ServerImpl implements TimeSource {
this.protocol = protocol; this.protocol = protocol;
this.wrapper = wrapper; this.wrapper = wrapper;
this.logger = Logger.getLogger ("com.sun.net.httpserver"); this.logger = Logger.getLogger ("com.sun.net.httpserver");
ServerConfig.checkLegacyProperties (logger);
https = protocol.equalsIgnoreCase ("https"); https = protocol.equalsIgnoreCase ("https");
this.address = addr; this.address = addr;
contexts = new ContextList(); contexts = new ContextList();
...@@ -94,9 +107,18 @@ class ServerImpl implements TimeSource { ...@@ -94,9 +107,18 @@ class ServerImpl implements TimeSource {
dispatcher = new Dispatcher(); dispatcher = new Dispatcher();
idleConnections = Collections.synchronizedSet (new HashSet<HttpConnection>()); idleConnections = Collections.synchronizedSet (new HashSet<HttpConnection>());
allConnections = Collections.synchronizedSet (new HashSet<HttpConnection>()); allConnections = Collections.synchronizedSet (new HashSet<HttpConnection>());
reqConnections = Collections.synchronizedSet (new HashSet<HttpConnection>());
rspConnections = Collections.synchronizedSet (new HashSet<HttpConnection>());
time = System.currentTimeMillis(); time = System.currentTimeMillis();
timer = new Timer ("server-timer", true); timer = new Timer ("server-timer", true);
timer.schedule (new ServerTimerTask(), CLOCK_TICK, CLOCK_TICK); timer.schedule (new ServerTimerTask(), CLOCK_TICK, CLOCK_TICK);
if (timer1Enabled) {
timer1 = new Timer ("server-timer1", true);
timer1.schedule (new ServerTimerTask1(),TIMER_MILLIS,TIMER_MILLIS);
logger.config ("HttpServer timer1 enabled period in ms: "+TIMER_MILLIS);
logger.config ("MAX_REQ_TIME: "+MAX_REQ_TIME);
logger.config ("MAX_RSP_TIME: "+MAX_RSP_TIME);
}
events = new LinkedList<Event>(); events = new LinkedList<Event>();
logger.config ("HttpServer created "+protocol+" "+ addr); logger.config ("HttpServer created "+protocol+" "+ addr);
} }
...@@ -181,6 +203,9 @@ class ServerImpl implements TimeSource { ...@@ -181,6 +203,9 @@ class ServerImpl implements TimeSource {
allConnections.clear(); allConnections.clear();
idleConnections.clear(); idleConnections.clear();
timer.cancel(); timer.cancel();
if (timer1Enabled) {
timer1.cancel();
}
} }
Dispatcher dispatcher; Dispatcher dispatcher;
...@@ -236,13 +261,6 @@ class ServerImpl implements TimeSource { ...@@ -236,13 +261,6 @@ class ServerImpl implements TimeSource {
} }
} }
int resultSize () {
synchronized (lolock) {
return events.size ();
}
}
/* main server listener task */ /* main server listener task */
class Dispatcher implements Runnable { class Dispatcher implements Runnable {
...@@ -257,7 +275,7 @@ class ServerImpl implements TimeSource { ...@@ -257,7 +275,7 @@ class ServerImpl implements TimeSource {
if (terminating && exchanges == 0) { if (terminating && exchanges == 0) {
finished = true; finished = true;
} }
SocketChannel chan = c.getChannel(); responseCompleted (c);
LeftOverInputStream is = t.getOriginalInputStream(); LeftOverInputStream is = t.getOriginalInputStream();
if (!is.isEOF()) { if (!is.isEOF()) {
t.close = true; t.close = true;
...@@ -268,17 +286,10 @@ class ServerImpl implements TimeSource { ...@@ -268,17 +286,10 @@ class ServerImpl implements TimeSource {
} else { } else {
if (is.isDataBuffered()) { if (is.isDataBuffered()) {
/* don't re-enable the interestops, just handle it */ /* don't re-enable the interestops, just handle it */
requestStarted (c);
handle (c.getChannel(), c); handle (c.getChannel(), c);
} else { } else {
/* re-enable interestops */ connsToRegister.add (c);
SelectionKey key = c.getSelectionKey();
if (key.isValid()) {
key.interestOps (
key.interestOps()|SelectionKey.OP_READ
);
}
c.time = getTime() + IDLE_INTERVAL;
idleConnections.add (c);
} }
} }
} }
...@@ -290,22 +301,51 @@ class ServerImpl implements TimeSource { ...@@ -290,22 +301,51 @@ class ServerImpl implements TimeSource {
} }
} }
final LinkedList<HttpConnection> connsToRegister =
new LinkedList<HttpConnection>();
void reRegister (HttpConnection c) {
/* re-register with selector */
try {
SocketChannel chan = c.getChannel();
chan.configureBlocking (false);
SelectionKey key = chan.register (selector, SelectionKey.OP_READ);
key.attach (c);
c.selectionKey = key;
c.time = getTime() + IDLE_INTERVAL;
idleConnections.add (c);
} catch (IOException e) {
dprint(e);
logger.log(Level.FINER, "Dispatcher(8)", e);
c.close();
}
}
public void run() { public void run() {
while (!finished) { while (!finished) {
try { try {
ListIterator<HttpConnection> li =
connsToRegister.listIterator();
for (HttpConnection c : connsToRegister) {
reRegister(c);
}
connsToRegister.clear();
/* process the events list first */ List<Event> list = null;
selector.select(1000);
synchronized (lolock) {
if (events.size() > 0) {
list = events;
events = new LinkedList<Event>();
}
}
while (resultSize() > 0) { if (list != null) {
Event r; for (Event r: list) {
synchronized (lolock) {
r = events.remove(0);
handleEvent (r); handleEvent (r);
} }
} }
selector.select(1000);
/* process the selected list now */ /* process the selected list now */
Set<SelectionKey> selected = selector.selectedKeys(); Set<SelectionKey> selected = selector.selectedKeys();
...@@ -327,6 +367,7 @@ class ServerImpl implements TimeSource { ...@@ -327,6 +367,7 @@ class ServerImpl implements TimeSource {
c.selectionKey = newkey; c.selectionKey = newkey;
c.setChannel (chan); c.setChannel (chan);
newkey.attach (c); newkey.attach (c);
requestStarted (c);
allConnections.add (c); allConnections.add (c);
} else { } else {
try { try {
...@@ -334,27 +375,44 @@ class ServerImpl implements TimeSource { ...@@ -334,27 +375,44 @@ class ServerImpl implements TimeSource {
boolean closed; boolean closed;
SocketChannel chan = (SocketChannel)key.channel(); SocketChannel chan = (SocketChannel)key.channel();
HttpConnection conn = (HttpConnection)key.attachment(); HttpConnection conn = (HttpConnection)key.attachment();
// interestOps will be restored at end of read
key.interestOps (0); key.cancel();
chan.configureBlocking (true);
if (idleConnections.remove(conn)) {
// was an idle connection so add it
// to reqConnections set.
requestStarted (conn);
}
handle (chan, conn); handle (chan, conn);
} else { } else {
assert false; assert false;
} }
} catch (CancelledKeyException e) {
handleException(key, null);
} catch (IOException e) { } catch (IOException e) {
HttpConnection conn = (HttpConnection)key.attachment(); handleException(key, e);
logger.log (
Level.FINER, "Dispatcher (2)", e
);
conn.close();
} }
} }
} }
// call the selector just to process the cancelled keys
selector.selectNow();
} catch (IOException e) {
logger.log (Level.FINER, "Dispatcher (4)", e);
} catch (Exception e) { } catch (Exception e) {
logger.log (Level.FINER, "Dispatcher (3)", e); e.printStackTrace();
logger.log (Level.FINER, "Dispatcher (7)", e);
} }
} }
} }
private void handleException (SelectionKey key, Exception e) {
HttpConnection conn = (HttpConnection)key.attachment();
if (e != null) {
logger.log (Level.FINER, "Dispatcher (2)", e);
}
closeConnection(conn);
}
public void handle (SocketChannel chan, HttpConnection conn) public void handle (SocketChannel chan, HttpConnection conn)
throws IOException throws IOException
{ {
...@@ -363,10 +421,10 @@ class ServerImpl implements TimeSource { ...@@ -363,10 +421,10 @@ class ServerImpl implements TimeSource {
executor.execute (t); executor.execute (t);
} catch (HttpError e1) { } catch (HttpError e1) {
logger.log (Level.FINER, "Dispatcher (4)", e1); logger.log (Level.FINER, "Dispatcher (4)", e1);
conn.close(); closeConnection(conn);
} catch (IOException e) { } catch (IOException e) {
logger.log (Level.FINER, "Dispatcher (5)", e); logger.log (Level.FINER, "Dispatcher (5)", e);
conn.close(); closeConnection(conn);
} }
} }
} }
...@@ -390,7 +448,26 @@ class ServerImpl implements TimeSource { ...@@ -390,7 +448,26 @@ class ServerImpl implements TimeSource {
return logger; return logger;
} }
/* per exchange task */ private void closeConnection(HttpConnection conn) {
conn.close();
allConnections.remove(conn);
switch (conn.getState()) {
case REQUEST:
reqConnections.remove(conn);
break;
case RESPONSE:
rspConnections.remove(conn);
break;
case IDLE:
idleConnections.remove(conn);
break;
}
assert !reqConnections.remove(conn);
assert !rspConnections.remove(conn);
assert !idleConnections.remove(conn);
}
/* per exchange task */
class Exchange implements Runnable { class Exchange implements Runnable {
SocketChannel chan; SocketChannel chan;
...@@ -450,8 +527,7 @@ class ServerImpl implements TimeSource { ...@@ -450,8 +527,7 @@ class ServerImpl implements TimeSource {
requestLine = req.requestLine(); requestLine = req.requestLine();
if (requestLine == null) { if (requestLine == null) {
/* connection closed */ /* connection closed */
connection.close(); closeConnection(connection);
allConnections.remove(connection);
return; return;
} }
int space = requestLine.indexOf (' '); int space = requestLine.indexOf (' ');
...@@ -482,6 +558,9 @@ class ServerImpl implements TimeSource { ...@@ -482,6 +558,9 @@ class ServerImpl implements TimeSource {
if (s != null) { if (s != null) {
clen = Long.parseLong(s); clen = Long.parseLong(s);
} }
if (clen == 0) {
requestCompleted (connection);
}
} }
ctx = contexts.findContext (protocol, uri.getPath()); ctx = contexts.findContext (protocol, uri.getPath());
if (ctx == null) { if (ctx == null) {
...@@ -560,7 +639,7 @@ class ServerImpl implements TimeSource { ...@@ -560,7 +639,7 @@ class ServerImpl implements TimeSource {
} catch (IOException e1) { } catch (IOException e1) {
logger.log (Level.FINER, "ServerImpl.Exchange (1)", e1); logger.log (Level.FINER, "ServerImpl.Exchange (1)", e1);
connection.close(); closeConnection(connection);
} catch (NumberFormatException e3) { } catch (NumberFormatException e3) {
reject (Code.HTTP_BAD_REQUEST, reject (Code.HTTP_BAD_REQUEST,
requestLine, "NumberFormatException thrown"); requestLine, "NumberFormatException thrown");
...@@ -569,7 +648,7 @@ class ServerImpl implements TimeSource { ...@@ -569,7 +648,7 @@ class ServerImpl implements TimeSource {
requestLine, "URISyntaxException thrown"); requestLine, "URISyntaxException thrown");
} catch (Exception e4) { } catch (Exception e4) {
logger.log (Level.FINER, "ServerImpl.Exchange (2)", e4); logger.log (Level.FINER, "ServerImpl.Exchange (2)", e4);
connection.close(); closeConnection(connection);
} }
} }
...@@ -591,47 +670,60 @@ class ServerImpl implements TimeSource { ...@@ -591,47 +670,60 @@ class ServerImpl implements TimeSource {
rejected = true; rejected = true;
logReply (code, requestStr, message); logReply (code, requestStr, message);
sendReply ( sendReply (
code, true, "<h1>"+code+Code.msg(code)+"</h1>"+message code, false, "<h1>"+code+Code.msg(code)+"</h1>"+message
); );
/* connection is already closed by sendReply, now remove it */ closeConnection(connection);
allConnections.remove(connection);
} }
void sendReply ( void sendReply (
int code, boolean closeNow, String text) int code, boolean closeNow, String text)
{ {
try { try {
String s = "HTTP/1.1 " + code + Code.msg(code) + "\r\n"; StringBuilder builder = new StringBuilder (512);
builder.append ("HTTP/1.1 ")
.append (code).append (Code.msg(code)).append ("\r\n");
if (text != null && text.length() != 0) { if (text != null && text.length() != 0) {
s = s + "Content-Length: "+text.length()+"\r\n"; builder.append ("Content-Length: ")
s = s + "Content-Type: text/html\r\n"; .append (text.length()).append ("\r\n")
.append ("Content-Type: text/html\r\n");
} else { } else {
s = s + "Content-Length: 0\r\n"; builder.append ("Content-Length: 0\r\n");
text = ""; text = "";
} }
if (closeNow) { if (closeNow) {
s = s + "Connection: close\r\n"; builder.append ("Connection: close\r\n");
} }
s = s + "\r\n" + text; builder.append ("\r\n").append (text);
String s = builder.toString();
byte[] b = s.getBytes("ISO8859_1"); byte[] b = s.getBytes("ISO8859_1");
rawout.write (b); rawout.write (b);
rawout.flush(); rawout.flush();
if (closeNow) { if (closeNow) {
connection.close(); closeConnection(connection);
} }
} catch (IOException e) { } catch (IOException e) {
logger.log (Level.FINER, "ServerImpl.sendReply", e); logger.log (Level.FINER, "ServerImpl.sendReply", e);
connection.close(); closeConnection(connection);
} }
} }
} }
void logReply (int code, String requestStr, String text) { void logReply (int code, String requestStr, String text) {
if (!logger.isLoggable(Level.FINE)) {
return;
}
if (text == null) { if (text == null) {
text = ""; text = "";
} }
String message = requestStr + " [" + code + " " + String r;
if (requestStr.length() > 80) {
r = requestStr.substring (0, 80) + "<TRUNCATED>";
} else {
r = requestStr;
}
String message = r + " [" + code + " " +
Code.msg(code) + "] ("+text+")"; Code.msg(code) + "] ("+text+")";
logger.fine (message); logger.fine (message);
} }
...@@ -667,6 +759,34 @@ class ServerImpl implements TimeSource { ...@@ -667,6 +759,34 @@ class ServerImpl implements TimeSource {
return wrapper; return wrapper;
} }
void requestStarted (HttpConnection c) {
c.creationTime = getTime();
c.setState (State.REQUEST);
reqConnections.add (c);
}
// called after a request has been completely read
// by the server. This stops the timer which would
// close the connection if the request doesn't arrive
// quickly enough. It then starts the timer
// that ensures the client reads the response in a timely
// fashion.
void requestCompleted (HttpConnection c) {
assert c.getState() == State.REQUEST;
reqConnections.remove (c);
c.rspStartedTime = getTime();
rspConnections.add (c);
c.setState (State.RESPONSE);
}
// called after response has been sent
void responseCompleted (HttpConnection c) {
assert c.getState() == State.RESPONSE;
rspConnections.remove (c);
c.setState (State.IDLE);
}
/** /**
* TimerTask run every CLOCK_TICK ms * TimerTask run every CLOCK_TICK ms
*/ */
...@@ -689,4 +809,62 @@ class ServerImpl implements TimeSource { ...@@ -689,4 +809,62 @@ class ServerImpl implements TimeSource {
} }
} }
} }
class ServerTimerTask1 extends TimerTask {
// runs every TIMER_MILLIS
public void run () {
LinkedList<HttpConnection> toClose = new LinkedList<HttpConnection>();
time = System.currentTimeMillis();
synchronized (reqConnections) {
if (MAX_REQ_TIME != -1) {
for (HttpConnection c : reqConnections) {
if (c.creationTime + TIMER_MILLIS + MAX_REQ_TIME <= time) {
toClose.add (c);
}
}
for (HttpConnection c : toClose) {
logger.log (Level.FINE, "closing: no request: " + c);
reqConnections.remove (c);
allConnections.remove (c);
c.close();
}
}
}
toClose = new LinkedList<HttpConnection>();
synchronized (rspConnections) {
if (MAX_RSP_TIME != -1) {
for (HttpConnection c : rspConnections) {
if (c.rspStartedTime + TIMER_MILLIS +MAX_RSP_TIME <= time) {
toClose.add (c);
}
}
for (HttpConnection c : toClose) {
logger.log (Level.FINE, "closing: no response: " + c);
rspConnections.remove (c);
allConnections.remove (c);
c.close();
}
}
}
}
}
void logStackTrace (String s) {
logger.finest (s);
StringBuilder b = new StringBuilder ();
StackTraceElement[] e = Thread.currentThread().getStackTrace();
for (int i=0; i<e.length; i++) {
b.append (e[i].toString()).append("\n");
}
logger.finest (b.toString());
}
static long getTimeMillis(long secs) {
if (secs == -1) {
return -1;
} else {
return secs * 1000;
}
}
} }
...@@ -235,8 +235,6 @@ abstract class AsynchronousSocketChannelImpl ...@@ -235,8 +235,6 @@ abstract class AsynchronousSocketChannelImpl
if (remoteAddress == null) if (remoteAddress == null)
throw new NotYetConnectedException(); throw new NotYetConnectedException();
if (timeout < 0L)
throw new IllegalArgumentException("Negative timeout");
boolean hasSpaceToRead = isScatteringRead || dst.hasRemaining(); boolean hasSpaceToRead = isScatteringRead || dst.hasRemaining();
boolean shutdown = false; boolean shutdown = false;
...@@ -342,8 +340,6 @@ abstract class AsynchronousSocketChannelImpl ...@@ -342,8 +340,6 @@ abstract class AsynchronousSocketChannelImpl
if (isOpen()) { if (isOpen()) {
if (remoteAddress == null) if (remoteAddress == null)
throw new NotYetConnectedException(); throw new NotYetConnectedException();
if (timeout < 0L)
throw new IllegalArgumentException("Negative timeout");
// check and update state // check and update state
synchronized (writeLock) { synchronized (writeLock) {
if (writeKilled) if (writeKilled)
......
...@@ -358,7 +358,7 @@ class UTF_8 extends Unicode ...@@ -358,7 +358,7 @@ class UTF_8 extends Unicode
private static class Encoder extends CharsetEncoder { private static class Encoder extends CharsetEncoder {
private Encoder(Charset cs) { private Encoder(Charset cs) {
super(cs, 1.1f, 4.0f); super(cs, 1.1f, 3.0f);
} }
public boolean canEncode(char c) { public boolean canEncode(char c) {
......
...@@ -778,6 +778,13 @@ public class ExtendedCharsets ...@@ -778,6 +778,13 @@ public class ExtendedCharsets
"csIBM500" "csIBM500"
}); });
charset("x-IBM833", "IBM833",
new String[] {
"cp833",
"ibm833",
"ibm-833"
});
//EBCDIC DBCS-only Korean //EBCDIC DBCS-only Korean
charset("x-IBM834", "IBM834", charset("x-IBM834", "IBM834",
new String[] { new String[] {
......
...@@ -250,16 +250,16 @@ public class CCacheInputStream extends KrbDataInputStream implements FileCCacheC ...@@ -250,16 +250,16 @@ public class CCacheInputStream extends KrbDataInputStream implements FileCCacheC
else return null; else return null;
} }
Ticket readData() throws IOException, RealmException, KrbApErrException, Asn1Exception { byte[] readData() throws IOException {
int length; int length;
length = read(4); length = read(4);
if (length > 0) { if (length == 0) {
return null;
} else {
byte[] bytes = new byte[length]; byte[] bytes = new byte[length];
read(bytes, 0, length); read(bytes, 0, length);
Ticket ticket = new Ticket(bytes); return bytes;
return ticket;
} }
else return null;
} }
boolean[] readFlags() throws IOException { boolean[] readFlags() throws IOException {
...@@ -328,6 +328,17 @@ public class CCacheInputStream extends KrbDataInputStream implements FileCCacheC ...@@ -328,6 +328,17 @@ public class CCacheInputStream extends KrbDataInputStream implements FileCCacheC
} }
return flags; return flags;
} }
/**
* Reads the next cred in stream.
* @return the next cred, null if ticket or second_ticket unparseable.
*
* Note: MIT krb5 1.8.1 might generate a config entry with server principal
* X-CACHECONF:/krb5_ccache_conf_data/fast_avail/krbtgt/REALM@REALM. The
* entry is used by KDC to inform the client that it support certain
* features. Its ticket is not a valid krb5 ticket and thus this method
* returns null.
*/
Credentials readCred(int version) throws IOException,RealmException, KrbApErrException, Asn1Exception { Credentials readCred(int version) throws IOException,RealmException, KrbApErrException, Asn1Exception {
PrincipalName cpname = readPrincipal(version); PrincipalName cpname = readPrincipal(version);
if (DEBUG) if (DEBUG)
...@@ -367,17 +378,17 @@ public class CCacheInputStream extends KrbDataInputStream implements FileCCacheC ...@@ -367,17 +378,17 @@ public class CCacheInputStream extends KrbDataInputStream implements FileCCacheC
if (auData != null) { if (auData != null) {
auData = new AuthorizationData(auDataEntry); auData = new AuthorizationData(auDataEntry);
} }
Ticket ticket = readData(); byte[] ticketData = readData();
if (DEBUG) { byte[] ticketData2 = readData();
System.out.println(">>>DEBUG <CCacheInputStream>");
if (ticket == null) { try {
System.out.println("///ticket is null"); return new Credentials(cpname, spname, key, authtime, starttime,
} endtime, renewTill, skey, tFlags,
addrs, auData,
ticketData != null ? new Ticket(ticketData) : null,
ticketData2 != null ? new Ticket(ticketData2) : null);
} catch (Exception e) { // If any of new Ticket(*) fails.
return null;
} }
Ticket secTicket = readData();
Credentials cred = new Credentials(cpname, spname, key, authtime, starttime,
endtime, renewTill, skey, tFlags,
addrs, auData, ticket, secTicket);
return cred;
} }
} }
/* /*
* Copyright (c) 2000, 2009, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -186,7 +186,10 @@ public class FileCredentialsCache extends CredentialsCache ...@@ -186,7 +186,10 @@ public class FileCredentialsCache extends CredentialsCache
primaryRealm = primaryPrincipal.getRealm(); primaryRealm = primaryPrincipal.getRealm();
credentialsList = new Vector<Credentials> (); credentialsList = new Vector<Credentials> ();
while (cis.available() > 0) { while (cis.available() > 0) {
credentialsList.addElement(cis.readCred(version)); Credentials cred = cis.readCred(version);
if (cred != null) {
credentialsList.addElement(cred);
}
} }
cis.close(); cis.close();
} }
......
...@@ -74,7 +74,7 @@ final class P11Cipher extends CipherSpi { ...@@ -74,7 +74,7 @@ final class P11Cipher extends CipherSpi {
// DEC: return the length of trailing padding bytes given the specified // DEC: return the length of trailing padding bytes given the specified
// padded data // padded data
int unpad(byte[] paddedData, int len) int unpad(byte[] paddedData, int len)
throws BadPaddingException; throws BadPaddingException, IllegalBlockSizeException;
} }
private static class PKCS5Padding implements Padding { private static class PKCS5Padding implements Padding {
...@@ -96,9 +96,10 @@ final class P11Cipher extends CipherSpi { ...@@ -96,9 +96,10 @@ final class P11Cipher extends CipherSpi {
} }
public int unpad(byte[] paddedData, int len) public int unpad(byte[] paddedData, int len)
throws BadPaddingException { throws BadPaddingException, IllegalBlockSizeException {
if (len < 1 || len > paddedData.length) { if ((len < 1) || (len % blockSize != 0)) {
throw new BadPaddingException("Invalid pad array length!"); throw new IllegalBlockSizeException
("Input length must be multiples of " + blockSize);
} }
byte padValue = paddedData[len - 1]; byte padValue = paddedData[len - 1];
if (padValue < 1 || padValue > blockSize) { if (padValue < 1 || padValue > blockSize) {
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* *
* This code is distributed in the hope that it will be useful, but WITHOUT * This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * 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 * version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code). * accompanied this code).
* *
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* *
* This code is distributed in the hope that it will be useful, but WITHOUT * This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * 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 * version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code). * accompanied this code).
* *
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* *
* This code is distributed in the hope that it will be useful, but WITHOUT * This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * 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 * version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code). * accompanied this code).
* *
......
...@@ -31,5 +31,9 @@ disabledMechanisms = { ...@@ -31,5 +31,9 @@ disabledMechanisms = {
CKM_SHA256_RSA_PKCS CKM_SHA256_RSA_PKCS
CKM_SHA384_RSA_PKCS CKM_SHA384_RSA_PKCS
CKM_SHA512_RSA_PKCS CKM_SHA512_RSA_PKCS
# the following mechanisms are disabled to ensure backward compatibility (Solaris bug 6545046)
CKM_DES_CBC_PAD
CKM_DES3_CBC_PAD
CKM_AES_CBC_PAD
} }
...@@ -132,14 +132,17 @@ Java_java_util_zip_Deflater_deflateBytes(JNIEnv *env, jobject this, jlong addr, ...@@ -132,14 +132,17 @@ Java_java_util_zip_Deflater_deflateBytes(JNIEnv *env, jobject this, jlong addr,
in_buf = (jbyte *) malloc(this_len); in_buf = (jbyte *) malloc(this_len);
if (in_buf == 0) { if (in_buf == 0) {
JNU_ThrowOutOfMemoryError(env, 0); // Throw OOME only when length is not zero
if (this_len != 0)
JNU_ThrowOutOfMemoryError(env, 0);
return 0; return 0;
} }
(*env)->GetByteArrayRegion(env, this_buf, this_off, this_len, in_buf); (*env)->GetByteArrayRegion(env, this_buf, this_off, this_len, in_buf);
out_buf = (jbyte *) malloc(len); out_buf = (jbyte *) malloc(len);
if (out_buf == 0) { if (out_buf == 0) {
free(in_buf); free(in_buf);
JNU_ThrowOutOfMemoryError(env, 0); if (len != 0)
JNU_ThrowOutOfMemoryError(env, 0);
return 0; return 0;
} }
...@@ -173,7 +176,8 @@ Java_java_util_zip_Deflater_deflateBytes(JNIEnv *env, jobject this, jlong addr, ...@@ -173,7 +176,8 @@ Java_java_util_zip_Deflater_deflateBytes(JNIEnv *env, jobject this, jlong addr,
jboolean finish = (*env)->GetBooleanField(env, this, finishID); jboolean finish = (*env)->GetBooleanField(env, this, finishID);
in_buf = (jbyte *) malloc(this_len); in_buf = (jbyte *) malloc(this_len);
if (in_buf == 0) { if (in_buf == 0) {
JNU_ThrowOutOfMemoryError(env, 0); if (this_len != 0)
JNU_ThrowOutOfMemoryError(env, 0);
return 0; return 0;
} }
(*env)->GetByteArrayRegion(env, this_buf, this_off, this_len, in_buf); (*env)->GetByteArrayRegion(env, this_buf, this_off, this_len, in_buf);
...@@ -181,7 +185,8 @@ Java_java_util_zip_Deflater_deflateBytes(JNIEnv *env, jobject this, jlong addr, ...@@ -181,7 +185,8 @@ Java_java_util_zip_Deflater_deflateBytes(JNIEnv *env, jobject this, jlong addr,
out_buf = (jbyte *) malloc(len); out_buf = (jbyte *) malloc(len);
if (out_buf == 0) { if (out_buf == 0) {
free(in_buf); free(in_buf);
JNU_ThrowOutOfMemoryError(env, 0); if (len != 0)
JNU_ThrowOutOfMemoryError(env, 0);
return 0; return 0;
} }
......
...@@ -135,7 +135,8 @@ Java_java_util_zip_Inflater_inflateBytes(JNIEnv *env, jobject this, jlong addr, ...@@ -135,7 +135,8 @@ Java_java_util_zip_Inflater_inflateBytes(JNIEnv *env, jobject this, jlong addr,
in_buf = (jbyte *) malloc(in_len); in_buf = (jbyte *) malloc(in_len);
if (in_buf == 0) { if (in_buf == 0) {
JNU_ThrowOutOfMemoryError(env, 0); if (in_len != 0)
JNU_ThrowOutOfMemoryError(env, 0);
return 0; return 0;
} }
(*env)->GetByteArrayRegion(env, this_buf, this_off, in_len, in_buf); (*env)->GetByteArrayRegion(env, this_buf, this_off, in_len, in_buf);
...@@ -143,7 +144,8 @@ Java_java_util_zip_Inflater_inflateBytes(JNIEnv *env, jobject this, jlong addr, ...@@ -143,7 +144,8 @@ Java_java_util_zip_Inflater_inflateBytes(JNIEnv *env, jobject this, jlong addr,
out_buf = (jbyte *) malloc(len); out_buf = (jbyte *) malloc(len);
if (out_buf == 0) { if (out_buf == 0) {
free(in_buf); free(in_buf);
JNU_ThrowOutOfMemoryError(env, 0); if (len != 0)
JNU_ThrowOutOfMemoryError(env, 0);
return 0; return 0;
} }
......
...@@ -314,7 +314,7 @@ findEND(jzfile *zip, void *endbuf) ...@@ -314,7 +314,7 @@ findEND(jzfile *zip, void *endbuf)
if (pos < 0) { if (pos < 0) {
/* Pretend there are some NUL bytes before start of file */ /* Pretend there are some NUL bytes before start of file */
off = -pos; off = -pos;
memset(buf, '\0', off); memset(buf, '\0', (size_t)off);
} }
if (readFullyAt(zfd, buf + off, sizeof(buf) - off, if (readFullyAt(zfd, buf + off, sizeof(buf) - off,
...@@ -426,7 +426,7 @@ static int ...@@ -426,7 +426,7 @@ static int
isMetaName(const char *name, int length) isMetaName(const char *name, int length)
{ {
const char *s; const char *s;
if (length < sizeof("META-INF/") - 1) if (length < (int)sizeof("META-INF/") - 1)
return 0; return 0;
for (s = "META-INF/"; *s != '\0'; s++) { for (s = "META-INF/"; *s != '\0'; s++) {
char c = *name++; char c = *name++;
...@@ -912,7 +912,7 @@ readCENHeader(jzfile *zip, jlong cenpos, jint bufsize) ...@@ -912,7 +912,7 @@ readCENHeader(jzfile *zip, jlong cenpos, jint bufsize)
ZFILE zfd = zip->zfd; ZFILE zfd = zip->zfd;
char *cen; char *cen;
if (bufsize > zip->len - cenpos) if (bufsize > zip->len - cenpos)
bufsize = zip->len - cenpos; bufsize = (jint)(zip->len - cenpos);
if ((cen = malloc(bufsize)) == NULL) goto Catch; if ((cen = malloc(bufsize)) == NULL) goto Catch;
if (readFullyAt(zfd, cen, bufsize, cenpos) == -1) goto Catch; if (readFullyAt(zfd, cen, bufsize, cenpos) == -1) goto Catch;
censize = CENSIZE(cen); censize = CENSIZE(cen);
...@@ -1256,6 +1256,9 @@ ZIP_GetEntryDataOffset(jzfile *zip, jzentry *entry) ...@@ -1256,6 +1256,9 @@ ZIP_GetEntryDataOffset(jzfile *zip, jzentry *entry)
* file had been previously locked with ZIP_Lock(). Returns the * file had been previously locked with ZIP_Lock(). Returns the
* number of bytes read, or -1 if an error occurred. If zip->msg != 0 * number of bytes read, or -1 if an error occurred. If zip->msg != 0
* then a zip error occurred and zip->msg contains the error text. * then a zip error occurred and zip->msg contains the error text.
*
* The current implementation does not support reading an entry that
* has the size bigger than 2**32 bytes in ONE invocation.
*/ */
jint jint
ZIP_Read(jzfile *zip, jzentry *entry, jlong pos, void *buf, jint len) ZIP_Read(jzfile *zip, jzentry *entry, jlong pos, void *buf, jint len)
...@@ -1276,7 +1279,7 @@ ZIP_Read(jzfile *zip, jzentry *entry, jlong pos, void *buf, jint len) ...@@ -1276,7 +1279,7 @@ ZIP_Read(jzfile *zip, jzentry *entry, jlong pos, void *buf, jint len)
if (len <= 0) if (len <= 0)
return 0; return 0;
if (len > entry_size - pos) if (len > entry_size - pos)
len = entry_size - pos; len = (jint)(entry_size - pos);
/* Get file offset to start reading data */ /* Get file offset to start reading data */
start = ZIP_GetEntryDataOffset(zip, entry); start = ZIP_GetEntryDataOffset(zip, entry);
...@@ -1306,6 +1309,9 @@ ZIP_Read(jzfile *zip, jzentry *entry, jlong pos, void *buf, jint len) ...@@ -1306,6 +1309,9 @@ ZIP_Read(jzfile *zip, jzentry *entry, jlong pos, void *buf, jint len)
* from ZIP/JAR files specified in the class path. It is defined here * from ZIP/JAR files specified in the class path. It is defined here
* so that it can be dynamically loaded by the runtime if the zip library * so that it can be dynamically loaded by the runtime if the zip library
* is found. * is found.
*
* The current implementation does not support reading an entry that
* has the size bigger than 2**32 bytes in ONE invocation.
*/ */
jboolean jboolean
InflateFully(jzfile *zip, jzentry *entry, void *buf, char **msg) InflateFully(jzfile *zip, jzentry *entry, void *buf, char **msg)
...@@ -1314,7 +1320,6 @@ InflateFully(jzfile *zip, jzentry *entry, void *buf, char **msg) ...@@ -1314,7 +1320,6 @@ InflateFully(jzfile *zip, jzentry *entry, void *buf, char **msg)
char tmp[BUF_SIZE]; char tmp[BUF_SIZE];
jlong pos = 0; jlong pos = 0;
jlong count = entry->csize; jlong count = entry->csize;
jboolean status;
*msg = 0; /* Reset error message */ *msg = 0; /* Reset error message */
...@@ -1330,10 +1335,10 @@ InflateFully(jzfile *zip, jzentry *entry, void *buf, char **msg) ...@@ -1330,10 +1335,10 @@ InflateFully(jzfile *zip, jzentry *entry, void *buf, char **msg)
} }
strm.next_out = buf; strm.next_out = buf;
strm.avail_out = entry->size; strm.avail_out = (uInt)entry->size;
while (count > 0) { while (count > 0) {
jint n = count > (jlong)sizeof(tmp) ? (jint)sizeof(tmp) : count; jint n = count > (jlong)sizeof(tmp) ? (jint)sizeof(tmp) : (jint)count;
ZIP_Lock(zip); ZIP_Lock(zip);
n = ZIP_Read(zip, entry, pos, tmp, n); n = ZIP_Read(zip, entry, pos, tmp, n);
ZIP_Unlock(zip); ZIP_Unlock(zip);
...@@ -1368,12 +1373,16 @@ InflateFully(jzfile *zip, jzentry *entry, void *buf, char **msg) ...@@ -1368,12 +1373,16 @@ InflateFully(jzfile *zip, jzentry *entry, void *buf, char **msg)
return JNI_TRUE; return JNI_TRUE;
} }
/*
* The current implementation does not support reading an entry that
* has the size bigger than 2**32 bytes in ONE invocation.
*/
jzentry * JNICALL jzentry * JNICALL
ZIP_FindEntry(jzfile *zip, char *name, jint *sizeP, jint *nameLenP) ZIP_FindEntry(jzfile *zip, char *name, jint *sizeP, jint *nameLenP)
{ {
jzentry *entry = ZIP_GetEntry(zip, name, 0); jzentry *entry = ZIP_GetEntry(zip, name, 0);
if (entry) { if (entry) {
*sizeP = entry->size; *sizeP = (jint)entry->size;
*nameLenP = strlen(entry->name); *nameLenP = strlen(entry->name);
} }
return entry; return entry;
......
...@@ -75,7 +75,7 @@ int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) ...@@ -75,7 +75,7 @@ int ZEXPORT compress2 (dest, destLen, source, sourceLen, level)
deflateEnd(&stream); deflateEnd(&stream);
return err == Z_OK ? Z_BUF_ERROR : err; return err == Z_OK ? Z_BUF_ERROR : err;
} }
*destLen = stream.total_out; *destLen = (uLong)stream.total_out;
err = deflateEnd(&stream); err = deflateEnd(&stream);
return err; return err;
......
...@@ -78,7 +78,7 @@ int ZEXPORT uncompress (dest, destLen, source, sourceLen) ...@@ -78,7 +78,7 @@ int ZEXPORT uncompress (dest, destLen, source, sourceLen)
return Z_DATA_ERROR; return Z_DATA_ERROR;
return err; return err;
} }
*destLen = stream.total_out; *destLen = (uLong)stream.total_out;
err = inflateEnd(&stream); err = inflateEnd(&stream);
return err; return err;
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include <netdb.h> #include <netdb.h>
#include <stdlib.h> #include <stdlib.h>
#include <dlfcn.h> #include <dlfcn.h>
#include <values.h>
#ifdef __solaris__ #ifdef __solaris__
#include <sys/sockio.h> #include <sys/sockio.h>
...@@ -75,17 +76,17 @@ getnameinfo_f getnameinfo_ptr = NULL; ...@@ -75,17 +76,17 @@ getnameinfo_f getnameinfo_ptr = NULL;
#endif #endif
#ifdef __solaris__ #ifdef __solaris__
static int init_max_buf; static int init_tcp_max_buf, init_udp_max_buf;
static int tcp_max_buf; static int tcp_max_buf;
static int udp_max_buf; static int udp_max_buf;
/* /*
* Get the specified parameter from the specified driver. The value * Get the specified parameter from the specified driver. The value
* of the parameter is assumed to be an 'int'. If the parameter * of the parameter is assumed to be an 'int'. If the parameter
* cannot be obtained return the specified default value. * cannot be obtained return -1
*/ */
static int static int
getParam(char *driver, char *param, int dflt) getParam(char *driver, char *param)
{ {
struct strioctl stri; struct strioctl stri;
char buf [64]; char buf [64];
...@@ -94,7 +95,7 @@ getParam(char *driver, char *param, int dflt) ...@@ -94,7 +95,7 @@ getParam(char *driver, char *param, int dflt)
s = open (driver, O_RDWR); s = open (driver, O_RDWR);
if (s < 0) { if (s < 0) {
return dflt; return -1;
} }
strncpy (buf, param, sizeof(buf)); strncpy (buf, param, sizeof(buf));
stri.ic_cmd = ND_GET; stri.ic_cmd = ND_GET;
...@@ -102,13 +103,64 @@ getParam(char *driver, char *param, int dflt) ...@@ -102,13 +103,64 @@ getParam(char *driver, char *param, int dflt)
stri.ic_dp = buf; stri.ic_dp = buf;
stri.ic_len = sizeof(buf); stri.ic_len = sizeof(buf);
if (ioctl (s, I_STR, &stri) < 0) { if (ioctl (s, I_STR, &stri) < 0) {
value = dflt; value = -1;
} else { } else {
value = atoi(buf); value = atoi(buf);
} }
close (s); close (s);
return value; return value;
} }
/*
* Iterative way to find the max value that SO_SNDBUF or SO_RCVBUF
* for Solaris versions that do not support the ioctl() in getParam().
* Ugly, but only called once (for each sotype).
*
* As an optimisation, we make a guess using the default values for Solaris
* assuming they haven't been modified with ndd.
*/
#define MAX_TCP_GUESS 1024 * 1024
#define MAX_UDP_GUESS 2 * 1024 * 1024
#define FAIL_IF_NOT_ENOBUFS if (errno != ENOBUFS) return -1
static int findMaxBuf(int fd, int opt, int sotype) {
int a = 0;
int b = MAXINT;
int initial_guess;
int limit = -1;
if (sotype == SOCK_DGRAM) {
initial_guess = MAX_UDP_GUESS;
} else {
initial_guess = MAX_TCP_GUESS;
}
if (setsockopt(fd, SOL_SOCKET, opt, &initial_guess, sizeof(int)) == 0) {
initial_guess++;
if (setsockopt(fd, SOL_SOCKET, opt, &initial_guess,sizeof(int)) < 0) {
FAIL_IF_NOT_ENOBUFS;
return initial_guess - 1;
}
a = initial_guess;
} else {
FAIL_IF_NOT_ENOBUFS;
b = initial_guess - 1;
}
do {
int mid = a + (b-a)/2;
if (setsockopt(fd, SOL_SOCKET, opt, &mid, sizeof(int)) == 0) {
limit = mid;
a = mid + 1;
} else {
FAIL_IF_NOT_ENOBUFS;
b = mid - 1;
}
} while (b >= a);
return limit;
}
#endif #endif
#ifdef __linux__ #ifdef __linux__
...@@ -1148,7 +1200,6 @@ NET_GetSockOpt(int fd, int level, int opt, void *result, ...@@ -1148,7 +1200,6 @@ NET_GetSockOpt(int fd, int level, int opt, void *result,
return rv; return rv;
} }
/* /*
* Wrapper for setsockopt system routine - performs any * Wrapper for setsockopt system routine - performs any
* necessary pre/post processing to deal with OS specific * necessary pre/post processing to deal with OS specific
...@@ -1212,7 +1263,7 @@ NET_SetSockOpt(int fd, int level, int opt, const void *arg, ...@@ -1212,7 +1263,7 @@ NET_SetSockOpt(int fd, int level, int opt, const void *arg,
#ifdef __solaris__ #ifdef __solaris__
if (level == SOL_SOCKET) { if (level == SOL_SOCKET) {
if (opt == SO_SNDBUF || opt == SO_RCVBUF) { if (opt == SO_SNDBUF || opt == SO_RCVBUF) {
int sotype, arglen; int sotype=0, arglen;
int *bufsize, maxbuf; int *bufsize, maxbuf;
int ret; int ret;
...@@ -1223,18 +1274,37 @@ NET_SetSockOpt(int fd, int level, int opt, const void *arg, ...@@ -1223,18 +1274,37 @@ NET_SetSockOpt(int fd, int level, int opt, const void *arg,
/* Exceeded system limit so clamp and retry */ /* Exceeded system limit so clamp and retry */
if (!init_max_buf) {
tcp_max_buf = getParam("/dev/tcp", "tcp_max_buf", 1024*1024);
udp_max_buf = getParam("/dev/udp", "udp_max_buf", 2048*1024);
init_max_buf = 1;
}
arglen = sizeof(sotype); arglen = sizeof(sotype);
if (getsockopt(fd, SOL_SOCKET, SO_TYPE, (void *)&sotype, if (getsockopt(fd, SOL_SOCKET, SO_TYPE, (void *)&sotype,
&arglen) < 0) { &arglen) < 0) {
return -1; return -1;
} }
/*
* We try to get tcp_maxbuf (and udp_max_buf) using
* an ioctl() that isn't available on all versions of Solaris.
* If that fails, we use the search algorithm in findMaxBuf()
*/
if (!init_tcp_max_buf && sotype == SOCK_STREAM) {
tcp_max_buf = getParam("/dev/tcp", "tcp_max_buf");
if (tcp_max_buf == -1) {
tcp_max_buf = findMaxBuf(fd, opt, SOCK_STREAM);
if (tcp_max_buf == -1) {
return -1;
}
}
init_tcp_max_buf = 1;
} else if (!init_udp_max_buf && sotype == SOCK_DGRAM) {
udp_max_buf = getParam("/dev/udp", "udp_max_buf");
if (udp_max_buf == -1) {
udp_max_buf = findMaxBuf(fd, opt, SOCK_DGRAM);
if (udp_max_buf == -1) {
return -1;
}
}
init_udp_max_buf = 1;
}
maxbuf = (sotype == SOCK_STREAM) ? tcp_max_buf : udp_max_buf; maxbuf = (sotype == SOCK_STREAM) ? tcp_max_buf : udp_max_buf;
bufsize = (int *)arg; bufsize = (int *)arg;
if (*bufsize > maxbuf) { if (*bufsize > maxbuf) {
......
...@@ -129,7 +129,7 @@ public class Ktab { ...@@ -129,7 +129,7 @@ public class Ktab {
ktab.deleteEntry(); ktab.deleteEntry();
break; break;
default: default:
ktab.printHelp(); ktab.error("A command must be provided");
} }
} }
...@@ -232,7 +232,7 @@ public class Ktab { ...@@ -232,7 +232,7 @@ public class Ktab {
append = true; append = true;
break; break;
default: default:
printHelp(); error("Unknown command: " + args[i]);
break; break;
} }
} else { // optional standalone arguments } else { // optional standalone arguments
......
...@@ -734,10 +734,6 @@ java/util/concurrent/FutureTask/BlockingTaskExecutor.java generic-all ...@@ -734,10 +734,6 @@ java/util/concurrent/FutureTask/BlockingTaskExecutor.java generic-all
# Problems on windows, jmap.exe hangs? (these run jmap), fails on Solaris 10 x86 # Problems on windows, jmap.exe hangs? (these run jmap), fails on Solaris 10 x86
java/util/concurrent/locks/Lock/TimedAcquireLeak.java generic-all java/util/concurrent/locks/Lock/TimedAcquireLeak.java generic-all
# Solaris sparc client, some failures, "1 not equal to 3"?
# also Linux problems with samevm mode, -server linux i586? 1 not equal to 3?
java/util/concurrent/Executors/AutoShutdown.java generic-all
# Fails on solaris-sparc -server (Set not equal to copy. 1) # Fails on solaris-sparc -server (Set not equal to copy. 1)
java/util/EnumSet/EnumSetBash.java solaris-sparc java/util/EnumSet/EnumSetBash.java solaris-sparc
......
...@@ -22,8 +22,20 @@ ...@@ -22,8 +22,20 @@
*/ */
import com.sun.net.httpserver.*; import com.sun.net.httpserver.*;
import java.util.logging.*;
public class Test { public class Test {
static Logger logger;
static void enableLogging() {
logger = Logger.getLogger("com.sun.net.httpserver");
Handler h = new ConsoleHandler();
h.setLevel(Level.ALL);
logger.setLevel(Level.ALL);
logger.addHandler(h);
}
static void delay () { static void delay () {
try { try {
Thread.sleep (1000); Thread.sleep (1000);
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
* @test * @test
* @bug 6270015 * @bug 6270015
* @run main/othervm Test1 * @run main/othervm Test1
* @run main/othervm -Dsun.net.httpserver.maxReqTime=10 Test1
* @summary Light weight HTTP server * @summary Light weight HTTP server
*/ */
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
import com.sun.net.httpserver.*; import com.sun.net.httpserver.*;
import java.util.concurrent.*; import java.util.concurrent.*;
import java.util.logging.*;
import java.io.*; import java.io.*;
import java.net.*; import java.net.*;
...@@ -45,12 +46,19 @@ public class Test13 extends Test { ...@@ -45,12 +46,19 @@ public class Test13 extends Test {
static SSLContext ctx; static SSLContext ctx;
final static int NUM = 32; // was 32
static boolean fail = false; static boolean fail = false;
public static void main (String[] args) throws Exception { public static void main (String[] args) throws Exception {
HttpServer s1 = null; HttpServer s1 = null;
HttpsServer s2 = null; HttpsServer s2 = null;
ExecutorService executor=null; ExecutorService executor=null;
Logger l = Logger.getLogger ("com.sun.net.httpserver");
Handler ha = new ConsoleHandler();
ha.setLevel(Level.ALL);
l.setLevel(Level.ALL);
l.addHandler(ha);
try { try {
String root = System.getProperty ("test.src")+ "/docs"; String root = System.getProperty ("test.src")+ "/docs";
System.out.print ("Test13: "); System.out.print ("Test13: ");
...@@ -70,10 +78,10 @@ public class Test13 extends Test { ...@@ -70,10 +78,10 @@ public class Test13 extends Test {
int port = s1.getAddress().getPort(); int port = s1.getAddress().getPort();
int httpsport = s2.getAddress().getPort(); int httpsport = s2.getAddress().getPort();
Runner r[] = new Runner[64]; Runner r[] = new Runner[NUM*2];
for (int i=0; i<32; i++) { for (int i=0; i<NUM; i++) {
r[i] = new Runner (true, "http", root+"/test1", port, "smallfile.txt", 23); r[i] = new Runner (true, "http", root+"/test1", port, "smallfile.txt", 23);
r[i+32] = new Runner (true, "https", root+"/test1", port, "smallfile.txt", 23); r[i+NUM] = new Runner (true, "https", root+"/test1", httpsport, "smallfile.txt", 23);
} }
start (r); start (r);
join (r); join (r);
...@@ -91,6 +99,7 @@ public class Test13 extends Test { ...@@ -91,6 +99,7 @@ public class Test13 extends Test {
static void start (Runner[] x) { static void start (Runner[] x) {
for (int i=0; i<x.length; i++) { for (int i=0; i<x.length; i++) {
if (x[i] != null)
x[i].start(); x[i].start();
} }
} }
...@@ -98,6 +107,7 @@ public class Test13 extends Test { ...@@ -98,6 +107,7 @@ public class Test13 extends Test {
static void join (Runner[] x) { static void join (Runner[] x) {
for (int i=0; i<x.length; i++) { for (int i=0; i<x.length; i++) {
try { try {
if (x[i] != null)
x[i].join(); x[i].join();
} catch (InterruptedException e) {} } catch (InterruptedException e) {}
} }
......
/*
* Copyright (c) 2005, 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.
*
* 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 6725892
* @run main/othervm -Dsun.net.httpserver.maxReqTime=2 Test
* @summary
*/
import com.sun.net.httpserver.*;
import java.util.concurrent.*;
import java.util.logging.*;
import java.io.*;
import java.net.*;
import javax.net.ssl.*;
public class Test {
static HttpServer s1;
static int port;
static URL url;
static final String RESPONSE_BODY = "response";
static boolean failed = false;
static class Handler implements HttpHandler {
public void handle (HttpExchange t)
throws IOException
{
InputStream is = t.getRequestBody();
InetSocketAddress rem = t.getRemoteAddress();
System.out.println ("Request from: " + rem);
while (is.read () != -1) ;
is.close();
String requrl = t.getRequestURI().toString();
OutputStream os = t.getResponseBody();
t.sendResponseHeaders (200, RESPONSE_BODY.length());
os.write (RESPONSE_BODY.getBytes());
t.close();
}
}
public static void main (String[] args) throws Exception {
ExecutorService exec = Executors.newCachedThreadPool();
try {
InetSocketAddress addr = new InetSocketAddress (0);
s1 = HttpServer.create (addr, 0);
HttpHandler h = new Handler ();
HttpContext c1 = s1.createContext ("/", h);
s1.setExecutor(exec);
s1.start();
port = s1.getAddress().getPort();
System.out.println ("Server on port " + port);
url = new URL ("http://127.0.0.1:"+port+"/foo");
test1();
test2();
test3();
Thread.sleep (2000);
} catch (Exception e) {
e.printStackTrace();
System.out.println ("FAIL");
throw new RuntimeException ();
} finally {
s1.stop(0);
System.out.println ("After Shutdown");
exec.shutdown();
}
}
// open TCP connection without sending anything. Check server closes it.
static void test1() throws IOException {
failed = false;
Socket s = new Socket ("127.0.0.1", port);
InputStream is = s.getInputStream();
// server should close connection after 2 seconds. We wait up to 10
s.setSoTimeout (10000);
try {
is.read();
} catch (SocketTimeoutException e) {
failed = true;
}
s.close();
if (failed) {
System.out.println ("test1: FAIL");
throw new RuntimeException ();
} else {
System.out.println ("test1: OK");
}
}
// send request and don't read response. Check server closes connection
static void test2() throws IOException {
HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
urlc.setReadTimeout (20 * 1000);
InputStream is = urlc.getInputStream();
// we won't read response and check if it times out
// on server. If it timesout at client then there is a problem
try {
Thread.sleep (10 * 1000);
while (is.read() != -1) ;
} catch (InterruptedException e) {
System.out.println (e);
System.out.println ("test2: FAIL");
throw new RuntimeException ("unexpected error");
} catch (SocketTimeoutException e1) {
System.out.println (e1);
System.out.println ("test2: FAIL");
throw new RuntimeException ("client timedout");
} finally {
is.close();
}
System.out.println ("test2: OK");
}
// same as test2, but repeated with multiple connections
// including a number of valid request/responses
// Worker: a thread opens a connection to the server in one of three modes.
// NORMAL - sends a request, waits for response, and checks valid response
// REQUEST - sends a partial request, and blocks, to see if
// server closes the connection.
// RESPONSE - sends a request, partially reads response and blocks,
// to see if server closes the connection.
static class Worker extends Thread {
CountDownLatch latch;
Mode mode;
enum Mode {
REQUEST, // block during sending of request
RESPONSE, // block during reading of response
NORMAL // don't block
};
Worker (CountDownLatch latch, Mode mode) {
this.latch = latch;
this.mode = mode;
}
void fail(String msg) {
System.out.println (msg);
failed = true;
}
public void run () {
HttpURLConnection urlc;
InputStream is = null;
try {
urlc = (HttpURLConnection) url.openConnection();
urlc.setReadTimeout (20 * 1000);
urlc.setDoOutput(true);
} catch (IOException e) {
fail("Worker: failed to connect to server");
latch.countDown();
return;
}
try {
OutputStream os = urlc.getOutputStream();
os.write ("foo".getBytes());
if (mode == Mode.REQUEST) {
Thread.sleep (3000);
}
os.close();
is = urlc.getInputStream();
if (mode == Mode.RESPONSE) {
Thread.sleep (3000);
}
if (!checkResponse (is, RESPONSE_BODY)) {
fail ("Worker: response");
}
is.close();
return;
} catch (InterruptedException e0) {
fail("Worker: timedout");
} catch (SocketTimeoutException e1) {
fail("Worker: timedout");
} catch (IOException e2) {
switch (mode) {
case NORMAL:
fail ("Worker: " + e2.getMessage());
break;
case RESPONSE:
if (is == null) {
fail ("Worker: " + e2.getMessage());
break;
}
// default: is ok
}
} finally {
latch.countDown();
}
}
}
static final int NUM = 20;
static void test3() throws Exception {
failed = false;
CountDownLatch l = new CountDownLatch (NUM*3);
Worker[] workers = new Worker[NUM*3];
for (int i=0; i<NUM; i++) {
workers[i*3] = new Worker (l, Worker.Mode.NORMAL);
workers[i*3+1] = new Worker (l, Worker.Mode.REQUEST);
workers[i*3+2] = new Worker (l, Worker.Mode.RESPONSE);
workers[i*3].start();
workers[i*3+1].start();
workers[i*3+2].start();
}
l.await();
for (int i=0; i<NUM*3; i++) {
workers[i].join();
}
if (failed) {
throw new RuntimeException ("test3: failed");
}
System.out.println ("test3: OK");
}
static boolean checkResponse (InputStream is, String resp) {
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buf = new byte [64];
int c;
while ((c=is.read(buf)) != -1) {
bos.write (buf, 0, c);
}
bos.close();
if (!bos.toString().equals(resp)) {
System.out.println ("Wrong response: " + bos.toString());
return false;
}
} catch (IOException e) {
System.out.println (e);
return false;
}
return true;
}
}
...@@ -83,7 +83,7 @@ public class B6401598 { ...@@ -83,7 +83,7 @@ public class B6401598 {
server = HttpServer.create(new InetSocketAddress(0), 400); server = HttpServer.create(new InetSocketAddress(0), 400);
server.createContext("/server/", new MyHandler()); server.createContext("/server/", new MyHandler());
exec = Executors.newFixedThreadPool(3); exec = Executors.newFixedThreadPool(3);
server.setExecutor(null); server.setExecutor(exec);
port = server.getAddress().getPort(); port = server.getAddress().getPort();
server.start(); server.start();
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
*/ */
/* @test /* @test
* @bug 4997655 * @bug 4997655 7000913
* @summary (bf) CharBuffer.slice() on wrapped CharSequence results in wrong position * @summary (bf) CharBuffer.slice() on wrapped CharSequence results in wrong position
*/ */
...@@ -75,12 +75,27 @@ public class StringCharBufferSliceTest { ...@@ -75,12 +75,27 @@ public class StringCharBufferSliceTest {
} }
} }
System.out.println(
">>> StringCharBufferSliceTest-main: testing slice with result of slice");
buff.position(0);
buff.limit(buff.capacity());
slice = buff.slice();
for (int i=0; i<4; i++) {
slice.position(i);
CharBuffer nextSlice = slice.slice();
if (nextSlice.position() != 0)
throw new RuntimeException("New buffer's position should be zero");
if (!nextSlice.equals(slice))
throw new RuntimeException("New buffer should be equal");
slice = nextSlice;
}
System.out.println( System.out.println(
">>> StringCharBufferSliceTest-main: testing toString."); ">>> StringCharBufferSliceTest-main: testing toString.");
buff.position(4); buff.position(4);
buff.limit(7); buff.limit(7);
slice = buff.slice(); slice = buff.slice();
if (! slice.toString().equals("tes")) { if (!slice.toString().equals("tes")) {
throw new RuntimeException("bad toString() after slice(): " + slice.toString()); throw new RuntimeException("bad toString() after slice(): " + slice.toString());
} }
...@@ -104,6 +119,7 @@ public class StringCharBufferSliceTest { ...@@ -104,6 +119,7 @@ public class StringCharBufferSliceTest {
|| dupe.charAt(2) != 's' || dupe.charAt(3) != 't') { || dupe.charAt(2) != 's' || dupe.charAt(3) != 't') {
throw new RuntimeException("bad duplicate() after slice(): '" + dupe + "'"); throw new RuntimeException("bad duplicate() after slice(): '" + dupe + "'");
} }
System.out.println(">>> StringCharBufferSliceTest-main: done!"); System.out.println(">>> StringCharBufferSliceTest-main: done!");
} }
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
*/ */
/* @test /* @test
* @bug 4607272 6842687 * @bug 4607272 6842687 6878369
* @summary Unit test for AsynchronousSocketChannel * @summary Unit test for AsynchronousSocketChannel
* @run main/timeout=600 Basic * @run main/timeout=600 Basic
*/ */
...@@ -712,52 +712,57 @@ public class Basic { ...@@ -712,52 +712,57 @@ public class Basic {
} }
static void testTimeout() throws Exception { static void testTimeout() throws Exception {
System.out.println("-- timeouts --");
testTimeout(Integer.MIN_VALUE, TimeUnit.SECONDS);
testTimeout(-1L, TimeUnit.SECONDS);
testTimeout(0L, TimeUnit.SECONDS);
testTimeout(2L, TimeUnit.SECONDS);
}
static void testTimeout(final long timeout, final TimeUnit unit) throws Exception {
Server server = new Server(); Server server = new Server();
AsynchronousSocketChannel ch = AsynchronousSocketChannel.open(); AsynchronousSocketChannel ch = AsynchronousSocketChannel.open();
ch.connect(server.address()).get(); ch.connect(server.address()).get();
System.out.println("-- timeout when reading --");
ByteBuffer dst = ByteBuffer.allocate(512); ByteBuffer dst = ByteBuffer.allocate(512);
final AtomicReference<Throwable> readException = new AtomicReference<Throwable>(); final AtomicReference<Throwable> readException = new AtomicReference<Throwable>();
// this read should timeout // this read should timeout if value is > 0
ch.read(dst, 3, TimeUnit.SECONDS, (Void)null, ch.read(dst, timeout, unit, null, new CompletionHandler<Integer,Void>() {
new CompletionHandler<Integer,Void>()
{
public void completed(Integer result, Void att) { public void completed(Integer result, Void att) {
throw new RuntimeException("Should not complete"); readException.set(new RuntimeException("Should not complete"));
} }
public void failed(Throwable exc, Void att) { public void failed(Throwable exc, Void att) {
readException.set(exc); readException.set(exc);
} }
}); });
// wait for exception if (timeout > 0L) {
while (readException.get() == null) { // wait for exception
Thread.sleep(100); while (readException.get() == null) {
} Thread.sleep(100);
if (!(readException.get() instanceof InterruptedByTimeoutException)) }
throw new RuntimeException("InterruptedByTimeoutException expected"); if (!(readException.get() instanceof InterruptedByTimeoutException))
throw new RuntimeException("InterruptedByTimeoutException expected");
// after a timeout then further reading should throw unspecified runtime exception // after a timeout then further reading should throw unspecified runtime exception
boolean exceptionThrown = false; boolean exceptionThrown = false;
try { try {
ch.read(dst); ch.read(dst);
} catch (RuntimeException x) { } catch (RuntimeException x) {
exceptionThrown = true; exceptionThrown = true;
}
if (!exceptionThrown)
throw new RuntimeException("RuntimeException expected after timeout.");
} else {
Thread.sleep(1000);
Throwable exc = readException.get();
if (exc != null)
throw new RuntimeException(exc);
} }
if (!exceptionThrown)
throw new RuntimeException("RuntimeException expected after timeout.");
System.out.println("-- timeout when writing --");
final AtomicReference<Throwable> writeException = new AtomicReference<Throwable>(); final AtomicReference<Throwable> writeException = new AtomicReference<Throwable>();
final long timeout = 5;
final TimeUnit unit = TimeUnit.SECONDS;
// write bytes to fill socket buffer // write bytes to fill socket buffer
ch.write(genBuffer(), timeout, unit, ch, ch.write(genBuffer(), timeout, unit, ch,
new CompletionHandler<Integer,AsynchronousSocketChannel>() new CompletionHandler<Integer,AsynchronousSocketChannel>()
...@@ -769,24 +774,32 @@ public class Basic { ...@@ -769,24 +774,32 @@ public class Basic {
writeException.set(exc); writeException.set(exc);
} }
}); });
if (timeout > 0) {
// wait for exception
while (writeException.get() == null) {
Thread.sleep(100);
}
if (!(writeException.get() instanceof InterruptedByTimeoutException))
throw new RuntimeException("InterruptedByTimeoutException expected");
// wait for exception // after a timeout then further writing should throw unspecified runtime exception
while (writeException.get() == null) { boolean exceptionThrown = false;
Thread.sleep(100); try {
} ch.write(genBuffer());
if (!(writeException.get() instanceof InterruptedByTimeoutException)) } catch (RuntimeException x) {
throw new RuntimeException("InterruptedByTimeoutException expected"); exceptionThrown = true;
}
// after a timeout then further writing should throw unspecified runtime exception if (!exceptionThrown)
exceptionThrown = false; throw new RuntimeException("RuntimeException expected after timeout.");
try { } else {
ch.write(genBuffer()); Thread.sleep(1000);
} catch (RuntimeException x) { Throwable exc = writeException.get();
exceptionThrown = true; if (exc != null)
throw new RuntimeException(exc);
} }
if (!exceptionThrown)
throw new RuntimeException("RuntimeException expected after timeout.");
// clean-up
server.accept().close();
ch.close(); ch.close();
server.close(); server.close();
} }
......
...@@ -68,11 +68,10 @@ case "$OS" in ...@@ -68,11 +68,10 @@ case "$OS" in
;; ;;
esac esac
# remove old class files
cd ${TESTCLASSES}${FILESEP} cd ${TESTCLASSES}${FILESEP}
rm -f ClassLoaderDeadlock.class if [ ! -d provider ] ; then
rm -rf provider mkdir provider
mkdir provider fi
# compile the test program # compile the test program
${TESTJAVA}${FILESEP}bin${FILESEP}javac \ ${TESTJAVA}${FILESEP}bin${FILESEP}javac \
...@@ -88,4 +87,11 @@ ${TESTJAVA}${FILESEP}bin${FILESEP}java \ ...@@ -88,4 +87,11 @@ ${TESTJAVA}${FILESEP}bin${FILESEP}java \
-classpath "${TESTCLASSES}${PATHSEP}${TESTSRC}${FILESEP}Deadlock.jar" \ -classpath "${TESTCLASSES}${PATHSEP}${TESTSRC}${FILESEP}Deadlock.jar" \
ClassLoaderDeadlock ClassLoaderDeadlock
exit $? STATUS=$?
# clean up
rm -f 'ClassLoaderDeadlock.class' 'ClassLoaderDeadlock$1.class' \
'ClassLoaderDeadlock$DelayClassLoader.class' \
provider${FILESEP}HashProvider.class
exit $STATUS
...@@ -26,7 +26,6 @@ ...@@ -26,7 +26,6 @@
# @test # @test
# @bug 6440846 # @bug 6440846
# @ignore until 6203816 is dealt with.
# @summary make sure we do not deadlock between ExtClassLoader and AppClassLoader # @summary make sure we do not deadlock between ExtClassLoader and AppClassLoader
# @author Valerie Peng # @author Valerie Peng
# @run shell/timeout=20 Deadlock2.sh # @run shell/timeout=20 Deadlock2.sh
...@@ -71,11 +70,14 @@ esac ...@@ -71,11 +70,14 @@ esac
# remove old class files # remove old class files
cd ${TESTCLASSES} cd ${TESTCLASSES}
rm -f Deadlock2*.class
if [ -d testlib ] ; then if [ -d testlib ] ; then
rm -rf testlib rm -rf testlib
fi fi
cp -r ${TESTJAVA}${FILESEP}lib${FILESEP}ext testlib if [ -d ${TESTJAVA}${FILESEP}lib${FILESEP}ext ] ; then
cp -r ${TESTJAVA}${FILESEP}lib${FILESEP}ext testlib
else
cp -r ${TESTJAVA}${FILESEP}jre${FILESEP}lib${FILESEP}ext testlib
fi
# compile and package the test program # compile and package the test program
${TESTJAVA}${FILESEP}bin${FILESEP}javac \ ${TESTJAVA}${FILESEP}bin${FILESEP}javac \
......
...@@ -32,21 +32,40 @@ import java.io.*; ...@@ -32,21 +32,40 @@ import java.io.*;
import java.util.*; import java.util.*;
import java.util.concurrent.*; import java.util.concurrent.*;
import static java.util.concurrent.Executors.*; import static java.util.concurrent.Executors.*;
import java.util.concurrent.Phaser;
public class AutoShutdown { public class AutoShutdown {
private static void waitForFinalizersToRun() throws Throwable { private static void waitForFinalizersToRun() {
System.gc(); System.runFinalization(); Thread.sleep(10); for (int i = 0; i < 2; i++)
System.gc(); System.runFinalization(); Thread.sleep(10); tryWaitForFinalizersToRun();
}
private static void tryWaitForFinalizersToRun() {
System.gc();
final CountDownLatch fin = new CountDownLatch(1);
new Object() { protected void finalize() { fin.countDown(); }};
System.gc();
try { fin.await(); }
catch (InterruptedException ie) { throw new Error(ie); }
} }
private static void realMain(String[] args) throws Throwable { private static void realMain(String[] args) throws Throwable {
Runnable trivialRunnable = new Runnable() { public void run() {}}; final Phaser phaser = new Phaser(3);
Runnable trivialRunnable = new Runnable() {
public void run() {
phaser.arriveAndAwaitAdvance();
}
};
int count0 = Thread.activeCount(); int count0 = Thread.activeCount();
newSingleThreadExecutor().execute(trivialRunnable); Executor e1 = newSingleThreadExecutor();
newSingleThreadExecutor(defaultThreadFactory()).execute(trivialRunnable); Executor e2 = newSingleThreadExecutor(defaultThreadFactory());
Thread.sleep(100); e1.execute(trivialRunnable);
e2.execute(trivialRunnable);
phaser.arriveAndAwaitAdvance();
equal(Thread.activeCount(), count0 + 2); equal(Thread.activeCount(), count0 + 2);
waitForFinalizersToRun(); e1 = e2 = null;
for (int i = 0; i < 10 && Thread.activeCount() > count0; i++)
tryWaitForFinalizersToRun();
equal(Thread.activeCount(), count0); equal(Thread.activeCount(), count0);
} }
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
*/ */
/* @test /* @test
@bug 4513767 4961027 @bug 4513767 4961027 6217210
@summary Checks canonical names match between old and (NIO) core charsets @summary Checks canonical names match between old and (NIO) core charsets
*/ */
import java.io.InputStreamReader; import java.io.InputStreamReader;
...@@ -154,6 +154,7 @@ public class CheckHistoricalNames { ...@@ -154,6 +154,7 @@ public class CheckHistoricalNames {
checkHistoricalName("Cp500"); checkHistoricalName("Cp500");
checkHistoricalName("Cp737"); checkHistoricalName("Cp737");
checkHistoricalName("Cp775"); checkHistoricalName("Cp775");
checkHistoricalName("Cp833");
checkHistoricalName("Cp838"); checkHistoricalName("Cp838");
checkHistoricalName("Cp850"); checkHistoricalName("Cp850");
checkHistoricalName("Cp852"); checkHistoricalName("Cp852");
...@@ -228,6 +229,7 @@ public class CheckHistoricalNames { ...@@ -228,6 +229,7 @@ public class CheckHistoricalNames {
checkMappedName("IBM856", "Cp856"); checkMappedName("IBM856", "Cp856");
checkMappedName("IBM857", "Cp857"); checkMappedName("IBM857", "Cp857");
checkMappedName("IBM00858", "Cp858"); checkMappedName("IBM00858", "Cp858");
checkMappedName("IBM833", "Cp833");
checkMappedName("IBM860", "Cp860"); checkMappedName("IBM860", "Cp860");
checkMappedName("IBM861", "Cp861"); checkMappedName("IBM861", "Cp861");
checkMappedName("IBM862", "Cp862"); checkMappedName("IBM862", "Cp862");
......
/*
* Copyright (c) 2010, 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 6979329
* @summary CCacheInputStream fails to read ticket cache files from Kerberos 1.8.1
*/
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import sun.security.krb5.internal.ccache.CCacheInputStream;
import sun.security.krb5.internal.ccache.CredentialsCache;
public class UnknownCCEntry {
public static void main(String[] args) throws Exception {
// This is a ccache file generated on a test machine:
// Default principal: dummy@MAX.LOCAL
// Valid starting Expires Service principal
// 08/24/10 10:37:28 08/25/10 10:37:28 krbtgt/MAX.LOCAL@MAX.LOCAL
// Flags: FI, Etype (skey, tkt): AES-128 CTS mode with 96-bit SHA-1
// HMAC, AES-256 CTS mode with 96-bit SHA-1 HMAC
byte[] krb5cc = {
(byte)0x05, (byte)0x04, (byte)0x00, (byte)0x0C,
(byte)0x00, (byte)0x01, (byte)0x00, (byte)0x08,
(byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFA,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x01,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x01,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x09,
(byte)0x4D, (byte)0x41, (byte)0x58, (byte)0x2E,
(byte)0x4C, (byte)0x4F, (byte)0x43, (byte)0x41,
(byte)0x4C, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x05, (byte)0x64, (byte)0x75, (byte)0x6D,
(byte)0x6D, (byte)0x79, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x01, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x01, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x09, (byte)0x4D, (byte)0x41,
(byte)0x58, (byte)0x2E, (byte)0x4C, (byte)0x4F,
(byte)0x43, (byte)0x41, (byte)0x4C, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x05, (byte)0x64,
(byte)0x75, (byte)0x6D, (byte)0x6D, (byte)0x79,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x02,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x09,
(byte)0x4D, (byte)0x41, (byte)0x58, (byte)0x2E,
(byte)0x4C, (byte)0x4F, (byte)0x43, (byte)0x41,
(byte)0x4C, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x06, (byte)0x6B, (byte)0x72, (byte)0x62,
(byte)0x74, (byte)0x67, (byte)0x74, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x09, (byte)0x4D,
(byte)0x41, (byte)0x58, (byte)0x2E, (byte)0x4C,
(byte)0x4F, (byte)0x43, (byte)0x41, (byte)0x4C,
(byte)0x00, (byte)0x11, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x10, (byte)0x92, (byte)0x1D,
(byte)0x1A, (byte)0x0C, (byte)0x7F, (byte)0xB8,
(byte)0x01, (byte)0x2E, (byte)0xC9, (byte)0xF5,
(byte)0x7B, (byte)0x92, (byte)0x81, (byte)0xCA,
(byte)0x49, (byte)0xC5, (byte)0x4C, (byte)0x73,
(byte)0x30, (byte)0x68, (byte)0x4C, (byte)0x73,
(byte)0x30, (byte)0x68, (byte)0x4C, (byte)0x74,
(byte)0x81, (byte)0xE8, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x40,
(byte)0x41, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x01, (byte)0x29, (byte)0x61,
(byte)0x82, (byte)0x01, (byte)0x25, (byte)0x30,
(byte)0x82, (byte)0x01, (byte)0x21, (byte)0xA0,
(byte)0x03, (byte)0x02, (byte)0x01, (byte)0x05,
(byte)0xA1, (byte)0x0B, (byte)0x1B, (byte)0x09,
(byte)0x4D, (byte)0x41, (byte)0x58, (byte)0x2E,
(byte)0x4C, (byte)0x4F, (byte)0x43, (byte)0x41,
(byte)0x4C, (byte)0xA2, (byte)0x1E, (byte)0x30,
(byte)0x1C, (byte)0xA0, (byte)0x03, (byte)0x02,
(byte)0x01, (byte)0x00, (byte)0xA1, (byte)0x15,
(byte)0x30, (byte)0x13, (byte)0x1B, (byte)0x06,
(byte)0x6B, (byte)0x72, (byte)0x62, (byte)0x74,
(byte)0x67, (byte)0x74, (byte)0x1B, (byte)0x09,
(byte)0x4D, (byte)0x41, (byte)0x58, (byte)0x2E,
(byte)0x4C, (byte)0x4F, (byte)0x43, (byte)0x41,
(byte)0x4C, (byte)0xA3, (byte)0x81, (byte)0xEC,
(byte)0x30, (byte)0x81, (byte)0xE9, (byte)0xA0,
(byte)0x03, (byte)0x02, (byte)0x01, (byte)0x12,
(byte)0xA1, (byte)0x03, (byte)0x02, (byte)0x01,
(byte)0x01, (byte)0xA2, (byte)0x81, (byte)0xDC,
(byte)0x04, (byte)0x81, (byte)0xD9, (byte)0xFB,
(byte)0x4B, (byte)0xD2, (byte)0x55, (byte)0x33,
(byte)0xA8, (byte)0x1A, (byte)0xE6, (byte)0xB5,
(byte)0x3D, (byte)0x67, (byte)0x46, (byte)0x69,
(byte)0x6F, (byte)0x0A, (byte)0x64, (byte)0xE7,
(byte)0x3D, (byte)0xEF, (byte)0x22, (byte)0xBE,
(byte)0x81, (byte)0x32, (byte)0xF3, (byte)0x72,
(byte)0xB4, (byte)0x50, (byte)0xE3, (byte)0xC3,
(byte)0xDB, (byte)0xE5, (byte)0x38, (byte)0x3C,
(byte)0x60, (byte)0xC8, (byte)0x08, (byte)0x53,
(byte)0x44, (byte)0x6F, (byte)0xDF, (byte)0x55,
(byte)0x67, (byte)0x32, (byte)0x02, (byte)0xDD,
(byte)0x6B, (byte)0xFB, (byte)0x23, (byte)0x1A,
(byte)0x88, (byte)0x71, (byte)0xE0, (byte)0xF8,
(byte)0xBB, (byte)0x51, (byte)0x1E, (byte)0x76,
(byte)0xC9, (byte)0x1F, (byte)0x45, (byte)0x9B,
(byte)0xA0, (byte)0xA5, (byte)0x61, (byte)0x45,
(byte)0x9E, (byte)0x65, (byte)0xB8, (byte)0xD6,
(byte)0x0E, (byte)0x3C, (byte)0xD9, (byte)0x56,
(byte)0xD6, (byte)0xA6, (byte)0xDD, (byte)0x36,
(byte)0x21, (byte)0x25, (byte)0x0E, (byte)0xE6,
(byte)0xAD, (byte)0xA0, (byte)0x3A, (byte)0x9B,
(byte)0x21, (byte)0x87, (byte)0xE2, (byte)0xAF,
(byte)0x3A, (byte)0xEF, (byte)0x75, (byte)0x85,
(byte)0xA8, (byte)0xD7, (byte)0xE5, (byte)0x46,
(byte)0xD8, (byte)0x5C, (byte)0x17, (byte)0x4E,
(byte)0x64, (byte)0x51, (byte)0xDB, (byte)0x38,
(byte)0x8E, (byte)0x6B, (byte)0x02, (byte)0x05,
(byte)0x46, (byte)0x77, (byte)0xD0, (byte)0x75,
(byte)0x8A, (byte)0xE0, (byte)0x42, (byte)0x5E,
(byte)0x8D, (byte)0x49, (byte)0x86, (byte)0xDE,
(byte)0x6C, (byte)0xBC, (byte)0xAF, (byte)0x10,
(byte)0x9A, (byte)0x97, (byte)0x64, (byte)0xA6,
(byte)0xBD, (byte)0xDB, (byte)0x01, (byte)0x40,
(byte)0xA9, (byte)0x3D, (byte)0x74, (byte)0x99,
(byte)0xDC, (byte)0x63, (byte)0x34, (byte)0x40,
(byte)0x31, (byte)0x57, (byte)0xC7, (byte)0x70,
(byte)0x9F, (byte)0xCE, (byte)0xC6, (byte)0x7B,
(byte)0x00, (byte)0x5B, (byte)0x02, (byte)0x5C,
(byte)0xC7, (byte)0x81, (byte)0x40, (byte)0x4D,
(byte)0xA7, (byte)0xB1, (byte)0xD2, (byte)0xEA,
(byte)0x8E, (byte)0xEC, (byte)0xA0, (byte)0xB3,
(byte)0x03, (byte)0x29, (byte)0xB8, (byte)0x44,
(byte)0xD7, (byte)0xA1, (byte)0x2B, (byte)0x37,
(byte)0x9D, (byte)0x19, (byte)0x11, (byte)0x1D,
(byte)0x58, (byte)0xE8, (byte)0x06, (byte)0xE7,
(byte)0x06, (byte)0xE3, (byte)0xF7, (byte)0xEF,
(byte)0x05, (byte)0xA9, (byte)0x05, (byte)0x93,
(byte)0x42, (byte)0x94, (byte)0x5A, (byte)0xD6,
(byte)0xA0, (byte)0x24, (byte)0x3A, (byte)0x52,
(byte)0x92, (byte)0xA3, (byte)0x79, (byte)0x98,
(byte)0x3C, (byte)0x68, (byte)0x55, (byte)0x1B,
(byte)0x6A, (byte)0xC5, (byte)0x83, (byte)0x89,
(byte)0x5A, (byte)0x79, (byte)0x5C, (byte)0x52,
(byte)0xBA, (byte)0xB8, (byte)0xF7, (byte)0x72,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x01,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x01,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x09,
(byte)0x4D, (byte)0x41, (byte)0x58, (byte)0x2E,
(byte)0x4C, (byte)0x4F, (byte)0x43, (byte)0x41,
(byte)0x4C, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x05, (byte)0x64, (byte)0x75, (byte)0x6D,
(byte)0x6D, (byte)0x79, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x03, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x0C, (byte)0x58, (byte)0x2D,
(byte)0x43, (byte)0x41, (byte)0x43, (byte)0x48,
(byte)0x45, (byte)0x43, (byte)0x4F, (byte)0x4E,
(byte)0x46, (byte)0x3A, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x15, (byte)0x6B, (byte)0x72,
(byte)0x62, (byte)0x35, (byte)0x5F, (byte)0x63,
(byte)0x63, (byte)0x61, (byte)0x63, (byte)0x68,
(byte)0x65, (byte)0x5F, (byte)0x63, (byte)0x6F,
(byte)0x6E, (byte)0x66, (byte)0x5F, (byte)0x64,
(byte)0x61, (byte)0x74, (byte)0x61, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x0A, (byte)0x66,
(byte)0x61, (byte)0x73, (byte)0x74, (byte)0x5F,
(byte)0x61, (byte)0x76, (byte)0x61, (byte)0x69,
(byte)0x6C, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x1A, (byte)0x6B, (byte)0x72, (byte)0x62,
(byte)0x74, (byte)0x67, (byte)0x74, (byte)0x2F,
(byte)0x4D, (byte)0x41, (byte)0x58, (byte)0x2E,
(byte)0x4C, (byte)0x4F, (byte)0x43, (byte)0x41,
(byte)0x4C, (byte)0x40, (byte)0x4D, (byte)0x41,
(byte)0x58, (byte)0x2E, (byte)0x4C, (byte)0x4F,
(byte)0x43, (byte)0x41, (byte)0x4C, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x03, (byte)0x79, (byte)0x65,
(byte)0x73, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00,
};
File f = File.createTempFile("ccache", "cc", new File("."));
FileOutputStream fout = new FileOutputStream(f);
fout.write(krb5cc);
fout.close();
CredentialsCache cc = CredentialsCache.getInstance(f.getPath());
if (!cc.getDefaultCreds().getServicePrincipal().getNameStrings()[0]
.equals("krbtgt")) {
throw new Exception("No TGT found");
}
}
}
#
# Copyright (c) 2010, 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 7002036
# @summary ktab return code changes on a error case
# @run shell ktarg.sh
#
if [ "${TESTJAVA}" = "" ] ; then
JAVAC_CMD=`which javac`
TESTJAVA=`dirname $JAVAC_CMD`/..
fi
if [ "${TESTSRC}" = "" ] ; then
TESTSRC="."
fi
OS=`uname -s`
case "$OS" in
CYGWIN* )
FS="/"
;;
Windows_* )
FS="\\"
;;
* )
FS="/"
echo "Unsupported system!"
exit 0;
;;
esac
KEYTAB=ktarg.tmp
rm $KEYTAB 2> /dev/null
KTAB="${TESTJAVA}${FS}bin${FS}ktab -k $KEYTAB"
$KTAB -a me mine || exit 1
$KTAB -hello
if [ $? = 0 ]; then exit 2; fi
$KTAB
if [ $? = 0 ]; then exit 3; fi
exit 0
/*
* Copyright (c) 2010, 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 6687725
* @summary Test internal PKCS5Padding impl with various error conditions.
* @author Valerie Peng
* @library ..
*/
import java.io.*;
import java.nio.*;
import java.util.*;
import java.security.*;
import java.security.spec.AlgorithmParameterSpec;
import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
public class TestPKCS5PaddingError extends PKCS11Test {
private static class CI { // class for holding Cipher Information
String transformation;
String keyAlgo;
CI(String transformation, String keyAlgo) {
this.transformation = transformation;
this.keyAlgo = keyAlgo;
}
}
private static final CI[] TEST_LIST = {
// algorithms which use the native padding impl
new CI("DES/CBC/PKCS5Padding", "DES"),
new CI("DESede/CBC/PKCS5Padding", "DESede"),
new CI("AES/CBC/PKCS5Padding", "AES"),
// algorithms which use SunPKCS11's own padding impl
new CI("DES/ECB/PKCS5Padding", "DES"),
new CI("DESede/ECB/PKCS5Padding", "DESede"),
new CI("AES/ECB/PKCS5Padding", "AES"),
};
private static StringBuffer debugBuf = new StringBuffer();
public void main(Provider p) throws Exception {
boolean status = true;
Random random = new Random();
try {
byte[] plainText = new byte[200];
for (int i = 0; i < TEST_LIST.length; i++) {
CI currTest = TEST_LIST[i];
System.out.println("===" + currTest.transformation + "===");
try {
KeyGenerator kg =
KeyGenerator.getInstance(currTest.keyAlgo, p);
SecretKey key = kg.generateKey();
Cipher c1 = Cipher.getInstance(currTest.transformation,
"SunJCE");
c1.init(Cipher.ENCRYPT_MODE, key);
byte[] cipherText = c1.doFinal(plainText);
AlgorithmParameters params = c1.getParameters();
Cipher c2 = Cipher.getInstance(currTest.transformation, p);
c2.init(Cipher.DECRYPT_MODE, key, params);
// 1st test: wrong output length
// NOTE: Skip NSS since it reports CKR_DEVICE_ERROR when
// the data passed to its EncryptUpdate/DecryptUpdate is
// not multiple of blocks
if (!p.getName().equals("SunPKCS11-NSS")) {
try {
System.out.println("Testing with wrong cipherText length");
c2.doFinal(cipherText, 0, cipherText.length - 2);
} catch (IllegalBlockSizeException ibe) {
// expected
} catch (Exception ex) {
System.out.println("Error: Unexpected Ex " + ex);
ex.printStackTrace();
}
}
// 2nd test: wrong padding value
try {
System.out.println("Testing with wrong padding bytes");
cipherText[cipherText.length - 1]++;
c2.doFinal(cipherText);
} catch (BadPaddingException bpe) {
// expected
} catch (Exception ex) {
System.out.println("Error: Unexpected Ex " + ex);
ex.printStackTrace();
}
System.out.println("DONE");
} catch (NoSuchAlgorithmException nsae) {
System.out.println("Skipping unsupported algorithm: " +
nsae);
}
}
} catch (Exception ex) {
// print out debug info when exception is encountered
if (debugBuf != null) {
System.out.println(debugBuf.toString());
debugBuf = new StringBuffer();
}
throw ex;
}
}
public static void main(String[] args) throws Exception {
main(new TestPKCS5PaddingError());
}
}
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
/** /**
* @test * @test
* @bug 4917233 6461727 6490213 * @bug 4917233 6461727 6490213 6720456
* @summary test the KeyGenerator * @summary test the KeyGenerator
* @author Andreas Sterbenz * @author Andreas Sterbenz
* @library .. * @library ..
...@@ -104,7 +104,7 @@ public class TestKeyGenerator extends PKCS11Test { ...@@ -104,7 +104,7 @@ public class TestKeyGenerator extends PKCS11Test {
// Different PKCS11 impls have different ranges // Different PKCS11 impls have different ranges
// of supported key sizes for variable-key-length // of supported key sizes for variable-key-length
// algorithms. // algorithms.
// Solaris> Blowfish: 32-128 bits, RC4: 8-128 bits // Solaris> Blowfish: 32-128 or even 448 bits, RC4: 8-128 bits or as much as 2048 bits
// NSS> Blowfish: n/a, RC4: 8-2048 bits // NSS> Blowfish: n/a, RC4: 8-2048 bits
// However, we explicitly disallowed key sizes less // However, we explicitly disallowed key sizes less
// than 40-bits. // than 40-bits.
...@@ -114,8 +114,8 @@ public class TestKeyGenerator extends PKCS11Test { ...@@ -114,8 +114,8 @@ public class TestKeyGenerator extends PKCS11Test {
test("Blowfish", 32, p, TestResult.FAIL); test("Blowfish", 32, p, TestResult.FAIL);
test("Blowfish", 40, p, TestResult.PASS); test("Blowfish", 40, p, TestResult.PASS);
test("Blowfish", 128, p, TestResult.PASS); test("Blowfish", 128, p, TestResult.PASS);
test("Blowfish", 136, p, TestResult.FAIL); test("Blowfish", 136, p, TestResult.TBD);
test("Blowfish", 448, p, TestResult.FAIL); test("Blowfish", 448, p, TestResult.TBD);
test("Blowfish", 456, p, TestResult.FAIL); test("Blowfish", 456, p, TestResult.FAIL);
test("ARCFOUR", 0, p, TestResult.FAIL); test("ARCFOUR", 0, p, TestResult.FAIL);
...@@ -124,7 +124,7 @@ public class TestKeyGenerator extends PKCS11Test { ...@@ -124,7 +124,7 @@ public class TestKeyGenerator extends PKCS11Test {
test("ARCFOUR", 128, p, TestResult.PASS); test("ARCFOUR", 128, p, TestResult.PASS);
if (p.getName().equals("SunPKCS11-Solaris")) { if (p.getName().equals("SunPKCS11-Solaris")) {
test("ARCFOUR", 1024, p, TestResult.FAIL); test("ARCFOUR", 1024, p, TestResult.TBD);
} else if (p.getName().equals("SunPKCS11-NSS")) { } else if (p.getName().equals("SunPKCS11-NSS")) {
test("ARCFOUR", 1024, p, TestResult.PASS); test("ARCFOUR", 1024, p, TestResult.PASS);
test("ARCFOUR", 2048, p, TestResult.PASS); test("ARCFOUR", 2048, p, TestResult.PASS);
......
/*
* Copyright (c) 2010, 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.io.File;
import java.io.IOException;
/*
* @test
* @bug 6994753
* @summary tests -XshowSettings options
* @compile -XDignore.symbol.file Settings.java TestHelper.java
* @run main Settings
* @author ksrini
*/
public class Settings {
private static File testJar = null;
static void init() throws IOException {
if (testJar != null) {
return;
}
testJar = new File("test.jar");
StringBuilder tsrc = new StringBuilder();
tsrc.append("public static void main(String... args) {\n");
tsrc.append(" for (String x : args) {\n");
tsrc.append(" System.out.println(x);\n");
tsrc.append(" }\n");
tsrc.append("}\n");
TestHelper.createJar(testJar, tsrc.toString());
}
static void checkContains(TestHelper.TestResult tr, String str) {
if (!tr.contains(str)) {
System.out.println(tr);
throw new RuntimeException(str + " not found");
}
}
static void checkNoContains(TestHelper.TestResult tr, String str) {
if (tr.contains(str)) {
System.out.println(tr.status);
throw new RuntimeException(str + " found");
}
}
private static final String VM_SETTINGS = "VM settings:";
private static final String PROP_SETTINGS = "Property settings:";
private static final String LOCALE_SETTINGS = "Locale settings:";
static void containsAllOptions(TestHelper.TestResult tr) {
checkContains(tr, VM_SETTINGS);
checkContains(tr, PROP_SETTINGS);
checkContains(tr, LOCALE_SETTINGS);
}
static void runTestOptionDefault() throws IOException {
TestHelper.TestResult tr = null;
tr = TestHelper.doExec(TestHelper.javaCmd, "-Xmx512m", "-Xss128k",
"-XshowSettings", "-jar", testJar.getAbsolutePath());
containsAllOptions(tr);
if (!tr.isOK()) {
System.out.println(tr.status);
throw new RuntimeException("test fails");
}
}
static void runTestOptionAll() throws IOException {
init();
TestHelper.TestResult tr = null;
tr = TestHelper.doExec(TestHelper.javaCmd, "-XshowSettings:all");
containsAllOptions(tr);
}
static void runTestOptionVM() throws IOException {
TestHelper.TestResult tr = null;
tr = TestHelper.doExec(TestHelper.javaCmd, "-XshowSettings:vm");
checkContains(tr, VM_SETTINGS);
checkNoContains(tr, PROP_SETTINGS);
checkNoContains(tr, LOCALE_SETTINGS);
}
static void runTestOptionProperty() throws IOException {
TestHelper.TestResult tr = null;
tr = TestHelper.doExec(TestHelper.javaCmd, "-XshowSettings:properties");
checkNoContains(tr, VM_SETTINGS);
checkContains(tr, PROP_SETTINGS);
checkNoContains(tr, LOCALE_SETTINGS);
}
static void runTestOptionLocale() throws IOException {
TestHelper.TestResult tr = null;
tr = TestHelper.doExec(TestHelper.javaCmd, "-XshowSettings:locale");
checkNoContains(tr, VM_SETTINGS);
checkNoContains(tr, PROP_SETTINGS);
checkContains(tr, LOCALE_SETTINGS);
}
static void runTestBadOptions() throws IOException {
TestHelper.TestResult tr = null;
tr = TestHelper.doExec(TestHelper.javaCmd, "-XshowSettingsBadOption");
checkNoContains(tr, VM_SETTINGS);
checkNoContains(tr, PROP_SETTINGS);
checkNoContains(tr, LOCALE_SETTINGS);
checkContains(tr, "Unrecognized option: -XshowSettingsBadOption");
}
public static void main(String... args) {
try {
runTestOptionAll();
runTestOptionDefault();
runTestOptionVM();
runTestOptionProperty();
runTestOptionLocale();
runTestBadOptions();
} catch (IOException ioe) {
throw new RuntimeException(ioe);
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册