summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXerxes Rånby <xerxes@zafena.se>2010-07-19 11:24:11 +0200
committerXerxes Rånby <xerxes@zafena.se>2010-07-19 11:31:44 +0200
commit6916986de6c0a24ec23fa7b18dd01e25f7f269a0 (patch)
tree4d2904fa7109ec99b2b45e43de05b06f269a36ae
parentf73986f74c7fa3c8a81aa5b43eaed429850d410a (diff)
openjdk-6-6b18: add pre1.8.1 releasebranch fixes up to 13 Jul 2010.
fixes origin from http://icedtea.classpath.org/hg/release/icedtea6-1.8/shortlog
-rw-r--r--recipes/openjdk/openjdk-6-6b18-1.8/icedtea1.8-pre1.8.1-releasebranch-fixes.patch3430
-rw-r--r--recipes/openjdk/openjdk-6-release-6b18.inc1
-rw-r--r--recipes/openjdk/openjdk-6_6b18-1.8.bb2
3 files changed, 3432 insertions, 1 deletions
diff --git a/recipes/openjdk/openjdk-6-6b18-1.8/icedtea1.8-pre1.8.1-releasebranch-fixes.patch b/recipes/openjdk/openjdk-6-6b18-1.8/icedtea1.8-pre1.8.1-releasebranch-fixes.patch
new file mode 100644
index 0000000000..96f00c9f39
--- /dev/null
+++ b/recipes/openjdk/openjdk-6-6b18-1.8/icedtea1.8-pre1.8.1-releasebranch-fixes.patch
@@ -0,0 +1,3430 @@
+diff -r a0120629678b ChangeLog
+--- a/ChangeLog Wed Apr 14 12:21:03 2010 +0200
++++ b/ChangeLog Fri Jul 16 14:30:37 2010 +0200
+@@ -1,3 +1,227 @@
++2010-07-13 Mark Wielaard <mjw@redhat.com>
++
++ Reported by William Cohen <wcohen@redhat.com>
++ * tapset/hotspot.stp.in (object_alloc): size is arg4, not arg3.
++
++2010-07-14 Deepak Bhole <dbhole@redhat.com>
++
++ * plugin/icedteanp/java/sun/applet/PluginMessageConsumer.java: Add a new
++ processedIds list to track which instances have been instantiated.
++ (okToProcess): Register width as priority only after handle is acquired.
++ Process resize messages only after tag and handle are processed.
++ (notifyWorkerIsFree): Add instance id to processedIds list if the worked
++ being free'd is an init worker.
++ (getFreeWorker): Create new normal worked only if worker count is less
++ than MAX_WORKERS - PRIORITY_WORKERS.
++ (dumpWorkerStatus): New method. Useful when debugging -- prints status of
++ all workers.
++ * plugin/icedteanp/java/sun/applet/PluginMessageHandlerWorker.java
++ (toString): New method. Returns the string representation of the worker
++ instance at call time.
++
++2010-07-13 Matthias Klose <doko@ubuntu.com>
++
++ * acinclude.m4 (IT_CHECK_PLUGIN_DEPENDENCIES): Don't require libxul
++ libraries.
++ (IT_CHECK_XULRUNNER_VERSION): Use pkgconfig --modversion as version.
++
++2010-07-13 Deepak Bhole <dbhole@redhat.com>
++
++ * plugin/icedteanp/IcedTeaJavaRequestProcessor.h: Set timeout to 120
++ seconds (previous commit mistakenly changed it to 10).
++ * plugin/icedteanp/IcedTeaPluginUtils.h: Print debug info only in debug
++ mode.
++
++2010-06-14 Deepak Bhole <dbhole@redhat.com>
++
++ * plugin/icedteanp/IcedTeaJavaRequestProcessor.cc: Use variadic macro
++ for debug message printing.
++ * plugin/icedteanp/IcedTeaJavaRequestProcessor.h: Same.
++ * plugin/icedteanp/IcedTeaNPPlugin.cc: Same.
++ * plugin/icedteanp/IcedTeaPluginRequestProcessor.cc: Same.
++ * plugin/icedteanp/IcedTeaPluginUtils.cc: Same.
++ * plugin/icedteanp/IcedTeaPluginUtils.h: Same.
++ * plugin/icedteanp/IcedTeaScriptablePluginObject.cc: Same.
++
++2010-07-12 Jon VanAlten <jon.vanalten@redhat.com>
++ * pulseaudio/src/java/org/classpath/icedtea/pulseaudio/PulseAudioDataLine.java
++ * pulseaudio/src/java/org/classpath/icedtea/pulseaudio/PulseAudioLine.java
++ * pulseaudio/src/java/org/classpath/icedtea/pulseaudio/PulseAudioSourceDataLine.java
++ * pulseaudio/src/java/org/classpath/icedtea/pulseaudio/PulseAudioTargetDataLine.java:
++ Eliminate spurious exception throwing from open, close, read, write,
++ drain, and flush calls on closed lines.
++ Use isOpen() API call instead of instance variable where appropriate.
++
++2010-07-08 Man Lung Wong <mwong@redhat.com>
++
++ * netx/net/sourceforge/jnlp/Parser.java:
++ (getRootNode): Used BufferedInputStream instead of InputStream to
++ have mark and reset method available. Passed the encoding to the
++ constructor of InputStreamReader, such that the stream will now
++ be parsed with the encoding the jnlp file is in.
++ (getEncoding): A new method which checks the first four bytes of input
++ and determines what the files encoding is.
++
++2010-06-24 Omair Majid <omajid@redhat.com>
++
++ * netx/net/sourceforge/jnlp/SecurityDesc.java: Fix comments.
++ * netx/net/sourceforge/jnlp/JNLPClassLoader.java
++ (activateJars): Always call activateNative.
++ (activateNative): Search for native code anywhere in the jar.
++
++2010-06-29 Omair Majid <omajid@redhat.com>
++
++ * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java
++ nativeDirectories: New variable. Contains a list of directories that
++ contain native libraries.
++ (getInstance): Tell other classloaders about the native directory.
++ (getNativeDir): Add the new native directory to nativeDirectories.
++ (addNativeDirectory): New function.
++ (getNativeDirectories): New function.
++ (findLibrary): Look in all the native directories for the native library.
++
++2010-06-29 Omair Majid <omajid@redhat.com>
++
++ * netx/net/sourceforge/jnlp/services/XSingleInstanceService.java
++ (startListeningServer): Mark the thread as a daemon so the JVM can
++ shutdown if there are no other non-daemon thread running.
++
++2010-06-29 Omair Majid <omajid@redhat.com>
++
++ * netx/net/sourceforge/jnlp/cache/CacheUtil.java
++ (urlToPath): Call FileUtils.sanitizePath.
++ (fixPath): Moved to...
++ * netx/net/sourceforge/jnlp/util/FileUtils.java
++ (sanitizePath): New function. Moved from CacheUtil.java
++ (sanitizeFileName): Use a blacklisting approach rather than a whitelisting
++ approach: should work better with non ascii filenames.
++
++2010-07-08 Omair Majid <omajid@redhat.com>
++
++ * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java:
++ (reFrame): Pass the panel to the constructor, dont set it yourself.
++ (PluginAppletViewer): Set the panel to be the passed in object and only
++ then add it to the list of all panels.
++
++2010-07-08 Omair Majid <omajid@redhat.com>
++
++ PR icedtea/460
++ * plugin/icedteanp/java/netscape/security/ForbiddenTargetException.java:
++ New file. Some applets, for legacy support, expect this class to be
++ present.
++
++2010-06-14 Andrew John Hughes <ahughes@redhat.com>
++
++ Don't print out the return value of pthread_self
++ which is a pthread_t. pthread_t is an opaque type
++ and we don't know what it actually is (it varies
++ from system to system; recent versions of Linux
++ use an unsigned long int).
++ * plugin/icedteanp/IcedTeaPluginUtils.h:
++ (PLUGIN_DEBUG_0ARG(str)): Don't print the thread_t.
++ (PLUGIN_DEBUG_1ARG(str,arg1)): Likewise.
++ (PLUGIN_DEBUG_2ARG(str,arg1,arg2)): Likewise.
++ (PLUGIN_DEBUG_3ARG(str,arg1,arg2,arg3)): Likewise.
++ (PLUGIN_DEBUG_4ARG(str,arg1,arg2,arg3,arg4)): Likewise.
++ (PLUGIN_DEBUG_5ARG(str,arg1,arg2,arg3,arg4,arg5)): Likewise.
++
++2010-06-14 Deepak Bhole <dbhole@redhat.com>
++
++ * plugin/icedteanp/java/sun/applet/PluginMessageConsumer.java: Fix bug
++ causing 100% CPU usage (rhbz# 592553).
++
++2010-06-14 Omair Majid <omajid@redhat.com>
++
++ PR icedtea/488
++ * plugin/icedteanp/IcedTeaPluginUtils.h: Bug #488. Fix bug due to
++ incorrect assumption that 'A' > 'a'.
++
++2010-06-14 Omair Majid <omajid@redhat.com>
++
++ PR icedtea/480
++ * plugin/icedteanp/IcedTeaNPPlugin.cc: Use getproperty NPAPI call instead
++ of evaluate, to get page URL.
++
++2010-05-07 Deepak Bhole <dbhole@redhat.com>
++
++ PR icedtea/436:
++ * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java
++ (handleMessage): Don't print stack trace on InterruptedException.
++ (appletClose): Kill misbehaving applets that don't shut down properly.
++
++2010-05-07 Deepak Bhole <dbhole@redhat.com>
++
++ * netx/net/sourceforge/jnlp/Launcher.java
++ (setContextClassLoaderForAllThreads): Change to set context CL only for
++ given threadgroup.
++ (launchApplication): Supply threadgroup to
++ setContextClassLoaderForAllThreads.
++ (createApplet): Same.
++
++2010-05-07 Gary Benson <gbenson@redhat.com>
++
++ * netx/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java:
++ Removed a stray semicolon.
++
++2010-05-06 Deepak Bhole <dbhole@redhat.com>
++
++ * netx/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java:
++ Add imports missed in last commit.
++
++2010-05-06 Deepak Bhole <dbhole@redhat.com>
++
++ * rt/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java
++ (checkPermission): Allow Runtime and Security permission (for
++ putProvider.SunJCE) if initiated for an https connection.
++ (inTrustedCallChain): New method. Returns if given class/method is
++ in the call chain, and everything upto there is trusted.
++
++2010-05-05 Gary Benson <gbenson@redhat.com>
++
++ PR icedtea/481
++ * ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.cpp
++ (SharkTopLevelBlock::improve_virtual_call): Disable an
++ optimization that cannot currently be supported.
++
++2010-04-30 Gary Benson <gbenson@redhat.com>
++
++ PR icedtea/324
++ * ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.cpp
++ (SharkTopLevelBlock::do_aload): Cope with cases where
++ the array's type is unknown.
++ (SharkTopLevelBlock::do_astore): Likewise.
++
++2010-04-28 Andrew John Hughes <ahughes@redhat.com>
++
++ PR icedtea/476
++ * Makefile.am:
++ Add patch when SystemTap is enabled to support
++ building with GCC 4.5.
++ * patches/systemtap-gcc-4.5.patch:
++ Add cast to NULL (doesn't apply to DTrace due
++ to differences between SystemTap and DTrace macros).
++
++2010-04-24 Matthias Klose <doko@ubuntu.com>
++
++ * Makefile.am (check-langtools, check-jdk): Allow overwriting -samevm
++ with the environment variable ICEDTEA_JTREG_OTHERVM.
++
++2010-04-22 Xerxes Rånby <xerxes@zafena.se>
++
++ * ports/hotspot/src/share/vm/shark/sharkNativeWrapper.cpp
++ (SharkNativeWrapper::initialize): Shark calling static jni
++ methods jclass argument fix.
++
++2010-04-04 Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
++
++ * acinclude.m4 (IT_SET_ARCH_SETTINGS): Fix Hitachi SH settings.
++
++2010-04-21 Deepak Bhole <dbhole@redhat.com>
++
++ * plugin/icedteanp/IcedTeaNPPlugin.cc
++ (plugin_filter_environment): Increment malloc size by one to account for
++ NULL terminator. Bug# 474.
++
+ 2010-04-12 Andrew John Hughes <ahughes@redhat.com>
+
+ PR icedtea/373
+diff -r a0120629678b Makefile.am
+--- a/Makefile.am Wed Apr 14 12:21:03 2010 +0200
++++ b/Makefile.am Fri Jul 16 14:30:37 2010 +0200
+@@ -374,7 +374,8 @@
+ endif
+
+ if ENABLE_SYSTEMTAP
+-ICEDTEA_PATCHES += patches/icedtea-systemtap.patch
++ICEDTEA_PATCHES += patches/icedtea-systemtap.patch \
++ patches/systemtap-gcc-4.5.patch
+ endif
+
+ if ENABLE_NSS
+@@ -2024,7 +2025,8 @@
+ mkdir -p test/langtools/JTwork test/langtools/JTreport
+ $(ICEDTEA_BOOT_DIR)/bin/java -jar test/jtreg.jar -v1 -a -ignore:quiet \
+ -w:test/langtools/JTwork -r:test/langtools/JTreport \
+- -s -jdk:`pwd`/$(BUILD_OUTPUT_DIR)/j2sdk-image \
++ $${ICEDTEA_JTREG_OTHERVM:--samevm} \
++ -jdk:`pwd`/$(BUILD_OUTPUT_DIR)/j2sdk-image \
+ $(ICEDTEA_JTREG_OPTIONS) \
+ `pwd`/openjdk/langtools/test \
+ | tee test/$@.log
+@@ -2033,7 +2035,8 @@
+ mkdir -p test/jdk/JTwork test/jdk/JTreport
+ $(ICEDTEA_BOOT_DIR)/bin/java -jar test/jtreg.jar -v1 -a -ignore:quiet \
+ -w:test/jdk/JTwork -r:test/jdk/JTreport \
+- -s -jdk:`pwd`/$(BUILD_OUTPUT_DIR)/j2sdk-image \
++ $${ICEDTEA_JTREG_OTHERVM:--samevm} \
++ -jdk:`pwd`/$(BUILD_OUTPUT_DIR)/j2sdk-image \
+ -exclude:$(abs_top_srcdir)/test/jtreg/excludelist.jdk.jtx \
+ $(ICEDTEA_JTREG_OPTIONS) \
+ `pwd`/openjdk/jdk/test \
+diff -r a0120629678b acinclude.m4
+--- a/acinclude.m4 Wed Apr 14 12:21:03 2010 +0200
++++ b/acinclude.m4 Fri Jul 16 14:30:37 2010 +0200
+@@ -85,7 +85,7 @@
+ CROSS_TARGET_ARCH=s390x
+ ARCHFLAG="-m64"
+ ;;
+- sh*-*-*)
++ sh*)
+ BUILD_ARCH_DIR=sh
+ INSTALL_ARCH_DIR=sh
+ JRE_ARCH_DIR=sh
+@@ -1461,15 +1461,7 @@
+ AC_SUBST(GTK_CFLAGS)
+ AC_SUBST(GTK_LIBS)
+
+-
+- if $PKG_CONFIG --atleast-version 1.9.2 libxul 2>&AS_MESSAGE_LOG_FD ; then
+- xullibs=libxul
+- else
+- xullibs="libxul libxul-unstable"
+- fi
+-
+- PKG_CHECK_MODULES(MOZILLA, \
+- mozilla-plugin ${xullibs})
++ PKG_CHECK_MODULES(MOZILLA, mozilla-plugin)
+
+ AC_SUBST(MOZILLA_CFLAGS)
+ AC_SUBST(MOZILLA_LIBS)
+@@ -1482,52 +1474,13 @@
+ AC_REQUIRE([IT_CHECK_PLUGIN_DEPENDENCIES])
+ if test "x${enable_plugin}" = "xyes"
+ then
+- AC_LANG_PUSH([C++])
+- OLDCPPFLAGS="$CPPFLAGS"
+- CPPFLAGS="$CPPFLAGS $MOZILLA_CFLAGS"
+-
+- AC_CACHE_CHECK([for xulrunner version], [xulrunner_cv_collapsed_version],
+- [AC_RUN_IFELSE(
+- [AC_LANG_PROGRAM([[
+-#include <mozilla-config.h>
+-#include <math.h>
+-#include <string.h>
+-#include <stdlib.h>
+-#include <stdio.h>
+-]],[[
+-int version = 0;
+-const char* token = NULL;
+-int power=6;
+-FILE *datafile;
+-
+-datafile = fopen ("conftest.vdata", "w");
+-if (!datafile) return 1;
+-
+-// 32 chars is more than enough to hold version
+-char* mozilla_version = (char*) malloc(32*sizeof(char));
+-snprintf(mozilla_version, 32, "%s", MOZILLA_VERSION);
+-
+-token = strtok(mozilla_version, ".");
+-while (token)
+-{
+- version += atoi(token)*(pow(10, power));
+- power -=2;
+- token = strtok(NULL, ".");
+-}
+-
+-fprintf (datafile, "%d\n", version);
+-free(mozilla_version);
+-if (fclose(datafile)) return 1;
+-
+-return EXIT_SUCCESS;
+-]])],
+- [xulrunner_cv_collapsed_version="$(cat conftest.vdata)"],
+- [AC_MSG_FAILURE([cannot determine xulrunner version])])],
+- [xulrunner_cv_collapsed_version="190000"])
+-
+- CPPFLAGS="$OLDCPPFLAGS"
+- AC_LANG_POP([C++])
+-
++ AC_CACHE_CHECK([for xulrunner version], [xulrunner_cv_collapsed_version],[
++ if pkg-config --modversion libxul >/dev/null 2>&1
++ then
++ xulrunner_cv_collapsed_version=`pkg-config --modversion libxul | awk -F. '{power=6; v=0; for (i=1; i <= NF; i++) {v += $i * 10 ^ power; power -=2}; print v}'`
++ else
++ AC_MSG_FAILURE([cannot determine xulrunner version])
++ fi])
+ AC_SUBST(MOZILLA_VERSION_COLLAPSED, $xulrunner_cv_collapsed_version)
+ fi
+ ])
+diff -r a0120629678b netx/net/sourceforge/jnlp/Launcher.java
+--- a/netx/net/sourceforge/jnlp/Launcher.java Wed Apr 14 12:21:03 2010 +0200
++++ b/netx/net/sourceforge/jnlp/Launcher.java Fri Jul 16 14:30:37 2010 +0200
+@@ -442,7 +442,7 @@
+ Method main = mainClass.getDeclaredMethod("main", new Class[] {String[].class} );
+ String args[] = file.getApplication().getArguments();
+
+- setContextClassLoaderForAllThreads(app.getClassLoader());
++ setContextClassLoaderForAllThreads(app.getThreadGroup(), app.getClassLoader());
+
+ if (splashScreen != null) {
+ if (splashScreen.isSplashScreenValid()) {
+@@ -464,30 +464,24 @@
+ }
+
+ /**
+- * Set the classloader as the context classloader for all threads. This is
+- * required to make some applications work. For example, an application that
+- * provides a custom Swing LnF may ask the swing thread to load resources
+- * from their JNLP, which would only work if the Swing thread knows about
+- * the JNLPClassLoader.
++ * Set the classloader as the context classloader for all threads in
++ * the given threadgroup. This is required to make some applications
++ * work. For example, an application that provides a custom Swing LnF
++ * may ask the swing thread to load resources from their JNLP, which
++ * would only work if the Swing thread knows about the JNLPClassLoader.
+ *
++ * @param tg The threadgroup for which the context classloader should be set
+ * @param classLoader the classloader to set as the context classloader
+ */
+- private void setContextClassLoaderForAllThreads(ClassLoader classLoader) {
+- ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
+- ThreadGroup root;
+-
+- root = Thread.currentThread().getThreadGroup();
+- while (root.getParent() != null) {
+- root = root.getParent();
+- }
++ private void setContextClassLoaderForAllThreads(ThreadGroup tg, ClassLoader classLoader) {
+
+ /* be prepared for change in thread size */
+- int threadCountGuess = threadBean.getThreadCount();
++ int threadCountGuess = tg.activeCount();
+ Thread[] threads;
+ do {
+ threadCountGuess = threadCountGuess * 2;
+ threads = new Thread[threadCountGuess];
+- root.enumerate(threads, true);
++ tg.enumerate(threads, true);
+ } while (threads[threadCountGuess-1] != null);
+
+
+@@ -595,7 +589,7 @@
+ group.setApplication(appletInstance);
+ loader.setApplication(appletInstance);
+
+- setContextClassLoaderForAllThreads(appletInstance.getClassLoader());
++ setContextClassLoaderForAllThreads(appletInstance.getThreadGroup(), appletInstance.getClassLoader());
+
+ return appletInstance;
+ }
+diff -r a0120629678b netx/net/sourceforge/jnlp/Parser.java
+--- a/netx/net/sourceforge/jnlp/Parser.java Wed Apr 14 12:21:03 2010 +0200
++++ b/netx/net/sourceforge/jnlp/Parser.java Fri Jul 16 14:30:37 2010 +0200
+@@ -1169,11 +1169,15 @@
+ Node jnlpNode = getChildNode(document, "jnlp"); // skip comments
+ */
+
++ //A BufferedInputStream is used to allow marking and reseting
++ //of a stream.
++ BufferedInputStream bs = new BufferedInputStream(input);
++
+ /* NANO */
+ final XMLElement xml = new XMLElement();
+ final PipedInputStream pin = new PipedInputStream();
+ final PipedOutputStream pout = new PipedOutputStream(pin);
+- final InputStreamReader isr = new InputStreamReader(input);
++ final InputStreamReader isr = new InputStreamReader(bs, getEncoding(bs));
+ // Clean the jnlp xml file of all comments before passing
+ // it to the parser.
+ new Thread(
+@@ -1196,7 +1200,69 @@
+ throw new ParseException(R("PBadXML"), ex);
+ }
+ }
++
++ /**
++ * Returns the name of the encoding used in this InputStream.
++ *
++ * @param input the InputStream
++ * @return a String representation of encoding
++ */
++ private static String getEncoding(InputStream input) throws IOException{
++ //Fixme: This only recognizes UTF-8, UTF-16, and
++ //UTF-32, which is enough to parse the prolog portion of xml to
++ //find out the exact encoding (if it exists). The reason being
++ //there could be other encodings, such as ISO 8859 which is 8-bits
++ //but it supports latin characters.
++ //So what needs to be done is to parse the prolog and retrieve
++ //the exact encoding from it.
+
++ int[] s = new int[4];
++ String encoding = "UTF-8";
++
++ //Determine what the first four bytes are and store
++ //them into an int array.
++ input.mark(4);
++ for (int i = 0; i < 4; i++) {
++ s[i] = input.read();
++ }
++ input.reset();
++
++ //Set the encoding base on what the first four bytes of the
++ //inputstream turn out to be (following the information from
++ //www.w3.org/TR/REC-xml/#sec-guessing).
++ if (s[0] == 255) {
++ if (s[1] == 254) {
++ if (s[2] != 0 || s[3] != 0) {
++ encoding = "UnicodeLittle";
++ } else {
++ encoding = "X-UTF-32LE-BOM";
++ }
++ }
++ } else if (s[0] == 254 && s[1] == 255 && (s[2] != 0 ||
++ s[3] != 0)) {
++ encoding = "UTF-16";
++
++ } else if (s[0] == 0 && s[1] == 0 && s[2] == 254 &&
++ s[3] == 255) {
++ encoding = "X-UTF-32BE-BOM";
++
++ } else if (s[0] == 0 && s[1] == 0 && s[2] == 0 &&
++ s[3] == 60) {
++ encoding = "UTF-32BE";
++
++ } else if (s[0] == 60 && s[1] == 0 && s[2] == 0 &&
++ s[3] == 0) {
++ encoding = "UTF-32LE";
++
++ } else if (s[0] == 0 && s[1] == 60 && s[2] == 0 &&
++ s[3] == 63) {
++ encoding = "UTF-16BE";
++ } else if (s[0] == 60 && s[1] == 0 && s[2] == 63 &&
++ s[3] == 0) {
++ encoding = "UTF-16LE";
++ }
++
++ return encoding;
++ }
+ }
+
+-
+diff -r a0120629678b netx/net/sourceforge/jnlp/SecurityDesc.java
+--- a/netx/net/sourceforge/jnlp/SecurityDesc.java Wed Apr 14 12:21:03 2010 +0200
++++ b/netx/net/sourceforge/jnlp/SecurityDesc.java Fri Jul 16 14:30:37 2010 +0200
+@@ -31,12 +31,9 @@
+ */
+ public class SecurityDesc {
+
+- // todo: make sure classloader's native code support checks
+- // the security permissions
+-
+- // shouldn't need to verify that native code only runs in
+- // trusted environment because the parser and/or classloader
+- // should kick it.
++ /*
++ * We do not verify security here, the classloader deals with security
++ */
+
+ /** All permissions. */
+ public static final Object ALL_PERMISSIONS = "All";
+diff -r a0120629678b netx/net/sourceforge/jnlp/cache/CacheUtil.java
+--- a/netx/net/sourceforge/jnlp/cache/CacheUtil.java Wed Apr 14 12:21:03 2010 +0200
++++ b/netx/net/sourceforge/jnlp/cache/CacheUtil.java Fri Jul 16 14:30:37 2010 +0200
+@@ -26,6 +26,7 @@
+
+ import net.sourceforge.jnlp.*;
+ import net.sourceforge.jnlp.runtime.*;
++import net.sourceforge.jnlp.util.FileUtils;
+
+ /**
+ * Provides static methods to interact with the cache, download
+@@ -300,23 +301,9 @@
+ path.append(File.separatorChar);
+ path.append(location.getPath().replace('/', File.separatorChar));
+
+- return new File(JNLPRuntime.getBaseDir(), fixPath(path.toString()));
++ return new File(JNLPRuntime.getBaseDir(), FileUtils.sanitizePath(path.toString()));
+ }
+
+- /**
+- * Clean up a string by removing characters that can't appear in
+- * a local file name.
+- */
+- private static String fixPath(String path) {
+- char badChars[] = { '\\', '/', ':', '*', '?', '"', '<', '>', '|' };
+-
+- for (int i=0; i < badChars.length; i++)
+- if (badChars[i] != File.separatorChar)
+- if (-1 != path.indexOf(badChars[i]))
+- path = path.replace(badChars[i], 'X');
+-
+- return path;
+- }
+
+ /**
+ * Waits until the resources are downloaded, while showing a
+diff -r a0120629678b netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java
+--- a/netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java Wed Apr 14 12:21:03 2010 +0200
++++ b/netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java Fri Jul 16 14:30:37 2010 +0200
+@@ -32,6 +32,7 @@
+ import java.security.Permissions;
+ import java.security.PrivilegedAction;
+ import java.util.ArrayList;
++import java.util.Collections;
+ import java.util.Enumeration;
+ import java.util.HashMap;
+ import java.util.LinkedList;
+@@ -80,12 +81,12 @@
+ /** map from JNLPFile url to shared classloader */
+ private static Map urlToLoader = new HashMap(); // never garbage collected!
+
+- /** number of times a classloader with native code is created */
+- private static int nativeCounter = 0;
+-
+ /** the directory for native code */
+ private File nativeDir = null; // if set, some native code exists
+
++ /** a list of directories that contain native libraries */
++ private List<File> nativeDirectories = Collections.synchronizedList(new LinkedList<File>());
++
+ /** security context */
+ private AccessControlContext acc = AccessController.getContext();
+
+@@ -240,18 +241,22 @@
+ // loader for this unique key. Check.
+ JNLPClassLoader extLoader = (JNLPClassLoader) urlToLoader.get(uniqueKey);
+
+- if (extLoader != null) {
++ if (extLoader != null && extLoader != loader) {
+ for (URL u : loader.getURLs())
+ extLoader.addURL(u);
++ for (File nativeDirectory: loader.getNativeDirectories())
++ extLoader.addNativeDirectory(nativeDirectory);
+
+ loader = extLoader;
+ }
+
+ // loader is now current + ext. But we also need to think of
+ // the baseLoader
+- if (baseLoader != null) {
++ if (baseLoader != null && baseLoader != loader) {
+ for (URL u : loader.getURLs())
+ baseLoader.addURL(u);
++ for (File nativeDirectory: loader.getNativeDirectories())
++ baseLoader.addNativeDirectory(nativeDirectory);
+
+ loader = baseLoader;
+ }
+@@ -642,8 +647,8 @@
+ ex.printStackTrace();
+ }
+
+- if (jar.isNative())
+- activateNative(jar);
++ // some programs place a native library in any jar
++ activateNative(jar);
+ }
+
+ return null;
+@@ -654,9 +659,9 @@
+ }
+
+ /**
+- * Enable the native code contained in a JAR by copying the
+- * native files into the filesystem. Called in the security
+- * context of the classloader.
++ * Search for and enable any native code contained in a JAR by copying the
++ * native files into the filesystem. Called in the security context of the
++ * classloader.
+ */
+ protected void activateNative(JARDesc jar) {
+ if (JNLPRuntime.isDebug())
+@@ -669,17 +674,33 @@
+ if (nativeDir == null)
+ nativeDir = getNativeDir();
+
++ String[] librarySuffixes = { ".so", ".dylib", ".jnilib", ".framework", ".dll" };
++
+ try {
+ JarFile jarFile = new JarFile(localFile, false);
+- Enumeration entries = jarFile.entries();
++ Enumeration<JarEntry> entries = jarFile.entries();
+
+ while (entries.hasMoreElements()) {
+- JarEntry e = (JarEntry) entries.nextElement();
++ JarEntry e = entries.nextElement();
+
+- if (e.isDirectory() || e.getName().indexOf('/') != -1)
++ if (e.isDirectory()) {
+ continue;
++ }
+
+- File outFile = new File(nativeDir, e.getName());
++ String name = new File(e.getName()).getName();
++ boolean isLibrary = false;
++
++ for (String suffix: librarySuffixes) {
++ if (name.endsWith(suffix)) {
++ isLibrary = true;
++ break;
++ }
++ }
++ if (!isLibrary) {
++ continue;
++ }
++
++ File outFile = new File(nativeDir, name);
+
+ CacheUtil.streamCopy(jarFile.getInputStream(e),
+ new FileOutputStream(outFile));
+@@ -703,29 +724,47 @@
+
+ if (!nativeDir.mkdirs())
+ return null;
+- else
++ else {
++ // add this new native directory to the search path
++ addNativeDirectory(nativeDir);
+ return nativeDir;
++ }
++ }
++
++ /**
++ * Adds the {@link File} to the search path of this {@link JNLPClassLoader}
++ * when trying to find a native library
++ */
++ protected void addNativeDirectory(File nativeDirectory) {
++ nativeDirectories.add(nativeDirectory);
++ }
++
++ /**
++ * Returns a list of all directories in the search path of the current classloader
++ * when it tires to find a native library.
++ * @return a list of directories in the search path for native libraries
++ */
++ protected List<File> getNativeDirectories() {
++ return nativeDirectories;
+ }
+
+ /**
+ * Return the absolute path to the native library.
+ */
+ protected String findLibrary(String lib) {
+- if (nativeDir == null)
+- return null;
+-
+ String syslib = System.mapLibraryName(lib);
+
+- File target = new File(nativeDir, syslib);
+- if (target.exists())
+- return target.toString();
+- else {
+- String result = super.findLibrary(lib);
+- if (result != null)
+- return result;
++ for (File dir: getNativeDirectories()) {
++ File target = new File(dir, syslib);
++ if (target.exists())
++ return target.toString();
++ }
+
+- return findLibraryExt(lib);
+- }
++ String result = super.findLibrary(lib);
++ if (result != null)
++ return result;
++
++ return findLibraryExt(lib);
+ }
+
+ /**
+diff -r a0120629678b netx/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java
+--- a/netx/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java Wed Apr 14 12:21:03 2010 +0200
++++ b/netx/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java Fri Jul 16 14:30:37 2010 +0200
+@@ -23,10 +23,12 @@
+ import java.awt.event.WindowEvent;
+ import java.lang.ref.WeakReference;
+ import java.net.SocketPermission;
++import java.security.AllPermission;
+ import java.security.AccessControlException;
+ import java.security.AccessController;
+ import java.security.Permission;
+ import java.security.PrivilegedAction;
++import java.security.SecurityPermission;
+ import java.util.PropertyPermission;
+
+ import javax.swing.JWindow;
+@@ -395,6 +397,24 @@
+ // Everything else is denied
+ throw se;
+
++ } else if (perm instanceof SecurityPermission) {
++
++ // JCE's initialization requires putProviderProperty permission
++ if (perm.equals(new SecurityPermission("putProviderProperty.SunJCE"))) {
++ if (inTrustedCallChain("com.sun.crypto.provider.SunJCE", "run")) {
++ return;
++ }
++ }
++
++ } else if (perm instanceof RuntimePermission) {
++
++ // KeyGenerator's init method requires internal spec access
++ if (perm.equals(new SecurityPermission("accessClassInPackage.sun.security.internal.spec"))) {
++ if (inTrustedCallChain("javax.crypto.KeyGenerator", "init")) {
++ return;
++ }
++ }
++
+ } else {
+ tmpPerm = perm;
+ }
+@@ -419,6 +439,34 @@
+ }
+ }
+
++ /**
++ * Returns weather the given class and method are in the current stack,
++ * and whether or not everything upto then is trusted
++ *
++ * @param className The name of the class to look for in the stack
++ * @param methodName The name of the method for the given class to look for in the stack
++ * @return Weather or not class::method() are in the chain, and everything upto there is trusted
++ */
++ private boolean inTrustedCallChain(String className, String methodName) {
++
++ StackTraceElement[] stack = Thread.currentThread().getStackTrace();
++
++ for (int i=0; i < stack.length; i++) {
++
++ // Everything up to the desired class/method must be trusted
++ if (!stack[i].getClass().getProtectionDomain().implies(new AllPermission())) {
++ return false;
++ }
++
++ if (stack[i].getClassName().equals(className) &&
++ stack[i].getMethodName().equals(methodName)) {
++ return true;
++ }
++ }
++
++ return false;
++ }
++
+ /**
+ * Asks the user whether or not to grant permission.
+ * @param perm the permission to be granted
+diff -r a0120629678b netx/net/sourceforge/jnlp/services/XSingleInstanceService.java
+--- a/netx/net/sourceforge/jnlp/services/XSingleInstanceService.java Wed Apr 14 12:21:03 2010 +0200
++++ b/netx/net/sourceforge/jnlp/services/XSingleInstanceService.java Fri Jul 16 14:30:37 2010 +0200
+@@ -145,14 +145,21 @@
+ }
+
+ /**
+- * Start the listening server to accept arguments from new isntances of
++ * Start the listening server to accept arguments from new instances of
+ * applications
+ *
+ * @param lockFile
++ * the {@link SingleInstanceLock} that the server should use
+ */
+ private void startListeningServer(SingleInstanceLock lockFile) {
+ SingleInstanceServer server = new SingleInstanceServer(lockFile);
+- new Thread(server).start();
++ Thread serverThread = new Thread(server);
++ /*
++ * mark as daemon so the JVM can shutdown if the server is the only
++ * thread running
++ */
++ serverThread.setDaemon(true);
++ serverThread.start();
+ }
+
+ /**
+diff -r a0120629678b netx/net/sourceforge/jnlp/util/FileUtils.java
+--- a/netx/net/sourceforge/jnlp/util/FileUtils.java Wed Apr 14 12:21:03 2010 +0200
++++ b/netx/net/sourceforge/jnlp/util/FileUtils.java Fri Jul 16 14:30:37 2010 +0200
+@@ -14,35 +14,58 @@
+ // License along with this library; if not, write to the Free Software
+ // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+-
+ package net.sourceforge.jnlp.util;
+
++import java.io.File;
++
+ /**
+- * This class contains a few file-related utility functions.
++ * This class contains a few file-related utility functions.
+ *
+ * @author Omair Majid
+ */
+
+-public class FileUtils {
++public final class FileUtils {
+
+-
++ /**
++ * list of characters not allowed in filenames
++ */
++ private static final char INVALID_CHARS[] = { '\\', '/', ':', '*', '?', '"', '<', '>', '|' };
++
++ private static final char SANITIZED_CHAR = '_';
++
++ /**
++ * Clean up a string by removing characters that can't appear in a local
++ * file name.
++ *
++ * @param path
++ * the path to sanitize
++ * @return a sanitized version of the input which is suitable for using as a
++ * file path
++ */
++ public static String sanitizePath(String path) {
++
++ for (int i = 0; i < INVALID_CHARS.length; i++)
++ if (INVALID_CHARS[i] != File.separatorChar)
++ if (-1 != path.indexOf(INVALID_CHARS[i]))
++ path = path.replace(INVALID_CHARS[i], SANITIZED_CHAR);
++
++ return path;
++ }
++
+ /**
+ * Given an input, return a sanitized form of the input suitable for use as
+ * a file/directory name
+- *
++ *
+ * @param input
+ * @return a sanitized version of the input
+ */
+- public static String sanitizeFileName(String input) {
++ public static String sanitizeFileName(String filename) {
+
+- /*
+- * FIXME
+- *
+- * Assuming safe characters are 'a-z','A-Z','0-9', '_', '.'
+- */
++ for (int i = 0; i < INVALID_CHARS.length; i++)
++ if (-1 != filename.indexOf(INVALID_CHARS[i]))
++ filename = filename.replace(INVALID_CHARS[i], SANITIZED_CHAR);
+
+- String sanitizedName = input.replaceAll("[^a-zA-Z0-9.]", "_");
+- return sanitizedName;
++ return filename;
+ }
+-
++
+ }
+diff -r a0120629678b patches/systemtap-gcc-4.5.patch
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ b/patches/systemtap-gcc-4.5.patch Fri Jul 16 14:30:37 2010 +0200
+@@ -0,0 +1,11 @@
++--- openjdk.orig/hotspot/src/share/vm/prims/jni.cpp 2010-04-28 08:51:29.000000000 +0100
+++++ openjdk/hotspot/src/share/vm/prims/jni.cpp 2010-04-28 09:29:22.000000000 +0100
++@@ -2723,7 +2723,7 @@
++
++ if (!directBufferSupportInitializeEnded) {
++ if (!initializeDirectBufferSupport(env, thread)) {
++- DTRACE_PROBE1(hotspot_jni, NewDirectByteBuffer__return, NULL);
+++ DTRACE_PROBE1(hotspot_jni, NewDirectByteBuffer__return, (uintptr_t) NULL);
++ return NULL;
++ }
++ }
+diff -r a0120629678b plugin/icedteanp/IcedTeaJavaRequestProcessor.cc
+--- a/plugin/icedteanp/IcedTeaJavaRequestProcessor.cc Wed Apr 14 12:21:03 2010 +0200
++++ b/plugin/icedteanp/IcedTeaJavaRequestProcessor.cc Fri Jul 16 14:30:37 2010 +0200
+@@ -179,7 +179,7 @@
+
+ JavaRequestProcessor::JavaRequestProcessor()
+ {
+- PLUGIN_DEBUG_0ARG("JavaRequestProcessor constructor\n");
++ PLUGIN_DEBUG("JavaRequestProcessor constructor\n");
+
+ // caller frees this
+ result = new JavaResultData();
+@@ -200,7 +200,7 @@
+
+ JavaRequestProcessor::~JavaRequestProcessor()
+ {
+- PLUGIN_DEBUG_0ARG("JavaRequestProcessor::~JavaRequestProcessor\n");
++ PLUGIN_DEBUG("JavaRequestProcessor::~JavaRequestProcessor\n");
+
+ if (result)
+ {
+@@ -271,7 +271,7 @@
+ result->error_msg->append("Error: Timed out when waiting for response");
+
+ // Report error
+- PLUGIN_DEBUG_1ARG("Error: Timed out when waiting for response to %s\n", message.c_str());
++ PLUGIN_DEBUG("Error: Timed out when waiting for response to %s\n", message.c_str());
+ }
+
+ java_to_plugin_bus->unSubscribe(this);
+@@ -847,12 +847,12 @@
+
+ if (NPVARIANT_IS_VOID(v