提交 d2a73c79 编写于 作者: L lana

Merge

...@@ -274,11 +274,6 @@ ifeq ($(OPENJDK_TARGET_OS), macosx) ...@@ -274,11 +274,6 @@ ifeq ($(OPENJDK_TARGET_OS), macosx)
$(JDK_TOPDIR)/src/solaris/classes/sun/nio/ch/sctp/SctpMultiChannelImpl.java \ $(JDK_TOPDIR)/src/solaris/classes/sun/nio/ch/sctp/SctpMultiChannelImpl.java \
$(JDK_TOPDIR)/src/solaris/classes/sun/nio/ch/sctp/SctpServerChannelImpl.java $(JDK_TOPDIR)/src/solaris/classes/sun/nio/ch/sctp/SctpServerChannelImpl.java
# JObjC.jar contains 1.5 byte-code...so skip it here :-(
# MACOSX_SRC_DIRS += $(JDK_TOPDIR)/src/macosx/native/jobjc/src
# EXCLUDES += tests/java/com/apple/jobjc
EXCLUDES += com/apple/jobjc
endif endif
# The security classes should not end up in the classes directory as that will prevent them # The security classes should not end up in the classes directory as that will prevent them
...@@ -354,44 +349,6 @@ $(JDK_OUTPUTDIR)/classes/META-INF/services/com.sun.tools.xjc.Plugin: ...@@ -354,44 +349,6 @@ $(JDK_OUTPUTDIR)/classes/META-INF/services/com.sun.tools.xjc.Plugin:
########################################################################################## ##########################################################################################
ifeq ($(OPENJDK_TARGET_OS), macosx)
#
# JObjC.jar is compiled with BOOT_JAVAC which (may) not support the "-h" flag.
# so we first compile classes with BOOT_JAVAC and then with JDK_JAVAC :-(
#
$(eval $(call SetupJavaCompiler,GENERATE_15BYTECODE, \
JAVAC := $(JAVAC), \
FLAGS := -source 1.5 -target 1.5 -g -bootclasspath $(BOOT_RTJAR) -cp $(JDK_OUTPUTDIR)/../langtools/dist/lib/classes.jar $(DISABLE_WARNINGS), \
SERVER_DIR := $(SJAVAC_SERVER_DIR), \
SERVER_JVM := $(SJAVAC_SERVER_JAVA)))
$(eval $(call SetupJavaCompilation,BUILD_JOBJC, \
SETUP := GENERATE_15BYTECODE, \
DISABLE_SJAVAC := true, \
SRC := $(JDK_TOPDIR)/src/macosx/native/jobjc/src/core/java \
$(JDK_TOPDIR)/src/macosx/native/jobjc/src/runtime-additions/java \
$(JDK_OUTPUTDIR)/gensrc_jobjc/src, \
INCLUDES := com/apple/jobjc, \
EXCLUDES := tests/java/com/apple/jobjc, \
BIN := $(JDK_OUTPUTDIR)/jobjc_classes, \
JAR := $(JDK_OUTPUTDIR)/lib/JObjC.jar, \
JARINDEX := true))
$(BUILD_JOBJC): $(BUILD_JDK)
$(eval $(call SetupJavaCompilation,BUILD_JOBJC_HEADERS, \
SETUP := GENERATE_JDKBYTECODE, \
SRC := $(JDK_TOPDIR)/src/macosx/native/jobjc/src/core/java \
$(JDK_TOPDIR)/src/macosx/native/jobjc/src/runtime-additions/java \
$(JDK_OUTPUTDIR)/gensrc_jobjc/src, \
INCLUDES := com/apple/jobjc, \
EXCLUDES := tests/java/com/apple/jobjc, \
BIN := $(JDK_OUTPUTDIR)/jobjc_classes_headers, \
HEADERS := $(JDK_OUTPUTDIR)/gensrc_headers_jobjc))
$(BUILD_JOBJC_HEADERS): $(BUILD_JDK)
endif
########################################################################################## ##########################################################################################
......
...@@ -693,13 +693,6 @@ $(IMAGES_OUTPUTDIR)/lib/ext/zipfs.jar: $(JDK_OUTPUTDIR)/demo/nio/zipfs/zipfs.jar ...@@ -693,13 +693,6 @@ $(IMAGES_OUTPUTDIR)/lib/ext/zipfs.jar: $(JDK_OUTPUTDIR)/demo/nio/zipfs/zipfs.jar
########################################################################################## ##########################################################################################
ifeq ($(OPENJDK_TARGET_OS), macosx)
$(eval $(call SetupArchive,BUILD_JOBJC_JAR, , \
SRCS := $(JDK_OUTPUTDIR)/jobjc_classes, \
JAR := $(IMAGES_OUTPUTDIR)/lib/JObjC.jar, \
JARINDEX := true))
endif
# This file is imported from hotspot in Import.gmk. Copying it into images/lib so that # This file is imported from hotspot in Import.gmk. Copying it into images/lib so that
# all jars can be found in one place when creating images in Images.gmk. It needs to be # all jars can be found in one place when creating images in Images.gmk. It needs to be
# done here so that clean targets can be simple and accurate. # done here so that clean targets can be simple and accurate.
......
...@@ -85,11 +85,6 @@ GENSRC += $(GENSRC_CLDR) ...@@ -85,11 +85,6 @@ GENSRC += $(GENSRC_CLDR)
include gensrc/GensrcSwing.gmk include gensrc/GensrcSwing.gmk
GENSRC += $(GENSRC_SWING_BEANINFO) $(GENSRC_SWING_NIMBUS) GENSRC += $(GENSRC_SWING_BEANINFO) $(GENSRC_SWING_NIMBUS)
ifeq ($(OPENJDK_TARGET_OS), macosx)
include gensrc/GensrcJObjC.gmk
GENSRC += $(GENSRC_JOBJC)
endif
$(GENSRC): $(BUILD_TOOLS) $(GENSRC): $(BUILD_TOOLS)
all: $(GENSRC) all: $(GENSRC)
......
...@@ -303,14 +303,13 @@ $(JDK_IMAGE_DIR)/jre/lib/applet: ...@@ -303,14 +303,13 @@ $(JDK_IMAGE_DIR)/jre/lib/applet:
$(ECHO) $(LOG_INFO) Creating $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(ECHO) $(LOG_INFO) Creating $(patsubst $(OUTPUT_ROOT)/%,%,$@)
$(MKDIR) -p $@ $(MKDIR) -p $@
# In the old build, JObjC.jar is not part of the meta-index
$(JRE_IMAGE_DIR)/lib/meta-index: $(JRE_LIB_TARGETS) $(JRE_IMAGE_DIR)/lib/meta-index: $(JRE_LIB_TARGETS)
$(ECHO) $(LOG_INFO) Generating $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(ECHO) $(LOG_INFO) Generating $(patsubst $(OUTPUT_ROOT)/%,%,$@)
$(CD) $(@D) && $(TOOL_BUILDMETAINDEX) -o meta-index `$(LS) *.jar | $(SED) 's/JObjC\.jar//g'` $(CD) $(@D) && $(TOOL_BUILDMETAINDEX) -o meta-index *.jar
$(JDK_IMAGE_DIR)/jre/lib/meta-index: $(JDKJRE_LIB_TARGETS) $(JDK_IMAGE_DIR)/jre/lib/meta-index: $(JDKJRE_LIB_TARGETS)
$(ECHO) $(LOG_INFO) Generating $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(ECHO) $(LOG_INFO) Generating $(patsubst $(OUTPUT_ROOT)/%,%,$@)
$(CD) $(@D) && $(TOOL_BUILDMETAINDEX) -o meta-index `$(LS) *.jar | $(SED) 's/JObjC\.jar//g'` $(CD) $(@D) && $(TOOL_BUILDMETAINDEX) -o meta-index *.jar
$(JRE_IMAGE_DIR)/lib/ext/meta-index: $(JRE_LIB_TARGETS) $(JRE_IMAGE_DIR)/lib/ext/meta-index: $(JRE_LIB_TARGETS)
$(ECHO) $(LOG_INFO) Generating $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(ECHO) $(LOG_INFO) Generating $(patsubst $(OUTPUT_ROOT)/%,%,$@)
...@@ -326,6 +325,7 @@ $(JDK_IMAGE_DIR)/jre/lib/ext/meta-index: $(JDKJRE_LIB_TARGETS) ...@@ -326,6 +325,7 @@ $(JDK_IMAGE_DIR)/jre/lib/ext/meta-index: $(JDKJRE_LIB_TARGETS)
ifneq ($(OPENJDK_TARGET_OS), windows) ifneq ($(OPENJDK_TARGET_OS), windows)
JRE_MAN_PAGES := \ JRE_MAN_PAGES := \
java.1 \ java.1 \
jjs.1 \
keytool.1 \ keytool.1 \
orbd.1 \ orbd.1 \
pack200.1 \ pack200.1 \
...@@ -356,6 +356,7 @@ ifneq ($(OPENJDK_TARGET_OS), windows) ...@@ -356,6 +356,7 @@ ifneq ($(OPENJDK_TARGET_OS), windows)
jconsole.1 \ jconsole.1 \
jcmd.1 \ jcmd.1 \
jdb.1 \ jdb.1 \
jdeps.1 \
jhat.1 \ jhat.1 \
jinfo.1 \ jinfo.1 \
jmap.1 \ jmap.1 \
...@@ -374,7 +375,10 @@ ifneq ($(OPENJDK_TARGET_OS), windows) ...@@ -374,7 +375,10 @@ ifneq ($(OPENJDK_TARGET_OS), windows)
xjc.1 xjc.1
ifndef OPENJDK ifndef OPENJDK
JDK_MAN_PAGES += jvisualvm.1 JDK_MAN_PAGES += \
jvisualvm.1 \
jmc.1 \
#
endif endif
# This variable is potentially overridden in the closed makefile. # This variable is potentially overridden in the closed makefile.
...@@ -387,15 +391,13 @@ ifneq ($(OPENJDK_TARGET_OS), windows) ...@@ -387,15 +391,13 @@ ifneq ($(OPENJDK_TARGET_OS), windows)
ifeq ($(OPENJDK_TARGET_OS), solaris) ifeq ($(OPENJDK_TARGET_OS), solaris)
MAN_SRC_DIR := $(MAN_SRC_BASEDIR)/solaris/doc MAN_SRC_DIR := $(MAN_SRC_BASEDIR)/solaris/doc
MAN1_SUBDIR := sun/man/man1 MAN1_SUBDIR := sun/man/man1
JDK_MAN_PAGES := $(filter-out jmc.1, $(JDK_MAN_PAGES))
endif endif
ifeq ($(OPENJDK_TARGET_OS), macosx) ifeq ($(OPENJDK_TARGET_OS), macosx)
MAN_SRC_DIR := $(MAN_SRC_BASEDIR)/bsd/doc MAN_SRC_DIR := $(MAN_SRC_BASEDIR)/bsd/doc
MAN1_SUBDIR := man MAN1_SUBDIR := man
JDK_MAN_PAGES := $(filter-out jcmd.1, $(JDK_MAN_PAGES))
JDK_MAN_PAGES := $(filter-out jvisualvm.1, $(JDK_MAN_PAGES))
endif endif
$(JRE_IMAGE_DIR)/man/man1/%: $(MAN_SRC_DIR)/$(MAN1_SUBDIR)/% $(JRE_IMAGE_DIR)/man/man1/%: $(MAN_SRC_DIR)/$(MAN1_SUBDIR)/%
$(ECHO) $(LOG_INFO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(ECHO) $(LOG_INFO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@)
$(install-file) $(install-file)
...@@ -474,7 +476,7 @@ ifneq ($(OPENJDK_TARGET_OS), windows) ...@@ -474,7 +476,7 @@ ifneq ($(OPENJDK_TARGET_OS), windows)
JDK_MAN_PAGE_LIST := $(addprefix $(JDK_IMAGE_DIR)/man/man1/, $(JDK_MAN_PAGES)) \ JDK_MAN_PAGE_LIST := $(addprefix $(JDK_IMAGE_DIR)/man/man1/, $(JDK_MAN_PAGES)) \
$(addprefix $(JDK_IMAGE_DIR)/man/ja_JP.UTF-8/man1/, $(JDK_MAN_PAGES)) \ $(addprefix $(JDK_IMAGE_DIR)/man/ja_JP.UTF-8/man1/, $(JDK_MAN_PAGES)) \
$(JDK_IMAGE_DIR)/man/ja $(JDK_IMAGE_DIR)/man/ja
endif endif
ifeq ($(OPENJDK_TARGET_OS), solaris) ifeq ($(OPENJDK_TARGET_OS), solaris)
......
...@@ -105,10 +105,6 @@ ifeq ($(OPENJDK_TARGET_OS), windows) ...@@ -105,10 +105,6 @@ ifeq ($(OPENJDK_TARGET_OS), windows)
ALL_JARS += $(IMAGES_OUTPUTDIR)/lib/ext/sunmscapi.jar ALL_JARS += $(IMAGES_OUTPUTDIR)/lib/ext/sunmscapi.jar
endif endif
ifeq ($(OPENJDK_TARGET_OS), macosx)
ALL_JARS += $(IMAGES_OUTPUTDIR)/lib/JObjC.jar
endif
ifeq ($(PROFILE), profile_1) ifeq ($(PROFILE), profile_1)
PROFILE_JARS := $(PROFILE_1_JARS) PROFILE_JARS := $(PROFILE_1_JARS)
else ifeq ($(PROFILE), profile_2) else ifeq ($(PROFILE), profile_2)
......
...@@ -77,7 +77,7 @@ $(JDK_OUTPUTDIR)/gensrc_no_srczip/_the.generated_beaninfo: $(BEANS_SRC) \ ...@@ -77,7 +77,7 @@ $(JDK_OUTPUTDIR)/gensrc_no_srczip/_the.generated_beaninfo: $(BEANS_SRC) \
$(ECHO) Generating beaninfo $(ECHO) Generating beaninfo
$(MKDIR) -p $(JDK_OUTPUTDIR)/gensrc_no_srczip/javax/swing $(MKDIR) -p $(JDK_OUTPUTDIR)/gensrc_no_srczip/javax/swing
$(JAVA) -Djava.awt.headless=true $(NEW_JAVADOC) \ $(JAVA) -Djava.awt.headless=true $(NEW_JAVADOC) \
-sourcepath "$(JDK_TOPDIR)/src/share/classes$(PATH_SEP)$(JDK_OUTPUTDIR)/gensrc" \ -sourcepath "$(JDK_TOPDIR)/src/share/classes$(PATH_SEP)$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/classes$(PATH_SEP)$(JDK_OUTPUTDIR)/gensrc" \
-doclet build.tools.swingbeaninfo.GenDocletBeanInfo \ -doclet build.tools.swingbeaninfo.GenDocletBeanInfo \
-x $(SWINGBEAN_DEBUG_FLAG) -d $(JDK_OUTPUTDIR)/gensrc_no_srczip/javax/swing \ -x $(SWINGBEAN_DEBUG_FLAG) -d $(JDK_OUTPUTDIR)/gensrc_no_srczip/javax/swing \
-t $(DOCLET_DATA_DIR)/SwingBeanInfo.template -docletpath $(JDK_OUTPUTDIR)/btclasses \ -t $(DOCLET_DATA_DIR)/SwingBeanInfo.template -docletpath $(JDK_OUTPUTDIR)/btclasses \
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
LIBNET_SRC_DIRS := $(JDK_TOPDIR)/src/share/native/java/net \ LIBNET_SRC_DIRS := $(JDK_TOPDIR)/src/share/native/java/net \
$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/java/net \ $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/java/net \
$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/net/ \
$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/net/dns \ $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/net/dns \
$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/net/spi $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/net/spi
......
...@@ -136,64 +136,6 @@ endif ...@@ -136,64 +136,6 @@ endif
########################################################################################## ##########################################################################################
ifeq ($(OPENJDK_TARGET_OS), macosx)
$(eval $(call SetupNativeCompilation,BUILD_LIBJOBJC32, \
LIBRARY := JObjC, \
OUTPUT_DIR := $(JDK_OUTPUTDIR)/objs/libjobjc32, \
SRC := $(JDK_TOPDIR)/src/macosx/native/jobjc/src/core/native \
$(JDK_TOPDIR)/src/macosx/native/jobjc/src/runtime-additions/native, \
LANG := C, \
OPTIMIZATION := LOW, \
CFLAGS := -fpascal-strings \
-fobjc-gc \
-gdwarf-2 \
$(CFLAGS_JDKLIB) -I$(JDK_OUTPUTDIR)/gensrc_headers_jobjc \
-F/System/Library/Frameworks/JavaVM.framework/Frameworks \
-m32, \
LDFLAGS := $(LDFLAGS_JDKLIB) \
-m32, \
LDFLAGS_SUFFIX := -framework Foundation -framework JavaVM \
-F/System/Library/Frameworks/JavaVM.framework/Frameworks \
-framework JavaNativeFoundation \
-lffi, \
OBJECT_DIR := $(JDK_OUTPUTDIR)/objs/libjobjc32, \
DEBUG_SYMBOLS := $(DEBUG_ALL_BINARIES)))
$(eval $(call SetupNativeCompilation,BUILD_LIBJOBJC64, \
LIBRARY := JObjC, \
OUTPUT_DIR := $(JDK_OUTPUTDIR)/objs/libjobjc64, \
SRC := $(JDK_TOPDIR)/src/macosx/native/jobjc/src/core/native \
$(JDK_TOPDIR)/src/macosx/native/jobjc/src/runtime-additions/native, \
LANG := C, \
OPTIMIZATION := LOW, \
CFLAGS := -fpascal-strings \
-fobjc-gc \
-gdwarf-2 \
$(CFLAGS_JDKLIB) -I$(JDK_OUTPUTDIR)/gensrc_headers_jobjc \
-F/System/Library/Frameworks/JavaVM.framework/Frameworks \
, \
LDFLAGS := -fpascal-strings \
-fobjc-gc \
-gdwarf-2 \
$(LDFLAGS_JDKLIB) \
$(call SET_SHARED_LIBRARY_ORIGIN), \
LDFLAGS_SUFFIX := -framework Foundation -framework JavaVM \
-F/System/Library/Frameworks/JavaVM.framework/Frameworks \
-framework JavaNativeFoundation \
-lffi, \
OBJECT_DIR := $(JDK_OUTPUTDIR)/objs/libjobjc64, \
DEBUG_SYMBOLS := $(DEBUG_ALL_BINARIES)))
$(INSTALL_LIBRARIES_HERE)/$(LIBRARY_PREFIX)JObjC$(SHARED_LIBRARY_SUFFIX): $(BUILD_LIBJOBJC32) $(BUILD_LIBJOBJC64)
$(LIPO) -create -output $@ $(BUILD_LIBJOBJC32) $(BUILD_LIBJOBJC64)
BUILD_LIBRARIES += $(INSTALL_LIBRARIES_HERE)/$(LIBRARY_PREFIX)JObjC$(SHARED_LIBRARY_SUFFIX)
endif
##########################################################################################
ifndef OPENJDK ifndef OPENJDK
ifeq ($(OPENJDK_TARGET_OS), windows) ifeq ($(OPENJDK_TARGET_OS), windows)
......
...@@ -86,6 +86,8 @@ SUNWprivate_1.1 { ...@@ -86,6 +86,8 @@ SUNWprivate_1.1 {
Java_java_net_PlainSocketImpl_socketConnect; Java_java_net_PlainSocketImpl_socketConnect;
Java_java_net_PlainDatagramSocketImpl_getTimeToLive; Java_java_net_PlainDatagramSocketImpl_getTimeToLive;
Java_java_net_PlainDatagramSocketImpl_setTimeToLive; Java_java_net_PlainDatagramSocketImpl_setTimeToLive;
Java_sun_net_PortConfig_getUpper0;
Java_sun_net_PortConfig_getLower0;
Java_sun_net_dns_ResolverConfigurationImpl_localDomain0; Java_sun_net_dns_ResolverConfigurationImpl_localDomain0;
Java_sun_net_dns_ResolverConfigurationImpl_fallbackDomain0; Java_sun_net_dns_ResolverConfigurationImpl_fallbackDomain0;
Java_sun_net_sdp_SdpSupport_convert0; Java_sun_net_sdp_SdpSupport_convert0;
......
." Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
." DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
."
." This code is free software; you can redistribute it and/or modify it
." under the terms of the GNU General Public License version 2 only, as
." published by the Free Software Foundation.
."
." This code is distributed in the hope that it will be useful, but WITHOUT
." ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
." FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
." version 2 for more details (a copy is included in the LICENSE file that
." accompanied this code).
."
." You should have received a copy of the GNU General Public License version
." 2 along with this work; if not, write to the Free Software Foundation,
." Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
."
." Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
." or visit www.oracle.com if you need additional information or have any
." questions.
."
.TH jcmd 1 "07 May 2011"
.LP
." Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
." DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
."
." This code is free software; you can redistribute it and/or modify it
." under the terms of the GNU General Public License version 2 only, as
." published by the Free Software Foundation.
."
." This code is distributed in the hope that it will be useful, but WITHOUT
." ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
." FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
." version 2 for more details (a copy is included in the LICENSE file that
." accompanied this code).
."
." You should have received a copy of the GNU General Public License version
." 2 along with this work; if not, write to the Free Software Foundation,
." Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
."
." Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
." or visit www.oracle.com if you need additional information or have any
." questions.
."
.TH jdeps 1 "07 May 2011"
.LP
." Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
." DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
."
." This code is free software; you can redistribute it and/or modify it
." under the terms of the GNU General Public License version 2 only, as
." published by the Free Software Foundation.
."
." This code is distributed in the hope that it will be useful, but WITHOUT
." ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
." FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
." version 2 for more details (a copy is included in the LICENSE file that
." accompanied this code).
."
." You should have received a copy of the GNU General Public License version
." 2 along with this work; if not, write to the Free Software Foundation,
." Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
."
." Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
." or visit www.oracle.com if you need additional information or have any
." questions.
."
.TH jjs 1 "07 May 2011"
.LP
'\" t
.\"
.\" Copyright 2002-2004 Sun Microsystems, Inc. All Rights Reserved.
.\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
.\"
.\" This code is free software; you can redistribute it and/or modify it
.\" under the terms of the GNU General Public License version 2 only, as
.\" published by the Free Software Foundation.
.\"
.\" This code is distributed in the hope that it will be useful, but WITHOUT
.\" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
.\" FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
.\" version 2 for more details (a copy is included in the LICENSE file that
.\" accompanied this code).
.\"
.\" You should have received a copy of the GNU General Public License version
.\" 2 along with this work; if not, write to the Free Software Foundation,
.\" Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
.\"
.\" Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
.\" or visit www.oracle.com if you need additional information or have any
.\" questions.
.\"
.\"
.\"
'\" t
.\"
.\" Copyright 2002-2004 Sun Microsystems, Inc. All Rights Reserved.
.\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
.\"
.\" This code is free software; you can redistribute it and/or modify it
.\" under the terms of the GNU General Public License version 2 only, as
.\" published by the Free Software Foundation.
.\"
.\" This code is distributed in the hope that it will be useful, but WITHOUT
.\" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
.\" FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
.\" version 2 for more details (a copy is included in the LICENSE file that
.\" accompanied this code).
.\"
.\" You should have received a copy of the GNU General Public License version
.\" 2 along with this work; if not, write to the Free Software Foundation,
.\" Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
.\"
.\" Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
.\" or visit www.oracle.com if you need additional information or have any
.\" questions.
.\"
.\"
'\" t
.\"
.\" Copyright 2002-2004 Sun Microsystems, Inc. All Rights Reserved.
.\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
.\"
.\" This code is free software; you can redistribute it and/or modify it
.\" under the terms of the GNU General Public License version 2 only, as
.\" published by the Free Software Foundation.
.\"
.\" This code is distributed in the hope that it will be useful, but WITHOUT
.\" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
.\" FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
.\" version 2 for more details (a copy is included in the LICENSE file that
.\" accompanied this code).
.\"
.\" You should have received a copy of the GNU General Public License version
.\" 2 along with this work; if not, write to the Free Software Foundation,
.\" Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
.\"
.\" Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
.\" or visit www.oracle.com if you need additional information or have any
.\" questions.
.\"
.\"
...@@ -290,8 +290,8 @@ SplashEventLoop(Splash * splash) { ...@@ -290,8 +290,8 @@ SplashEventLoop(Splash * splash) {
SplashUnlock(splash); SplashUnlock(splash);
rc = poll(pfd, 1, timeout); rc = poll(pfd, 1, timeout);
SplashLock(splash); SplashLock(splash);
if (splash->isVisible>0 && SplashTime() >= splash->time + if (splash->isVisible > 0 && splash->currentFrame >= 0 &&
splash->frames[splash->currentFrame].delay) { SplashTime() >= splash->time + splash->frames[splash->currentFrame].delay) {
SplashNextFrame(splash); SplashNextFrame(splash);
SplashRedrawWindow(splash); SplashRedrawWindow(splash);
} }
......
...@@ -29,6 +29,7 @@ import com.sun.beans.finder.ClassFinder; ...@@ -29,6 +29,7 @@ import com.sun.beans.finder.ClassFinder;
import java.beans.ExceptionListener; import java.beans.ExceptionListener;
import java.io.IOException; import java.io.IOException;
import java.io.StringReader;
import java.lang.ref.Reference; import java.lang.ref.Reference;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
...@@ -245,6 +246,14 @@ public final class DocumentHandler extends DefaultHandler { ...@@ -245,6 +246,14 @@ public final class DocumentHandler extends DefaultHandler {
this.objects.add(object); this.objects.add(object);
} }
/**
* Disables any external entities.
*/
@Override
public InputSource resolveEntity(String publicId, String systemId) {
return new InputSource(new StringReader(""));
}
/** /**
* Prepares this handler to read objects from XML document. * Prepares this handler to read objects from XML document.
*/ */
......
/* /*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2013, 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
...@@ -72,13 +72,17 @@ public final class TlsRsaPremasterSecretGenerator extends KeyGeneratorSpi { ...@@ -72,13 +72,17 @@ public final class TlsRsaPremasterSecretGenerator extends KeyGeneratorSpi {
throw new IllegalStateException( throw new IllegalStateException(
"TlsRsaPremasterSecretGenerator must be initialized"); "TlsRsaPremasterSecretGenerator must be initialized");
} }
if (random == null) { byte[] b = spec.getEncodedSecret();
random = new SecureRandom(); if (b == null) {
if (random == null) {
random = new SecureRandom();
}
b = new byte[48];
random.nextBytes(b);
b[0] = (byte)spec.getMajorVersion();
b[1] = (byte)spec.getMinorVersion();
} }
byte[] b = new byte[48];
random.nextBytes(b);
b[0] = (byte)spec.getMajorVersion();
b[1] = (byte)spec.getMinorVersion();
return new SecretKeySpec(b, "TlsRsaPremasterSecret"); return new SecretKeySpec(b, "TlsRsaPremasterSecret");
} }
......
...@@ -27,17 +27,9 @@ package com.sun.jmx.snmp.agent; ...@@ -27,17 +27,9 @@ package com.sun.jmx.snmp.agent;
// java imports // java imports
// //
import com.sun.jmx.snmp.SnmpDefinitions;
import java.io.Serializable; import java.io.Serializable;
import java.util.Hashtable;
import java.util.Enumeration;
// jmx imports
//
import com.sun.jmx.snmp.SnmpValue;
import com.sun.jmx.snmp.SnmpVarBind;
import com.sun.jmx.snmp.SnmpStatusException; import com.sun.jmx.snmp.SnmpStatusException;
import com.sun.jmx.snmp.agent.SnmpMibOid;
import com.sun.jmx.snmp.agent.SnmpMibNode;
/** /**
* Represents a node in an SNMP MIB which corresponds to a table entry * Represents a node in an SNMP MIB which corresponds to a table entry
...@@ -99,7 +91,9 @@ public abstract class SnmpMibEntry extends SnmpMibNode ...@@ -99,7 +91,9 @@ public abstract class SnmpMibEntry extends SnmpMibNode
*/ */
public void validateVarId(long arc, Object userData) public void validateVarId(long arc, Object userData)
throws SnmpStatusException { throws SnmpStatusException {
if (isVariable(arc) == false) throw noSuchNameException; if (isVariable(arc) == false) {
throw new SnmpStatusException(SnmpDefinitions.snmpRspNoSuchName);
}
} }
/** /**
......
...@@ -108,8 +108,9 @@ public abstract class SnmpMibGroup extends SnmpMibOid ...@@ -108,8 +108,9 @@ public abstract class SnmpMibGroup extends SnmpMibOid
*/ */
public void validateVarId(long arc, Object userData) public void validateVarId(long arc, Object userData)
throws SnmpStatusException { throws SnmpStatusException {
if (isVariable(arc) == false) if (isVariable(arc) == false) {
throw noSuchObjectException; throw new SnmpStatusException(SnmpStatusException.noSuchObject);
}
} }
...@@ -360,17 +361,20 @@ public abstract class SnmpMibGroup extends SnmpMibOid ...@@ -360,17 +361,20 @@ public abstract class SnmpMibGroup extends SnmpMibOid
validateVarId(arc, data); validateVarId(arc, data);
// The trailing .0 is missing in the OID // The trailing .0 is missing in the OID
if (depth+2 > length) if (depth+2 > length) {
throw noSuchInstanceException; throw new SnmpStatusException(SnmpStatusException.noSuchInstance);
}
// There are too many arcs left in the OID (there should remain // There are too many arcs left in the OID (there should remain
// a single trailing .0) // a single trailing .0)
if (depth+2 < length) if (depth+2 < length) {
throw noSuchInstanceException; throw new SnmpStatusException(SnmpStatusException.noSuchInstance);
}
// The last trailing arc is not .0 // The last trailing arc is not .0
if (oid[depth+1] != 0L) if (oid[depth+1] != 0L) {
throw noSuchInstanceException; throw new SnmpStatusException(SnmpStatusException.noSuchInstance);
}
// It's one of our variable, register this node. // It's one of our variable, register this node.
handlers.add(this,depth,varbind); handlers.add(this,depth,varbind);
...@@ -389,12 +393,13 @@ public abstract class SnmpMibGroup extends SnmpMibOid ...@@ -389,12 +393,13 @@ public abstract class SnmpMibGroup extends SnmpMibOid
int length = oid.length; int length = oid.length;
SnmpMibNode node = null; SnmpMibNode node = null;
if (handlers == null) if (handlers == null) {
// This should be considered as a genErr, but we do not want to // This should be considered as a genErr, but we do not want to
// abort the whole request, so we're going to throw // abort the whole request, so we're going to throw
// a noSuchObject... // a noSuchObject...
// //
throw noSuchObjectException; throw new SnmpStatusException(SnmpStatusException.noSuchObject);
}
final Object data = handlers.getUserData(); final Object data = handlers.getUserData();
final int pduVersion = handlers.getRequestPduVersion(); final int pduVersion = handlers.getRequestPduVersion();
...@@ -430,7 +435,7 @@ public abstract class SnmpMibGroup extends SnmpMibOid ...@@ -430,7 +435,7 @@ public abstract class SnmpMibGroup extends SnmpMibOid
depth+1,handlers, depth+1,handlers,
checker); checker);
}catch(SnmpStatusException ex) { }catch(SnmpStatusException ex) {
throw noSuchObjectException; throw new SnmpStatusException(SnmpStatusException.noSuchObject);
} finally { } finally {
checker.remove(depth); checker.remove(depth);
} }
...@@ -455,7 +460,7 @@ public abstract class SnmpMibGroup extends SnmpMibOid ...@@ -455,7 +460,7 @@ public abstract class SnmpMibGroup extends SnmpMibOid
try { try {
checker.checkCurrentOid(); checker.checkCurrentOid();
} catch(SnmpStatusException e) { } catch(SnmpStatusException e) {
throw noSuchObjectException; throw new SnmpStatusException(SnmpStatusException.noSuchObject);
} finally { } finally {
checker.remove(depth,2); checker.remove(depth,2);
} }
...@@ -500,7 +505,7 @@ public abstract class SnmpMibGroup extends SnmpMibOid ...@@ -500,7 +505,7 @@ public abstract class SnmpMibGroup extends SnmpMibOid
// The oid is not valid, we will throw an exception in order // The oid is not valid, we will throw an exception in order
// to try with the next valid identifier... // to try with the next valid identifier...
// //
throw noSuchObjectException; throw new SnmpStatusException(SnmpStatusException.noSuchObject);
} catch (SnmpStatusException e) { } catch (SnmpStatusException e) {
// We didn't find anything at the given arc, so we're going // We didn't find anything at the given arc, so we're going
......
...@@ -155,7 +155,7 @@ public abstract class SnmpMibNode implements Serializable { ...@@ -155,7 +155,7 @@ public abstract class SnmpMibNode implements Serializable {
long[] oid, int depth, long[] oid, int depth,
SnmpRequestTree handlers) SnmpRequestTree handlers)
throws SnmpStatusException { throws SnmpStatusException {
throw noSuchObjectException; throw new SnmpStatusException(SnmpStatusException.noSuchObject);
} }
/** /**
...@@ -183,7 +183,7 @@ public abstract class SnmpMibNode implements Serializable { ...@@ -183,7 +183,7 @@ public abstract class SnmpMibNode implements Serializable {
long[] oid, int pos, int depth, long[] oid, int pos, int depth,
SnmpRequestTree handlers, AcmChecker checker) SnmpRequestTree handlers, AcmChecker checker)
throws SnmpStatusException { throws SnmpStatusException {
throw noSuchObjectException; throw new SnmpStatusException(SnmpStatusException.noSuchObject);
} }
/** /**
...@@ -346,8 +346,9 @@ public abstract class SnmpMibNode implements Serializable { ...@@ -346,8 +346,9 @@ public abstract class SnmpMibNode implements Serializable {
final int[] a = table; final int[] a = table;
final int val= (int) value; final int val= (int) value;
if (a == null) if (a == null) {
throw noSuchObjectException; throw new SnmpStatusException(SnmpStatusException.noSuchObject);
}
int low= 0; int low= 0;
int max= a.length; int max= a.length;
...@@ -356,11 +357,13 @@ public abstract class SnmpMibNode implements Serializable { ...@@ -356,11 +357,13 @@ public abstract class SnmpMibNode implements Serializable {
// Basic check // Basic check
// //
if (max < 1) if (max < 1) {
throw noSuchObjectException; throw new SnmpStatusException(SnmpStatusException.noSuchObject);
}
if (a[max-1] <= val) if (a[max-1] <= val) {
throw noSuchObjectException; throw new SnmpStatusException(SnmpStatusException.noSuchObject);
}
while (low <= max) { while (low <= max) {
elmt= a[curr]; elmt= a[curr];
...@@ -400,15 +403,4 @@ public abstract class SnmpMibNode implements Serializable { ...@@ -400,15 +403,4 @@ public abstract class SnmpMibNode implements Serializable {
* Contains the list of variable identifiers. * Contains the list of variable identifiers.
*/ */
protected int[] varList; protected int[] varList;
/**
* Contains a predefined exception that is often fired when an
* object is not found in the MIB.
*/
static final protected SnmpStatusException noSuchInstanceException =
new SnmpStatusException(SnmpStatusException.noSuchInstance);
static final protected SnmpStatusException noSuchObjectException =
new SnmpStatusException(SnmpStatusException.noSuchObject);
static final protected SnmpStatusException noSuchNameException =
new SnmpStatusException(SnmpDefinitions.snmpRspNoSuchName);
} }
...@@ -160,12 +160,10 @@ public class SnmpMibOid extends SnmpMibNode implements Serializable { ...@@ -160,12 +160,10 @@ public class SnmpMibOid extends SnmpMibNode implements Serializable {
if (depth > length) { if (depth > length) {
// Nothing is left... the oid is not valid // Nothing is left... the oid is not valid
throw noSuchObjectException; throw new SnmpStatusException(SnmpStatusException.noSuchObject);
} else if (depth == length) { } else if (depth == length) {
// The oid is not complete... // The oid is not complete...
throw noSuchInstanceException; throw new SnmpStatusException(SnmpStatusException.noSuchInstance);
} else { } else {
// Some children variable or subobject is being querried // Some children variable or subobject is being querried
// getChild() will raise an exception if no child is found. // getChild() will raise an exception if no child is found.
...@@ -205,12 +203,13 @@ public class SnmpMibOid extends SnmpMibNode implements Serializable { ...@@ -205,12 +203,13 @@ public class SnmpMibOid extends SnmpMibNode implements Serializable {
final int length = oid.length; final int length = oid.length;
SnmpMibNode node = null; SnmpMibNode node = null;
long[] result = null; long[] result = null;
if (handlers == null) if (handlers == null) {
// This should be considered as a genErr, but we do not want to // This should be considered as a genErr, but we do not want to
// abort the whole request, so we're going to throw // abort the whole request, so we're going to throw
// a noSuchObject... // a noSuchObject...
// //
throw noSuchObjectException; throw new SnmpStatusException(SnmpStatusException.noSuchObject);
}
final Object data = handlers.getUserData(); final Object data = handlers.getUserData();
final int pduVersion = handlers.getRequestPduVersion(); final int pduVersion = handlers.getRequestPduVersion();
...@@ -235,7 +234,7 @@ public class SnmpMibOid extends SnmpMibNode implements Serializable { ...@@ -235,7 +234,7 @@ public class SnmpMibOid extends SnmpMibNode implements Serializable {
// SnmpOid result = null; // SnmpOid result = null;
if (child == null) { if (child == null) {
// shouldn't happen // shouldn't happen
throw noSuchObjectException; throw new SnmpStatusException(SnmpStatusException.noSuchObject);
// validateVarId(index); // validateVarId(index);
// handlers.add(this,varbind,depth); // handlers.add(this,varbind,depth);
// result = new SnmpOid(0); // result = new SnmpOid(0);
...@@ -444,11 +443,13 @@ public class SnmpMibOid extends SnmpMibNode implements Serializable { ...@@ -444,11 +443,13 @@ public class SnmpMibOid extends SnmpMibNode implements Serializable {
// first we need to retrieve the identifier in the list of children // first we need to retrieve the identifier in the list of children
// //
final int pos= getInsertAt(id); final int pos= getInsertAt(id);
if (pos >= nbChildren) if (pos >= nbChildren) {
throw noSuchObjectException; throw new SnmpStatusException(SnmpStatusException.noSuchObject);
}
if (varList[pos] != (int) id) if (varList[pos] != (int) id) {
throw noSuchObjectException; throw new SnmpStatusException(SnmpStatusException.noSuchObject);
}
// Access the node // Access the node
// //
...@@ -456,10 +457,11 @@ public class SnmpMibOid extends SnmpMibNode implements Serializable { ...@@ -456,10 +457,11 @@ public class SnmpMibOid extends SnmpMibNode implements Serializable {
try { try {
child = children.elementAtNonSync(pos); child = children.elementAtNonSync(pos);
} catch(ArrayIndexOutOfBoundsException e) { } catch(ArrayIndexOutOfBoundsException e) {
throw noSuchObjectException; throw new SnmpStatusException(SnmpStatusException.noSuchObject);
}
if (child == null) {
throw new SnmpStatusException(SnmpStatusException.noSuchInstance);
} }
if (child == null)
throw noSuchInstanceException;
return child; return child;
} }
......
...@@ -280,7 +280,7 @@ public abstract class SnmpMibTable extends SnmpMibNode ...@@ -280,7 +280,7 @@ public abstract class SnmpMibTable extends SnmpMibNode
SnmpVarBind var; SnmpVarBind var;
for (Enumeration<SnmpVarBind> e= r.getElements(); e.hasMoreElements();) { for (Enumeration<SnmpVarBind> e= r.getElements(); e.hasMoreElements();) {
var = e.nextElement(); var = e.nextElement();
r.registerGetException(var,noSuchInstanceException); r.registerGetException(var,new SnmpStatusException(SnmpStatusException.noSuchInstance));
} }
} }
...@@ -1607,8 +1607,9 @@ public abstract class SnmpMibTable extends SnmpMibNode ...@@ -1607,8 +1607,9 @@ public abstract class SnmpMibTable extends SnmpMibNode
protected SnmpOid getNextOid(SnmpOid oid, Object userData) protected SnmpOid getNextOid(SnmpOid oid, Object userData)
throws SnmpStatusException { throws SnmpStatusException {
if (size == 0) if (size == 0) {
throw noSuchInstanceException; throw new SnmpStatusException(SnmpStatusException.noSuchInstance);
}
final SnmpOid resOid = oid; final SnmpOid resOid = oid;
...@@ -1619,7 +1620,7 @@ public abstract class SnmpMibTable extends SnmpMibNode ...@@ -1619,7 +1620,7 @@ public abstract class SnmpMibTable extends SnmpMibNode
if (last.equals(resOid)) { if (last.equals(resOid)) {
// Last element of the table ... // Last element of the table ...
// //
throw noSuchInstanceException; throw new SnmpStatusException(SnmpStatusException.noSuchInstance);
} }
// First find the oid. This will allow to speed up retrieval process // First find the oid. This will allow to speed up retrieval process
...@@ -1641,12 +1642,12 @@ public abstract class SnmpMibTable extends SnmpMibNode ...@@ -1641,12 +1642,12 @@ public abstract class SnmpMibTable extends SnmpMibNode
// XX last = (SnmpOid) oids.elementAt(newPos); // XX last = (SnmpOid) oids.elementAt(newPos);
last = tableoids[newPos]; last = tableoids[newPos];
} catch(ArrayIndexOutOfBoundsException e) { } catch(ArrayIndexOutOfBoundsException e) {
throw noSuchInstanceException; throw new SnmpStatusException(SnmpStatusException.noSuchInstance);
} }
} else { } else {
// We are dealing with the last element of the table .. // We are dealing with the last element of the table ..
// //
throw noSuchInstanceException; throw new SnmpStatusException(SnmpStatusException.noSuchInstance);
} }
...@@ -1668,8 +1669,9 @@ public abstract class SnmpMibTable extends SnmpMibNode ...@@ -1668,8 +1669,9 @@ public abstract class SnmpMibTable extends SnmpMibNode
*/ */
protected SnmpOid getNextOid(Object userData) protected SnmpOid getNextOid(Object userData)
throws SnmpStatusException { throws SnmpStatusException {
if (size == 0) if (size == 0) {
throw noSuchInstanceException; throw new SnmpStatusException(SnmpStatusException.noSuchInstance);
}
// XX return (SnmpOid) oids.firstElement(); // XX return (SnmpOid) oids.firstElement();
return tableoids[0]; return tableoids[0];
} }
...@@ -1875,10 +1877,10 @@ public abstract class SnmpMibTable extends SnmpMibNode ...@@ -1875,10 +1877,10 @@ public abstract class SnmpMibTable extends SnmpMibNode
// not support creation. // not support creation.
// We know that the entry does not exists if (isentry == false). // We know that the entry does not exists if (isentry == false).
if (!hasEntry) { if (!hasEntry) {
if (!handlers.isCreationAllowed()) if (!handlers.isCreationAllowed()) {
// we're not doing a set // we're not doing a set
throw noSuchInstanceException; throw new SnmpStatusException(SnmpStatusException.noSuchInstance);
else if (!isCreationEnabled()) } else if (!isCreationEnabled())
// we're doing a set but creation is disabled. // we're doing a set but creation is disabled.
throw new throw new
SnmpStatusException(SnmpStatusException.snmpRspNoAccess); SnmpStatusException(SnmpStatusException.snmpRspNoAccess);
...@@ -1922,12 +1924,13 @@ public abstract class SnmpMibTable extends SnmpMibNode ...@@ -1922,12 +1924,13 @@ public abstract class SnmpMibTable extends SnmpMibNode
int length = oid.length; int length = oid.length;
if (handlers == null) if (handlers == null) {
// This should be considered as a genErr, but we do not want to // This should be considered as a genErr, but we do not want to
// abort the whole request, so we're going to throw // abort the whole request, so we're going to throw
// a noSuchObject... // a noSuchObject...
// //
throw noSuchObjectException; throw new SnmpStatusException(SnmpStatusException.noSuchObject);
}
final Object data = handlers.getUserData(); final Object data = handlers.getUserData();
final int pduVersion = handlers.getRequestPduVersion(); final int pduVersion = handlers.getRequestPduVersion();
...@@ -1961,7 +1964,7 @@ public abstract class SnmpMibTable extends SnmpMibNode ...@@ -1961,7 +1964,7 @@ public abstract class SnmpMibTable extends SnmpMibNode
// so we won't find the next element in this table... (any // so we won't find the next element in this table... (any
// element in this table will have a smaller OID) // element in this table will have a smaller OID)
// //
throw noSuchObjectException; throw new SnmpStatusException(SnmpStatusException.noSuchObject);
} else if (oid[pos] < nodeId) { } else if (oid[pos] < nodeId) {
// we must return the first leaf under the first columnar // we must return the first leaf under the first columnar
// object, so we are back to our first case where pos was // object, so we are back to our first case where pos was
...@@ -2051,8 +2054,9 @@ public abstract class SnmpMibTable extends SnmpMibNode ...@@ -2051,8 +2054,9 @@ public abstract class SnmpMibTable extends SnmpMibNode
// in tables can't be properly supported (all rows // in tables can't be properly supported (all rows
// must have the same holes) // must have the same holes)
// //
if (skipEntryVariable(entryoid,var,data,pduVersion)) if (skipEntryVariable(entryoid,var,data,pduVersion)) {
throw noSuchObjectException; throw new SnmpStatusException(SnmpStatusException.noSuchObject);
}
} catch(SnmpStatusException se) { } catch(SnmpStatusException se) {
entryoid = getNextOid(data); entryoid = getNextOid(data);
var = getNextVarEntryId(entryoid,var,data,pduVersion); var = getNextVarEntryId(entryoid,var,data,pduVersion);
...@@ -2085,8 +2089,9 @@ public abstract class SnmpMibTable extends SnmpMibNode ...@@ -2085,8 +2089,9 @@ public abstract class SnmpMibTable extends SnmpMibNode
// So we throw the exception. // So we throw the exception.
// => will skip to next node in the MIB tree. // => will skip to next node in the MIB tree.
// //
if (entryoid == null || var == -1 ) throw noSuchObjectException; if (entryoid == null || var == -1 ) {
throw new SnmpStatusException(SnmpStatusException.noSuchObject);
}
// So here we know both the row (entryoid) and the column (var) // So here we know both the row (entryoid) and the column (var)
// //
...@@ -2097,8 +2102,9 @@ public abstract class SnmpMibTable extends SnmpMibNode ...@@ -2097,8 +2102,9 @@ public abstract class SnmpMibTable extends SnmpMibNode
// for this specific entry, it is not readable for any // for this specific entry, it is not readable for any
// other entry => skip to next column. // other entry => skip to next column.
// //
if (!isReadableEntryId(entryoid,var,data)) if (!isReadableEntryId(entryoid,var,data)) {
throw noSuchObjectException; throw new SnmpStatusException(SnmpStatusException.noSuchObject);
}
// Prepare the result and the ACM checker. // Prepare the result and the ACM checker.
// //
...@@ -2161,8 +2167,9 @@ public abstract class SnmpMibTable extends SnmpMibNode ...@@ -2161,8 +2167,9 @@ public abstract class SnmpMibTable extends SnmpMibNode
// No need to continue, we throw an exception. // No need to continue, we throw an exception.
// => will skip to next node in the MIB tree. // => will skip to next node in the MIB tree.
// //
if (entryoid == null || var == -1 ) if (entryoid == null || var == -1 ) {
throw noSuchObjectException; throw new SnmpStatusException(SnmpStatusException.noSuchObject);
}
} }
} }
...@@ -2182,14 +2189,15 @@ public abstract class SnmpMibTable extends SnmpMibNode ...@@ -2182,14 +2189,15 @@ public abstract class SnmpMibTable extends SnmpMibNode
// Control the length of the oid // Control the length of the oid
// //
if (pos +2 >= length) if (pos +2 >= length) {
throw noSuchInstanceException; throw new SnmpStatusException(SnmpStatusException.noSuchInstance);
}
// Check that the entry identifier is specified // Check that the entry identifier is specified
// //
if (oid[pos] != nodeId) if (oid[pos] != nodeId) {
throw noSuchObjectException; throw new SnmpStatusException(SnmpStatusException.noSuchObject);
}
} }
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
......
...@@ -1146,7 +1146,4 @@ class SnmpRequestHandler extends ClientHandler implements SnmpDefinitions { ...@@ -1146,7 +1146,4 @@ class SnmpRequestHandler extends ClientHandler implements SnmpDefinitions {
static final private String InterruptSysCallMsg = static final private String InterruptSysCallMsg =
"Interrupted system call"; "Interrupted system call";
static final private SnmpStatusException noSuchNameException =
new SnmpStatusException(SnmpDefinitions.snmpRspNoSuchName) ;
} }
...@@ -56,9 +56,12 @@ public final class FactoryEnumeration { ...@@ -56,9 +56,12 @@ public final class FactoryEnumeration {
* references so as not to prevent GC of the class loader. Each * references so as not to prevent GC of the class loader. Each
* weak reference is tagged with the factory's class name so the * weak reference is tagged with the factory's class name so the
* class can be reloaded if the reference is cleared. * class can be reloaded if the reference is cleared.
*
* @param factories A non-null list * @param factories A non-null list
* @param loader The class loader of the list's contents * @param loader The class loader of the list's contents
*
* This internal method is used with Thread Context Class Loader (TCCL),
* please don't expose this method as public.
*/ */
FactoryEnumeration(List<NamedWeakReference<Object>> factories, FactoryEnumeration(List<NamedWeakReference<Object>> factories,
ClassLoader loader) { ClassLoader loader) {
...@@ -79,7 +82,8 @@ public final class FactoryEnumeration { ...@@ -79,7 +82,8 @@ public final class FactoryEnumeration {
try { try {
if (answer == null) { // reload class if weak ref cleared if (answer == null) { // reload class if weak ref cleared
answer = Class.forName(className, true, loader); Class<?> cls = Class.forName(className, true, loader);
answer = cls;
} }
// Instantiate Class to get factory // Instantiate Class to get factory
answer = ((Class) answer).newInstance(); answer = ((Class) answer).newInstance();
......
...@@ -53,21 +53,24 @@ import javax.naming.*; ...@@ -53,21 +53,24 @@ import javax.naming.*;
final class VersionHelper12 extends VersionHelper { final class VersionHelper12 extends VersionHelper {
private boolean getSystemPropsFailed = false; // Disallow external from creating one of these.
VersionHelper12() {
VersionHelper12() {} // Disallow external from creating one of these. }
public Class<?> loadClass(String className) throws ClassNotFoundException { public Class<?> loadClass(String className) throws ClassNotFoundException {
ClassLoader cl = getContextClassLoader(); return loadClass(className, getContextClassLoader());
return Class.forName(className, true, cl);
} }
/** /**
* Package private. * Package private.
*/ *
* This internal method is used with Thread Context Class Loader (TCCL),
* please don't expose this method as public.
*/
Class<?> loadClass(String className, ClassLoader cl) Class<?> loadClass(String className, ClassLoader cl)
throws ClassNotFoundException { throws ClassNotFoundException {
return Class.forName(className, true, cl); Class<?> cls = Class.forName(className, true, cl);
return cls;
} }
/** /**
...@@ -75,13 +78,13 @@ final class VersionHelper12 extends VersionHelper { ...@@ -75,13 +78,13 @@ final class VersionHelper12 extends VersionHelper {
* @param codebase A non-null, space-separated list of URL strings. * @param codebase A non-null, space-separated list of URL strings.
*/ */
public Class<?> loadClass(String className, String codebase) public Class<?> loadClass(String className, String codebase)
throws ClassNotFoundException, MalformedURLException { throws ClassNotFoundException, MalformedURLException {
ClassLoader cl;
ClassLoader parent = getContextClassLoader(); ClassLoader parent = getContextClassLoader();
cl = URLClassLoader.newInstance(getUrlArray(codebase), parent); ClassLoader cl =
URLClassLoader.newInstance(getUrlArray(codebase), parent);
return Class.forName(className, true, cl); return loadClass(className, cl);
} }
String getJndiProperty(final int i) { String getJndiProperty(final int i) {
...@@ -99,16 +102,12 @@ final class VersionHelper12 extends VersionHelper { ...@@ -99,16 +102,12 @@ final class VersionHelper12 extends VersionHelper {
} }
String[] getJndiProperties() { String[] getJndiProperties() {
if (getSystemPropsFailed) {
return null; // after one failure, don't bother trying again
}
Properties sysProps = AccessController.doPrivileged( Properties sysProps = AccessController.doPrivileged(
new PrivilegedAction<Properties>() { new PrivilegedAction<Properties>() {
public Properties run() { public Properties run() {
try { try {
return System.getProperties(); return System.getProperties();
} catch (SecurityException e) { } catch (SecurityException e) {
getSystemPropsFailed = true;
return null; return null;
} }
} }
...@@ -173,17 +172,32 @@ final class VersionHelper12 extends VersionHelper { ...@@ -173,17 +172,32 @@ final class VersionHelper12 extends VersionHelper {
return new InputStreamEnumeration(urls); return new InputStreamEnumeration(urls);
} }
/**
* Package private.
*
* This internal method returns Thread Context Class Loader (TCCL),
* if null, returns the system Class Loader.
*
* Please don't expose this method as public.
*/
ClassLoader getContextClassLoader() { ClassLoader getContextClassLoader() {
return AccessController.doPrivileged( return AccessController.doPrivileged(
new PrivilegedAction<ClassLoader>() { new PrivilegedAction<ClassLoader>() {
public ClassLoader run() { public ClassLoader run() {
return Thread.currentThread().getContextClassLoader(); ClassLoader loader =
Thread.currentThread().getContextClassLoader();
if (loader == null) {
// Don't use bootstrap class loader directly!
loader = ClassLoader.getSystemClassLoader();
}
return loader;
} }
} }
); );
} }
/** /**
* Given an enumeration of URLs, an instance of this class represents * Given an enumeration of URLs, an instance of this class represents
* an enumeration of their InputStreams. Each operation on the URL * an enumeration of their InputStreams. Each operation on the URL
......
...@@ -276,6 +276,11 @@ public abstract class SctpChannel ...@@ -276,6 +276,11 @@ public abstract class SctpChannel
* *
* @throws IOException * @throws IOException
* If some other I/O error occurs * If some other I/O error occurs
*
* @throws SecurityException
* If a security manager has been installed and its
* {@link SecurityManager#checkListen checkListen} method denies
* the operation
*/ */
public abstract SctpChannel bind(SocketAddress local) public abstract SctpChannel bind(SocketAddress local)
throws IOException; throws IOException;
......
...@@ -382,7 +382,8 @@ public abstract class Canonicalizer11 extends CanonicalizerBase { ...@@ -382,7 +382,8 @@ public abstract class Canonicalizer11 extends CanonicalizerBase {
} else if (!isVisible(xmlns)) { } else if (!isVisible(xmlns)) {
//There is a definition but the xmlns is not selected by the xpath. //There is a definition but the xmlns is not selected by the xpath.
//then xmlns="" //then xmlns=""
n = ns.addMappingAndRender(XMLNS, "", nullNode); n = ns.addMappingAndRender(
XMLNS, "", getNullNode(xmlns.getOwnerDocument()));
} }
//output the xmlns def if needed. //output the xmlns def if needed.
if (n != null) { if (n != null) {
......
...@@ -327,7 +327,8 @@ public abstract class Canonicalizer20010315 extends CanonicalizerBase { ...@@ -327,7 +327,8 @@ public abstract class Canonicalizer20010315 extends CanonicalizerBase {
} else if (!isVisible(xmlns)) { } else if (!isVisible(xmlns)) {
//There is a definition but the xmlns is not selected by the xpath. //There is a definition but the xmlns is not selected by the xpath.
//then xmlns="" //then xmlns=""
n = ns.addMappingAndRender(XMLNS, "", nullNode); n = ns.addMappingAndRender(
XMLNS, "", getNullNode(xmlns.getOwnerDocument()));
} }
//output the xmlns def if needed. //output the xmlns def if needed.
if (n != null) { if (n != null) {
......
...@@ -292,7 +292,7 @@ public abstract class Canonicalizer20010315Excl extends CanonicalizerBase { ...@@ -292,7 +292,7 @@ public abstract class Canonicalizer20010315Excl extends CanonicalizerBase {
if (xmlns != null && !isVisible(xmlns)) { if (xmlns != null && !isVisible(xmlns)) {
// There is a definition but the xmlns is not selected by the // There is a definition but the xmlns is not selected by the
// xpath. then xmlns="" // xpath. then xmlns=""
ns.addMapping(XMLNS, "", nullNode); ns.addMapping(XMLNS, "", getNullNode(xmlns.getOwnerDocument()));
} }
String prefix = null; String prefix = null;
......
...@@ -34,8 +34,6 @@ import java.util.ListIterator; ...@@ -34,8 +34,6 @@ import java.util.ListIterator;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.ParserConfigurationException;
import com.sun.org.apache.xml.internal.security.c14n.CanonicalizationException; import com.sun.org.apache.xml.internal.security.c14n.CanonicalizationException;
...@@ -49,6 +47,7 @@ import com.sun.org.apache.xml.internal.security.utils.XMLUtils; ...@@ -49,6 +47,7 @@ import com.sun.org.apache.xml.internal.security.utils.XMLUtils;
import org.w3c.dom.Attr; import org.w3c.dom.Attr;
import org.w3c.dom.Comment; import org.w3c.dom.Comment;
import org.w3c.dom.Element; import org.w3c.dom.Element;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap; import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.w3c.dom.ProcessingInstruction; import org.w3c.dom.ProcessingInstruction;
...@@ -64,8 +63,9 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi { ...@@ -64,8 +63,9 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
public static final String XMLNS = "xmlns"; public static final String XMLNS = "xmlns";
protected static final AttrCompare COMPARE = new AttrCompare(); protected static final AttrCompare COMPARE = new AttrCompare();
protected static final Attr nullNode;
// Make sure you clone the following mutable arrays before passing to
// potentially untrusted objects such as OutputStreams.
private static final byte[] END_PI = {'?','>'}; private static final byte[] END_PI = {'?','>'};
private static final byte[] BEGIN_PI = {'<','?'}; private static final byte[] BEGIN_PI = {'<','?'};
private static final byte[] END_COMM = {'-','-','>'}; private static final byte[] END_COMM = {'-','-','>'};
...@@ -78,27 +78,17 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi { ...@@ -78,27 +78,17 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
private static final byte[] LT = {'&','l','t',';'}; private static final byte[] LT = {'&','l','t',';'};
private static final byte[] END_TAG = {'<','/'}; private static final byte[] END_TAG = {'<','/'};
private static final byte[] AMP = {'&','a','m','p',';'}; private static final byte[] AMP = {'&','a','m','p',';'};
private static final byte[] equalsStr = {'=','\"'}; private static final byte[] EQUALS_STR = {'=','\"'};
protected static final int NODE_BEFORE_DOCUMENT_ELEMENT = -1; protected static final int NODE_BEFORE_DOCUMENT_ELEMENT = -1;
protected static final int NODE_NOT_BEFORE_OR_AFTER_DOCUMENT_ELEMENT = 0; protected static final int NODE_NOT_BEFORE_OR_AFTER_DOCUMENT_ELEMENT = 0;
protected static final int NODE_AFTER_DOCUMENT_ELEMENT = 1; protected static final int NODE_AFTER_DOCUMENT_ELEMENT = 1;
static {
// The null xmlns definition.
try {
DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
nullNode = documentBuilder.newDocument().createAttributeNS(Constants.NamespaceSpecNS, XMLNS);
nullNode.setValue("");
} catch (Exception e) {
throw new RuntimeException("Unable to create nullNode: " + e);
}
}
private List<NodeFilter> nodeFilter; private List<NodeFilter> nodeFilter;
private boolean includeComments; private boolean includeComments;
private Set<Node> xpathNodeSet; private Set<Node> xpathNodeSet;
/** /**
* The node to be skipped/excluded from the DOM tree * The node to be skipped/excluded from the DOM tree
* in subtree canonicalizations. * in subtree canonicalizations.
...@@ -106,6 +96,11 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi { ...@@ -106,6 +96,11 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
private Node excludeNode; private Node excludeNode;
private OutputStream writer = new ByteArrayOutputStream(); private OutputStream writer = new ByteArrayOutputStream();
/**
* The null xmlns definition.
*/
private Attr nullNode;
/** /**
* Constructor CanonicalizerBase * Constructor CanonicalizerBase
* *
...@@ -310,7 +305,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi { ...@@ -310,7 +305,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
writer.write('>'); writer.write('>');
sibling = currentNode.getFirstChild(); sibling = currentNode.getFirstChild();
if (sibling == null) { if (sibling == null) {
writer.write(END_TAG); writer.write(END_TAG.clone());
UtfHelpper.writeStringToUtf8(name, writer); UtfHelpper.writeStringToUtf8(name, writer);
writer.write('>'); writer.write('>');
//We finished with this level, pop to the previous definitions. //We finished with this level, pop to the previous definitions.
...@@ -328,7 +323,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi { ...@@ -328,7 +323,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
break; break;
} }
while (sibling == null && parentNode != null) { while (sibling == null && parentNode != null) {
writer.write(END_TAG); writer.write(END_TAG.clone());
UtfHelpper.writeByte(((Element)parentNode).getTagName(), writer, cache); UtfHelpper.writeByte(((Element)parentNode).getTagName(), writer, cache);
writer.write('>'); writer.write('>');
//We finished with this level, pop to the previous definitions. //We finished with this level, pop to the previous definitions.
...@@ -488,7 +483,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi { ...@@ -488,7 +483,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
if (sibling == null) { if (sibling == null) {
if (currentNodeIsVisible) { if (currentNodeIsVisible) {
writer.write(END_TAG); writer.write(END_TAG.clone());
UtfHelpper.writeByte(name, writer, cache); UtfHelpper.writeByte(name, writer, cache);
writer.write('>'); writer.write('>');
//We finished with this level, pop to the previous definitions. //We finished with this level, pop to the previous definitions.
...@@ -510,7 +505,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi { ...@@ -510,7 +505,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
} }
while (sibling == null && parentNode != null) { while (sibling == null && parentNode != null) {
if (isVisible(parentNode)) { if (isVisible(parentNode)) {
writer.write(END_TAG); writer.write(END_TAG.clone());
UtfHelpper.writeByte(((Element)parentNode).getTagName(), writer, cache); UtfHelpper.writeByte(((Element)parentNode).getTagName(), writer, cache);
writer.write('>'); writer.write('>');
//We finished with this level, pop to the previous definitions. //We finished with this level, pop to the previous definitions.
...@@ -641,8 +636,9 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi { ...@@ -641,8 +636,9 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
parents.clear(); parents.clear();
Attr nsprefix; Attr nsprefix;
if (((nsprefix = ns.getMappingWithoutRendered(XMLNS)) != null) if (((nsprefix = ns.getMappingWithoutRendered(XMLNS)) != null)
&& "".equals(nsprefix.getValue())) { && "".equals(nsprefix.getValue())) {
ns.addMappingAndRender(XMLNS, "", nullNode); ns.addMappingAndRender(
XMLNS, "", getNullNode(nsprefix.getOwnerDocument()));
} }
} }
...@@ -696,7 +692,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi { ...@@ -696,7 +692,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
) throws IOException { ) throws IOException {
writer.write(' '); writer.write(' ');
UtfHelpper.writeByte(name, writer, cache); UtfHelpper.writeByte(name, writer, cache);
writer.write(equalsStr); writer.write(EQUALS_STR.clone());
byte[] toWrite; byte[] toWrite;
final int length = value.length(); final int length = value.length();
int i = 0; int i = 0;
...@@ -706,27 +702,27 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi { ...@@ -706,27 +702,27 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
switch (c) { switch (c) {
case '&' : case '&' :
toWrite = AMP; toWrite = AMP.clone();
break; break;
case '<' : case '<' :
toWrite = LT; toWrite = LT.clone();
break; break;
case '"' : case '"' :
toWrite = QUOT; toWrite = QUOT.clone();
break; break;
case 0x09 : // '\t' case 0x09 : // '\t'
toWrite = X9; toWrite = X9.clone();
break; break;
case 0x0A : // '\n' case 0x0A : // '\n'
toWrite = XA; toWrite = XA.clone();
break; break;
case 0x0D : // '\r' case 0x0D : // '\r'
toWrite = XD; toWrite = XD.clone();
break; break;
default : default :
...@@ -756,7 +752,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi { ...@@ -756,7 +752,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
if (position == NODE_AFTER_DOCUMENT_ELEMENT) { if (position == NODE_AFTER_DOCUMENT_ELEMENT) {
writer.write('\n'); writer.write('\n');
} }
writer.write(BEGIN_PI); writer.write(BEGIN_PI.clone());
final String target = currentPI.getTarget(); final String target = currentPI.getTarget();
int length = target.length(); int length = target.length();
...@@ -764,7 +760,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi { ...@@ -764,7 +760,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) {
char c = target.charAt(i); char c = target.charAt(i);
if (c == 0x0D) { if (c == 0x0D) {
writer.write(XD); writer.write(XD.clone());
} else { } else {
if (c < 0x80) { if (c < 0x80) {
writer.write(c); writer.write(c);
...@@ -784,14 +780,14 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi { ...@@ -784,14 +780,14 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) {
char c = data.charAt(i); char c = data.charAt(i);
if (c == 0x0D) { if (c == 0x0D) {
writer.write(XD); writer.write(XD.clone());
} else { } else {
UtfHelpper.writeCharToUtf8(c, writer); UtfHelpper.writeCharToUtf8(c, writer);
} }
} }
} }
writer.write(END_PI); writer.write(END_PI.clone());
if (position == NODE_BEFORE_DOCUMENT_ELEMENT) { if (position == NODE_BEFORE_DOCUMENT_ELEMENT) {
writer.write('\n'); writer.write('\n');
} }
...@@ -810,7 +806,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi { ...@@ -810,7 +806,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
if (position == NODE_AFTER_DOCUMENT_ELEMENT) { if (position == NODE_AFTER_DOCUMENT_ELEMENT) {
writer.write('\n'); writer.write('\n');
} }
writer.write(BEGIN_COMM); writer.write(BEGIN_COMM.clone());
final String data = currentComment.getData(); final String data = currentComment.getData();
final int length = data.length(); final int length = data.length();
...@@ -818,7 +814,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi { ...@@ -818,7 +814,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) {
char c = data.charAt(i); char c = data.charAt(i);
if (c == 0x0D) { if (c == 0x0D) {
writer.write(XD); writer.write(XD.clone());
} else { } else {
if (c < 0x80) { if (c < 0x80) {
writer.write(c); writer.write(c);
...@@ -828,7 +824,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi { ...@@ -828,7 +824,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
} }
} }
writer.write(END_COMM); writer.write(END_COMM.clone());
if (position == NODE_BEFORE_DOCUMENT_ELEMENT) { if (position == NODE_BEFORE_DOCUMENT_ELEMENT) {
writer.write('\n'); writer.write('\n');
} }
...@@ -852,19 +848,19 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi { ...@@ -852,19 +848,19 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
switch (c) { switch (c) {
case '&' : case '&' :
toWrite = AMP; toWrite = AMP.clone();
break; break;
case '<' : case '<' :
toWrite = LT; toWrite = LT.clone();
break; break;
case '>' : case '>' :
toWrite = GT; toWrite = GT.clone();
break; break;
case 0xD : case 0xD :
toWrite = XD; toWrite = XD.clone();
break; break;
default : default :
...@@ -879,4 +875,18 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi { ...@@ -879,4 +875,18 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
} }
} }
// The null xmlns definition.
protected Attr getNullNode(Document ownerDocument) {
if (nullNode == null) {
try {
nullNode = ownerDocument.createAttributeNS(
Constants.NamespaceSpecNS, XMLNS);
nullNode.setValue("");
} catch (Exception e) {
throw new RuntimeException("Unable to create nullNode: " + e);
}
}
return nullNode;
}
} }
/* /*
* Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2013, 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
...@@ -660,7 +660,7 @@ public class XmlReaderContentHandler extends DefaultHandler { ...@@ -660,7 +660,7 @@ public class XmlReaderContentHandler extends DefaultHandler {
//Added the handling for Class tags to take care of maps //Added the handling for Class tags to take care of maps
//Makes an entry into the map upon end of class tag //Makes an entry into the map upon end of class tag
try{ try{
typeMap.put(Key_map,Class.forName(Value_map)); typeMap.put(Key_map,sun.reflect.misc.ReflectUtil.forName(Value_map));
}catch(ClassNotFoundException ex) { }catch(ClassNotFoundException ex) {
throw new SAXException(MessageFormat.format(resBundle.handleGetObject("xmlrch.errmap").toString(), ex.getMessage())); throw new SAXException(MessageFormat.format(resBundle.handleGetObject("xmlrch.errmap").toString(), ex.getMessage()));
......
...@@ -1114,11 +1114,8 @@ class SecurityManager { ...@@ -1114,11 +1114,8 @@ class SecurityManager {
* calling thread is not allowed to wait for a connection request on * calling thread is not allowed to wait for a connection request on
* the specified local port number. * the specified local port number.
* <p> * <p>
* If port is not 0, this method calls * This method calls <code>checkPermission</code> with the
* <code>checkPermission</code> with the
* <code>SocketPermission("localhost:"+port,"listen")</code>. * <code>SocketPermission("localhost:"+port,"listen")</code>.
* If port is zero, this method calls <code>checkPermission</code>
* with <code>SocketPermission("localhost:1024-","listen").</code>
* <p> * <p>
* If you override this method, then you should make a call to * If you override this method, then you should make a call to
* <code>super.checkListen</code> * <code>super.checkListen</code>
...@@ -1131,12 +1128,8 @@ class SecurityManager { ...@@ -1131,12 +1128,8 @@ class SecurityManager {
* @see #checkPermission(java.security.Permission) checkPermission * @see #checkPermission(java.security.Permission) checkPermission
*/ */
public void checkListen(int port) { public void checkListen(int port) {
if (port == 0) { checkPermission(new SocketPermission("localhost:"+port,
checkPermission(SecurityConstants.LOCAL_LISTEN_PERMISSION); SecurityConstants.SOCKET_LISTEN_ACTION));
} else {
checkPermission(new SocketPermission("localhost:"+port,
SecurityConstants.SOCKET_LISTEN_ACTION));
}
} }
/** /**
......
...@@ -638,6 +638,12 @@ class InvokerBytecodeGenerator { ...@@ -638,6 +638,12 @@ class InvokerBytecodeGenerator {
refKind = REF_invokeVirtual; refKind = REF_invokeVirtual;
} }
if (member.getDeclaringClass().isInterface() && refKind == REF_invokeVirtual) {
// Methods from Object declared in an interface can be resolved by JVM to invokevirtual kind.
// Need to convert it back to invokeinterface to pass verification and make the invocation works as expected.
refKind = REF_invokeInterface;
}
// push arguments // push arguments
for (int i = 0; i < name.arguments.length; i++) { for (int i = 0; i < name.arguments.length; i++) {
emitPushArgument(name, i); emitPushArgument(name, i);
......
...@@ -272,7 +272,9 @@ class Socket implements java.io.Closeable { ...@@ -272,7 +272,9 @@ class Socket implements java.io.Closeable {
* {@code zero} for a system selected free port. * {@code zero} for a system selected free port.
* @exception IOException if an I/O error occurs when creating the socket. * @exception IOException if an I/O error occurs when creating the socket.
* @exception SecurityException if a security manager exists and its * @exception SecurityException if a security manager exists and its
* {@code checkConnect} method doesn't allow the operation. * {@code checkConnect} method doesn't allow the connection
* to the destination, or if its {@code checkListen} method
* doesn't allow the bind to the local port.
* @exception IllegalArgumentException if the port parameter or localPort * @exception IllegalArgumentException if the port parameter or localPort
* parameter is outside the specified range of valid port values, * parameter is outside the specified range of valid port values,
* which is between 0 and 65535, inclusive. * which is between 0 and 65535, inclusive.
...@@ -311,7 +313,9 @@ class Socket implements java.io.Closeable { ...@@ -311,7 +313,9 @@ class Socket implements java.io.Closeable {
* {@code zero} for a system selected free port. * {@code zero} for a system selected free port.
* @exception IOException if an I/O error occurs when creating the socket. * @exception IOException if an I/O error occurs when creating the socket.
* @exception SecurityException if a security manager exists and its * @exception SecurityException if a security manager exists and its
* {@code checkConnect} method doesn't allow the operation. * {@code checkConnect} method doesn't allow the connection
* to the destination, or if its {@code checkListen} method
* doesn't allow the bind to the local port.
* @exception IllegalArgumentException if the port parameter or localPort * @exception IllegalArgumentException if the port parameter or localPort
* parameter is outside the specified range of valid port values, * parameter is outside the specified range of valid port values,
* which is between 0 and 65535, inclusive. * which is between 0 and 65535, inclusive.
...@@ -609,6 +613,9 @@ class Socket implements java.io.Closeable { ...@@ -609,6 +613,9 @@ class Socket implements java.io.Closeable {
* is already bound. * is already bound.
* @throws IllegalArgumentException if bindpoint is a * @throws IllegalArgumentException if bindpoint is a
* SocketAddress subclass not supported by this socket * SocketAddress subclass not supported by this socket
* @throws SecurityException if a security manager exists and its
* {@code checkListen} method doesn't allow the bind
* to the local port.
* *
* @since 1.4 * @since 1.4
* @see #isBound * @see #isBound
...@@ -630,6 +637,10 @@ class Socket implements java.io.Closeable { ...@@ -630,6 +637,10 @@ class Socket implements java.io.Closeable {
InetAddress addr = epoint.getAddress(); InetAddress addr = epoint.getAddress();
int port = epoint.getPort(); int port = epoint.getPort();
checkAddress (addr, "bind"); checkAddress (addr, "bind");
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkListen(port);
}
getImpl().bind (addr, port); getImpl().bind (addr, port);
bound = true; bound = true;
} }
......
...@@ -34,6 +34,9 @@ import java.util.StringTokenizer; ...@@ -34,6 +34,9 @@ import java.util.StringTokenizer;
import java.net.InetAddress; import java.net.InetAddress;
import java.security.Permission; import java.security.Permission;
import java.security.PermissionCollection; import java.security.PermissionCollection;
import java.security.PrivilegedAction;
import java.security.AccessController;
import java.security.Security;
import java.io.Serializable; import java.io.Serializable;
import java.io.ObjectStreamField; import java.io.ObjectStreamField;
import java.io.ObjectOutputStream; import java.io.ObjectOutputStream;
...@@ -41,6 +44,7 @@ import java.io.ObjectInputStream; ...@@ -41,6 +44,7 @@ import java.io.ObjectInputStream;
import java.io.IOException; import java.io.IOException;
import sun.net.util.IPAddressUtil; import sun.net.util.IPAddressUtil;
import sun.net.RegisteredDomain; import sun.net.RegisteredDomain;
import sun.net.PortConfig;
import sun.security.util.SecurityConstants; import sun.security.util.SecurityConstants;
import sun.security.util.Debug; import sun.security.util.Debug;
...@@ -89,6 +93,9 @@ import sun.security.util.Debug; ...@@ -89,6 +93,9 @@ import sun.security.util.Debug;
* form "N-", where <i>N</i> is a port number, signifies all ports * form "N-", where <i>N</i> is a port number, signifies all ports
* numbered <i>N</i> and above, while a specification of the * numbered <i>N</i> and above, while a specification of the
* form "-N" indicates all ports numbered <i>N</i> and below. * form "-N" indicates all ports numbered <i>N</i> and below.
* The special port value {@code 0} refers to the entire <i>ephemeral</i>
* port range. This is a fixed range of ports a system may use to
* allocate dynamic ports from. The actual range may be system dependent.
* <p> * <p>
* The possible ways to connect to the host are * The possible ways to connect to the host are
* <pre> * <pre>
...@@ -97,7 +104,8 @@ import sun.security.util.Debug; ...@@ -97,7 +104,8 @@ import sun.security.util.Debug;
* listen * listen
* resolve * resolve
* </pre> * </pre>
* The "listen" action is only meaningful when used with "localhost". * The "listen" action is only meaningful when used with "localhost" and
* means the ability to bind to a specified port.
* The "resolve" action is implied when any of the other actions are present. * The "resolve" action is implied when any of the other actions are present.
* The action "resolve" refers to host/ip name service lookups. * The action "resolve" refers to host/ip name service lookups.
* <P> * <P>
...@@ -176,6 +184,7 @@ public final class SocketPermission extends Permission ...@@ -176,6 +184,7 @@ public final class SocketPermission extends Permission
private static final int PORT_MIN = 0; private static final int PORT_MIN = 0;
private static final int PORT_MAX = 65535; private static final int PORT_MAX = 65535;
private static final int PRIV_PORT_MAX = 1023; private static final int PRIV_PORT_MAX = 1023;
private static final int DEF_EPH_LOW = 49152;
// the actions mask // the actions mask
private transient int mask; private transient int mask;
...@@ -226,6 +235,14 @@ public final class SocketPermission extends Permission ...@@ -226,6 +235,14 @@ public final class SocketPermission extends Permission
private static Debug debug = null; private static Debug debug = null;
private static boolean debugInit = false; private static boolean debugInit = false;
// ephemeral port range for this system
private static final int ephemeralLow = initEphemeralPorts(
"low", DEF_EPH_LOW
);
private static final int ephemeralHigh = initEphemeralPorts(
"high", PORT_MAX
);
static { static {
Boolean tmp = java.security.AccessController.doPrivileged( Boolean tmp = java.security.AccessController.doPrivileged(
new sun.security.action.GetBooleanAction("sun.net.trustNameService")); new sun.security.action.GetBooleanAction("sun.net.trustNameService"));
...@@ -359,6 +376,14 @@ public final class SocketPermission extends Permission ...@@ -359,6 +376,14 @@ public final class SocketPermission extends Permission
} }
} }
/**
* Returns true if the permission has specified zero
* as its value (or lower bound) signifying the ephemeral range
*/
private boolean includesEphemerals() {
return portrange[0] == 0;
}
/** /**
* Initialize the SocketPermission object. We don't do any DNS lookups * Initialize the SocketPermission object. We don't do any DNS lookups
* as this point, instead we hold off until the implies method is * as this point, instead we hold off until the implies method is
...@@ -850,10 +875,21 @@ public final class SocketPermission extends Permission ...@@ -850,10 +875,21 @@ public final class SocketPermission extends Permission
int i,j; int i,j;
if ((that.mask & RESOLVE) != that.mask) { if ((that.mask & RESOLVE) != that.mask) {
// check port range
// check simple port range
if ((that.portrange[0] < this.portrange[0]) || if ((that.portrange[0] < this.portrange[0]) ||
(that.portrange[1] > this.portrange[1])) { (that.portrange[1] > this.portrange[1])) {
// if either includes the ephemeral range, do full check
if (this.includesEphemerals() || that.includesEphemerals()) {
if (!inRange(this.portrange[0], this.portrange[1],
that.portrange[0], that.portrange[1]))
{
return false;
}
} else {
return false; return false;
}
} }
} }
...@@ -1168,6 +1204,75 @@ public final class SocketPermission extends Permission ...@@ -1168,6 +1204,75 @@ public final class SocketPermission extends Permission
init(getName(),getMask(actions)); init(getName(),getMask(actions));
} }
/**
* Check the system/security property for the ephemeral port range
* for this system. The suffix is either "high" or "low"
*/
private static int initEphemeralPorts(String suffix, int defval) {
return AccessController.doPrivileged(
new PrivilegedAction<Integer>(){
public Integer run() {
int val = Integer.getInteger(
"jdk.net.ephemeralPortRange."+suffix, -1
);
if (val != -1) {
return val;
} else {
return suffix.equals("low") ?
PortConfig.getLower() : PortConfig.getUpper();
}
}
}
);
}
/**
* Check if the target range is within the policy range
* together with the ephemeral range for this platform
* (if policy includes ephemeral range)
*/
private static boolean inRange(
int policyLow, int policyHigh, int targetLow, int targetHigh
)
{
if (targetLow == 0) {
// check policy includes ephemeral range
if (!inRange(policyLow, policyHigh, ephemeralLow, ephemeralHigh)) {
return false;
}
if (targetHigh == 0) {
// nothing left to do
return true;
}
// continue check with first real port number
targetLow = 1;
}
if (policyLow == 0 && policyHigh == 0) {
// ephemeral range only
return targetLow >= ephemeralLow && targetHigh <= ephemeralHigh;
}
if (policyLow != 0) {
// simple check of policy only
return targetLow >= policyLow && targetHigh <= policyHigh;
}
// policyLow == 0 which means possibly two ranges to check
// first check if policy and ephem range overlap/contiguous
if (policyHigh >= ephemeralLow - 1) {
return targetHigh <= ephemeralHigh;
}
// policy and ephem range do not overlap
// target range must lie entirely inside policy range or eph range
return (targetLow <= policyHigh && targetHigh <= policyHigh) ||
(targetLow >= ephemeralLow && targetHigh <= ephemeralHigh);
}
/* /*
public String toString() public String toString()
{ {
......
...@@ -200,6 +200,10 @@ public abstract class AsynchronousSocketChannel ...@@ -200,6 +200,10 @@ public abstract class AsynchronousSocketChannel
* @throws UnsupportedAddressTypeException {@inheritDoc} * @throws UnsupportedAddressTypeException {@inheritDoc}
* @throws ClosedChannelException {@inheritDoc} * @throws ClosedChannelException {@inheritDoc}
* @throws IOException {@inheritDoc} * @throws IOException {@inheritDoc}
* @throws SecurityException
* If a security manager has been installed and its
* {@link SecurityManager#checkListen checkListen} method denies
* the operation
*/ */
@Override @Override
public abstract AsynchronousSocketChannel bind(SocketAddress local) public abstract AsynchronousSocketChannel bind(SocketAddress local)
......
...@@ -227,6 +227,10 @@ public abstract class SocketChannel ...@@ -227,6 +227,10 @@ public abstract class SocketChannel
* @throws UnsupportedAddressTypeException {@inheritDoc} * @throws UnsupportedAddressTypeException {@inheritDoc}
* @throws ClosedChannelException {@inheritDoc} * @throws ClosedChannelException {@inheritDoc}
* @throws IOException {@inheritDoc} * @throws IOException {@inheritDoc}
* @throws SecurityException
* If a security manager has been installed and its
* {@link SecurityManager#checkListen checkListen} method denies
* the operation
* *
* @since 1.7 * @since 1.7
*/ */
......
...@@ -53,6 +53,13 @@ import sun.misc.SharedSecrets; ...@@ -53,6 +53,13 @@ import sun.misc.SharedSecrets;
* or method in this class will cause a {@link NullPointerException} to be * or method in this class will cause a {@link NullPointerException} to be
* thrown. * thrown.
* *
* If the verify flag is on when opening a signed jar file, the content of the
* file is verified against its signature embedded inside the file. Please note
* that the verification process does not include validating the signer's
* certificate. A caller should inspect the return value of
* {@link JarEntry#getCodeSigners()} to further determine if the signature
* can be trusted.
*
* @author David Connelly * @author David Connelly
* @see Manifest * @see Manifest
* @see java.util.zip.ZipFile * @see java.util.zip.ZipFile
......
...@@ -179,7 +179,9 @@ class JarVerifier { ...@@ -179,7 +179,9 @@ class JarVerifier {
name = name.substring(1); name = name.substring(1);
// only set the jev object for entries that have a signature // only set the jev object for entries that have a signature
if (sigFileSigners.get(name) != null) { // (either verified or not)
if (sigFileSigners.get(name) != null ||
verifiedSigners.get(name) != null) {
mev.setEntry(name, je); mev.setEntry(name, je);
return; return;
} }
......
...@@ -248,6 +248,11 @@ public class LogManager { ...@@ -248,6 +248,11 @@ public class LogManager {
* retrieved by calling LogManager.getLogManager. * retrieved by calling LogManager.getLogManager.
*/ */
protected LogManager() { protected LogManager() {
this(checkSubclassPermissions());
}
private LogManager(Void checked) {
// Add a shutdown hook to close the global handlers. // Add a shutdown hook to close the global handlers.
try { try {
Runtime.getRuntime().addShutdownHook(new Cleaner()); Runtime.getRuntime().addShutdownHook(new Cleaner());
...@@ -257,6 +262,19 @@ public class LogManager { ...@@ -257,6 +262,19 @@ public class LogManager {
} }
} }
private static Void checkSubclassPermissions() {
final SecurityManager sm = System.getSecurityManager();
if (sm != null) {
// These permission will be checked in the LogManager constructor,
// in order to register the Cleaner() thread as a shutdown hook.
// Check them here to avoid the penalty of constructing the object
// etc...
sm.checkPermission(new RuntimePermission("shutdownHooks"));
sm.checkPermission(new RuntimePermission("setContextClassLoader"));
}
return null;
}
/** /**
* Lazy initialization: if this instance of manager is the global * Lazy initialization: if this instance of manager is the global
* manager then this method will read the initial configuration and * manager then this method will read the initial configuration and
......
/* /*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013, 2014, 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
...@@ -446,7 +446,7 @@ abstract class DoublePipeline<E_IN> ...@@ -446,7 +446,7 @@ abstract class DoublePipeline<E_IN>
@Override @Override
public final long count() { public final long count() {
return mapToObj(e -> null).mapToInt(e -> 1).sum(); return mapToLong(e -> 1L).sum();
} }
@Override @Override
......
/* /*
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * 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
...@@ -426,7 +426,7 @@ abstract class IntPipeline<E_IN> ...@@ -426,7 +426,7 @@ abstract class IntPipeline<E_IN>
@Override @Override
public final long count() { public final long count() {
return asLongStream().map(e -> 1L).sum(); return mapToLong(e -> 1L).sum();
} }
@Override @Override
......
...@@ -91,7 +91,10 @@ public final class SimpleDoc implements Doc { ...@@ -91,7 +91,10 @@ public final class SimpleDoc implements Doc {
Class repClass = null; Class repClass = null;
try { try {
repClass = Class.forName(flavor.getRepresentationClassName()); String className = flavor.getRepresentationClassName();
sun.reflect.misc.ReflectUtil.checkPackageAccess(className);
repClass = Class.forName(className, false,
Thread.currentThread().getContextClassLoader());
} catch (Throwable e) { } catch (Throwable e) {
throw new IllegalArgumentException("unknown representation class"); throw new IllegalArgumentException("unknown representation class");
} }
......
...@@ -26,6 +26,10 @@ ...@@ -26,6 +26,10 @@
package javax.security.auth; package javax.security.auth;
import java.security.Security; import java.security.Security;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.security.PrivilegedExceptionAction;
import java.util.Objects;
import sun.security.util.Debug; import sun.security.util.Debug;
/** /**
...@@ -155,22 +159,15 @@ import sun.security.util.Debug; ...@@ -155,22 +159,15 @@ import sun.security.util.Debug;
public abstract class Policy { public abstract class Policy {
private static Policy policy; private static Policy policy;
private static ClassLoader contextClassLoader;
private final static String AUTH_POLICY = private final static String AUTH_POLICY =
"sun.security.provider.AuthPolicyFile"; "sun.security.provider.AuthPolicyFile";
private final java.security.AccessControlContext acc =
java.security.AccessController.getContext();
// true if a custom (not AUTH_POLICY) system-wide policy object is set // true if a custom (not AUTH_POLICY) system-wide policy object is set
private static boolean isCustomPolicy; private static boolean isCustomPolicy;
static {
contextClassLoader = java.security.AccessController.doPrivileged
(new java.security.PrivilegedAction<ClassLoader>() {
public ClassLoader run() {
return Thread.currentThread().getContextClassLoader();
}
});
};
/** /**
* Sole constructor. (For invocation by subclass constructors, typically * Sole constructor. (For invocation by subclass constructors, typically
* implicit.) * implicit.)
...@@ -213,8 +210,8 @@ public abstract class Policy { ...@@ -213,8 +210,8 @@ public abstract class Policy {
if (policy == null) { if (policy == null) {
String policy_class = null; String policy_class = null;
policy_class = java.security.AccessController.doPrivileged policy_class = AccessController.doPrivileged
(new java.security.PrivilegedAction<String>() { (new PrivilegedAction<String>() {
public String run() { public String run() {
return java.security.Security.getProperty return java.security.Security.getProperty
("auth.policy.provider"); ("auth.policy.provider");
...@@ -226,18 +223,28 @@ public abstract class Policy { ...@@ -226,18 +223,28 @@ public abstract class Policy {
try { try {
final String finalClass = policy_class; final String finalClass = policy_class;
policy = java.security.AccessController.doPrivileged
(new java.security.PrivilegedExceptionAction<Policy>() { Policy untrustedImpl = AccessController.doPrivileged(
public Policy run() throws ClassNotFoundException, new PrivilegedExceptionAction<Policy>() {
InstantiationException, public Policy run() throws ClassNotFoundException,
IllegalAccessException { InstantiationException,
return (Policy) Class.forName IllegalAccessException {
(finalClass, Class<? extends Policy> implClass = Class.forName(
true, finalClass, false,
contextClassLoader).newInstance(); Thread.currentThread().getContextClassLoader()
} ).asSubclass(Policy.class);
}); return implClass.newInstance();
isCustomPolicy = !finalClass.equals(AUTH_POLICY); }
});
AccessController.doPrivileged(
new PrivilegedExceptionAction<Void>() {
public Void run() {
setPolicy(untrustedImpl);
isCustomPolicy = !finalClass.equals(AUTH_POLICY);
return null;
}
}, Objects.requireNonNull(untrustedImpl.acc)
);
} catch (Exception e) { } catch (Exception e) {
throw new SecurityException throw new SecurityException
(sun.security.util.ResourcesMgr.getString (sun.security.util.ResourcesMgr.getString
......
...@@ -964,6 +964,10 @@ public final class Subject implements java.io.Serializable { ...@@ -964,6 +964,10 @@ public final class Subject implements java.io.Serializable {
s.defaultReadObject(); s.defaultReadObject();
// Rewrap the principals into a SecureSet
principals = Collections.synchronizedSet(new SecureSet<Principal>
(this, PRINCIPAL_SET, principals));
// The Credential {@code Set} is not serialized, but we do not // The Credential {@code Set} is not serialized, but we do not
// want the default deserialization routine to set it to null. // want the default deserialization routine to set it to null.
this.pubCredentials = Collections.synchronizedSet this.pubCredentials = Collections.synchronizedSet
......
...@@ -27,9 +27,6 @@ package javax.security.auth.login; ...@@ -27,9 +27,6 @@ package javax.security.auth.login;
import javax.security.auth.AuthPermission; import javax.security.auth.AuthPermission;
import java.io.*;
import java.util.*;
import java.net.URI;
import java.security.AccessController; import java.security.AccessController;
import java.security.PrivilegedAction; import java.security.PrivilegedAction;
import java.security.PrivilegedExceptionAction; import java.security.PrivilegedExceptionAction;
...@@ -38,7 +35,7 @@ import java.security.NoSuchAlgorithmException; ...@@ -38,7 +35,7 @@ import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException; import java.security.NoSuchProviderException;
import java.security.Provider; import java.security.Provider;
import java.security.Security; import java.security.Security;
import java.security.SecurityPermission; import java.util.Objects;
import sun.security.jca.GetInstance; import sun.security.jca.GetInstance;
...@@ -191,16 +188,9 @@ import sun.security.jca.GetInstance; ...@@ -191,16 +188,9 @@ import sun.security.jca.GetInstance;
public abstract class Configuration { public abstract class Configuration {
private static Configuration configuration; private static Configuration configuration;
private static ClassLoader contextClassLoader;
static { private final java.security.AccessControlContext acc =
contextClassLoader = AccessController.doPrivileged java.security.AccessController.getContext();
(new PrivilegedAction<ClassLoader>() {
public ClassLoader run() {
return Thread.currentThread().getContextClassLoader();
}
});
};
private static void checkPermission(String type) { private static void checkPermission(String type) {
SecurityManager sm = System.getSecurityManager(); SecurityManager sm = System.getSecurityManager();
...@@ -253,17 +243,26 @@ public abstract class Configuration { ...@@ -253,17 +243,26 @@ public abstract class Configuration {
try { try {
final String finalClass = config_class; final String finalClass = config_class;
configuration = AccessController.doPrivileged Configuration untrustedImpl = AccessController.doPrivileged(
(new PrivilegedExceptionAction<Configuration>() { new PrivilegedExceptionAction<Configuration>() {
public Configuration run() throws ClassNotFoundException, public Configuration run() throws ClassNotFoundException,
InstantiationException, InstantiationException,
IllegalAccessException { IllegalAccessException {
return (Configuration)Class.forName Class<? extends Configuration> implClass = Class.forName(
(finalClass, finalClass, false,
true, Thread.currentThread().getContextClassLoader()
contextClassLoader).newInstance(); ).asSubclass(Configuration.class);
} return implClass.newInstance();
}); }
});
AccessController.doPrivileged(
new PrivilegedExceptionAction<Void>() {
public Void run() {
setConfiguration(untrustedImpl);
return null;
}
}, Objects.requireNonNull(untrustedImpl.acc)
);
} catch (PrivilegedActionException e) { } catch (PrivilegedActionException e) {
Exception ee = e.getException(); Exception ee = e.getException();
if (ee instanceof InstantiationException) { if (ee instanceof InstantiationException) {
......
...@@ -209,8 +209,7 @@ public class LoginContext { ...@@ -209,8 +209,7 @@ public class LoginContext {
private Map<String,?> state = new HashMap<String,Object>(); private Map<String,?> state = new HashMap<String,Object>();
private Configuration config; private Configuration config;
private boolean configProvided = false; private AccessControlContext creatorAcc = null; // customized config only
private AccessControlContext creatorAcc = null;
private ModuleInfo[] moduleStack; private ModuleInfo[] moduleStack;
private ClassLoader contextClassLoader = null; private ClassLoader contextClassLoader = null;
private static final Class<?>[] PARAMS = { }; private static final Class<?>[] PARAMS = { };
...@@ -229,7 +228,7 @@ public class LoginContext { ...@@ -229,7 +228,7 @@ public class LoginContext {
private void init(String name) throws LoginException { private void init(String name) throws LoginException {
SecurityManager sm = System.getSecurityManager(); SecurityManager sm = System.getSecurityManager();
if (sm != null && !configProvided) { if (sm != null && creatorAcc == null) {
sm.checkPermission(new AuthPermission sm.checkPermission(new AuthPermission
("createLoginContext." + name)); ("createLoginContext." + name));
} }
...@@ -252,7 +251,7 @@ public class LoginContext { ...@@ -252,7 +251,7 @@ public class LoginContext {
AppConfigurationEntry[] entries = config.getAppConfigurationEntry(name); AppConfigurationEntry[] entries = config.getAppConfigurationEntry(name);
if (entries == null) { if (entries == null) {
if (sm != null && !configProvided) { if (sm != null && creatorAcc == null) {
sm.checkPermission(new AuthPermission sm.checkPermission(new AuthPermission
("createLoginContext." + OTHER)); ("createLoginContext." + OTHER));
} }
...@@ -279,7 +278,15 @@ public class LoginContext { ...@@ -279,7 +278,15 @@ public class LoginContext {
contextClassLoader = java.security.AccessController.doPrivileged contextClassLoader = java.security.AccessController.doPrivileged
(new java.security.PrivilegedAction<ClassLoader>() { (new java.security.PrivilegedAction<ClassLoader>() {
public ClassLoader run() { public ClassLoader run() {
return Thread.currentThread().getContextClassLoader(); ClassLoader loader =
Thread.currentThread().getContextClassLoader();
if (loader == null) {
// Don't use bootstrap class loader directly to ensure
// proper package access control!
loader = ClassLoader.getSystemClassLoader();
}
return loader;
} }
}); });
} }
...@@ -298,10 +305,10 @@ public class LoginContext { ...@@ -298,10 +305,10 @@ public class LoginContext {
(DEFAULT_HANDLER); (DEFAULT_HANDLER);
if (defaultHandler == null || defaultHandler.length() == 0) if (defaultHandler == null || defaultHandler.length() == 0)
return null; return null;
Class<?> c = Class.forName(defaultHandler, Class<? extends CallbackHandler> c = Class.forName(
true, defaultHandler, true,
finalLoader); finalLoader).asSubclass(CallbackHandler.class);
return (CallbackHandler)c.newInstance(); return c.newInstance();
} }
}); });
} catch (java.security.PrivilegedActionException pae) { } catch (java.security.PrivilegedActionException pae) {
...@@ -309,7 +316,7 @@ public class LoginContext { ...@@ -309,7 +316,7 @@ public class LoginContext {
} }
// secure it with the caller's ACC // secure it with the caller's ACC
if (this.callbackHandler != null && !configProvided) { if (this.callbackHandler != null && creatorAcc == null) {
this.callbackHandler = new SecureCallbackHandler this.callbackHandler = new SecureCallbackHandler
(java.security.AccessController.getContext(), (java.security.AccessController.getContext(),
this.callbackHandler); this.callbackHandler);
...@@ -498,8 +505,7 @@ public class LoginContext { ...@@ -498,8 +505,7 @@ public class LoginContext {
CallbackHandler callbackHandler, CallbackHandler callbackHandler,
Configuration config) throws LoginException { Configuration config) throws LoginException {
this.config = config; this.config = config;
configProvided = (config != null) ? true : false; if (config != null) {
if (configProvided) {
creatorAcc = java.security.AccessController.getContext(); creatorAcc = java.security.AccessController.getContext();
} }
...@@ -510,7 +516,7 @@ public class LoginContext { ...@@ -510,7 +516,7 @@ public class LoginContext {
} }
if (callbackHandler == null) { if (callbackHandler == null) {
loadDefaultCallbackHandler(); loadDefaultCallbackHandler();
} else if (!configProvided) { } else if (creatorAcc == null) {
this.callbackHandler = new SecureCallbackHandler this.callbackHandler = new SecureCallbackHandler
(java.security.AccessController.getContext(), (java.security.AccessController.getContext(),
callbackHandler); callbackHandler);
...@@ -577,23 +583,13 @@ public class LoginContext { ...@@ -577,23 +583,13 @@ public class LoginContext {
} }
try { try {
if (configProvided) { // module invoked in doPrivileged
// module invoked in doPrivileged with creatorAcc invokePriv(LOGIN_METHOD);
invokeCreatorPriv(LOGIN_METHOD); invokePriv(COMMIT_METHOD);
invokeCreatorPriv(COMMIT_METHOD);
} else {
// module invoked in doPrivileged
invokePriv(LOGIN_METHOD);
invokePriv(COMMIT_METHOD);
}
loginSucceeded = true; loginSucceeded = true;
} catch (LoginException le) { } catch (LoginException le) {
try { try {
if (configProvided) { invokePriv(ABORT_METHOD);
invokeCreatorPriv(ABORT_METHOD);
} else {
invokePriv(ABORT_METHOD);
}
} catch (LoginException le2) { } catch (LoginException le2) {
throw le; throw le;
} }
...@@ -628,13 +624,8 @@ public class LoginContext { ...@@ -628,13 +624,8 @@ public class LoginContext {
("null.subject.logout.called.before.login")); ("null.subject.logout.called.before.login"));
} }
if (configProvided) { // module invoked in doPrivileged
// module invoked in doPrivileged with creatorAcc invokePriv(LOGOUT_METHOD);
invokeCreatorPriv(LOGOUT_METHOD);
} else {
// module invoked in doPrivileged
invokePriv(LOGOUT_METHOD);
}
} }
/** /**
...@@ -677,35 +668,13 @@ public class LoginContext { ...@@ -677,35 +668,13 @@ public class LoginContext {
/** /**
* Invokes the login, commit, and logout methods * Invokes the login, commit, and logout methods
* from a LoginModule inside a doPrivileged block. * from a LoginModule inside a doPrivileged block restricted
* by creatorAcc (may be null).
* *
* This version is called if the caller did not instantiate * This version is called if the caller did not instantiate
* the LoginContext with a Configuration object. * the LoginContext with a Configuration object.
*/ */
private void invokePriv(final String methodName) throws LoginException { private void invokePriv(final String methodName) throws LoginException {
try {
java.security.AccessController.doPrivileged
(new java.security.PrivilegedExceptionAction<Void>() {
public Void run() throws LoginException {
invoke(methodName);
return null;
}
});
} catch (java.security.PrivilegedActionException pae) {
throw (LoginException)pae.getException();
}
}
/**
* Invokes the login, commit, and logout methods
* from a LoginModule inside a doPrivileged block restricted
* by creatorAcc
*
* This version is called if the caller instantiated
* the LoginContext with a Configuration object.
*/
private void invokeCreatorPriv(final String methodName)
throws LoginException {
try { try {
java.security.AccessController.doPrivileged java.security.AccessController.doPrivileged
(new java.security.PrivilegedExceptionAction<Void>() { (new java.security.PrivilegedExceptionAction<Void>() {
...@@ -735,24 +704,24 @@ public class LoginContext { ...@@ -735,24 +704,24 @@ public class LoginContext {
} else { } else {
// instantiate the LoginModule // instantiate the LoginModule
Class<?> c = Class.forName //
(moduleStack[i].entry.getLoginModuleName(), // Allow any object to be a LoginModule as long as it
// conforms to the interface.
Class<?> c = Class.forName(
moduleStack[i].entry.getLoginModuleName(),
true, true,
contextClassLoader); contextClassLoader);
Constructor<?> constructor = c.getConstructor(PARAMS); Constructor<?> constructor = c.getConstructor(PARAMS);
Object[] args = { }; Object[] args = { };
// allow any object to be a LoginModule
// as long as it conforms to the interface
moduleStack[i].module = constructor.newInstance(args); moduleStack[i].module = constructor.newInstance(args);
methods = moduleStack[i].module.getClass().getMethods();
// call the LoginModule's initialize method // call the LoginModule's initialize method
methods = moduleStack[i].module.getClass().getMethods();
for (mIndex = 0; mIndex < methods.length; mIndex++) { for (mIndex = 0; mIndex < methods.length; mIndex++) {
if (methods[mIndex].getName().equals(INIT_METHOD)) if (methods[mIndex].getName().equals(INIT_METHOD)) {
break; break;
}
} }
Object[] initArgs = {subject, Object[] initArgs = {subject,
...@@ -760,19 +729,28 @@ public class LoginContext { ...@@ -760,19 +729,28 @@ public class LoginContext {
state, state,
moduleStack[i].entry.getOptions() }; moduleStack[i].entry.getOptions() };
// invoke the LoginModule initialize method // invoke the LoginModule initialize method
//
// Throws ArrayIndexOutOfBoundsException if no such
// method defined. May improve to use LoginException in
// the future.
methods[mIndex].invoke(moduleStack[i].module, initArgs); methods[mIndex].invoke(moduleStack[i].module, initArgs);
} }
// find the requested method in the LoginModule // find the requested method in the LoginModule
for (mIndex = 0; mIndex < methods.length; mIndex++) { for (mIndex = 0; mIndex < methods.length; mIndex++) {
if (methods[mIndex].getName().equals(methodName)) if (methods[mIndex].getName().equals(methodName)) {
break; break;
}
} }
// set up the arguments to be passed to the LoginModule method // set up the arguments to be passed to the LoginModule method
Object[] args = { }; Object[] args = { };
// invoke the LoginModule method // invoke the LoginModule method
//
// Throws ArrayIndexOutOfBoundsException if no such
// method defined. May improve to use LoginException in
// the future.
boolean status = ((Boolean)methods[mIndex].invoke boolean status = ((Boolean)methods[mIndex].invoke
(moduleStack[i].module, args)).booleanValue(); (moduleStack[i].module, args)).booleanValue();
......
...@@ -35,6 +35,8 @@ import java.io.FileInputStream; ...@@ -35,6 +35,8 @@ import java.io.FileInputStream;
import java.io.InputStream; import java.io.InputStream;
import java.io.IOException; import java.io.IOException;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.security.AccessController;
import java.security.PrivilegedAction;
import javax.naming.*; import javax.naming.*;
...@@ -348,7 +350,17 @@ public class SyncFactory { ...@@ -348,7 +350,17 @@ public class SyncFactory {
/* /*
* Dependent on application * Dependent on application
*/ */
String strRowsetProperties = System.getProperty("rowset.properties"); String strRowsetProperties;
try {
strRowsetProperties = AccessController.doPrivileged(new PrivilegedAction<String>() {
public String run() {
return System.getProperty("rowset.properties");
}
}, null, new PropertyPermission("rowset.properties","read"));
} catch (Exception ex) {
strRowsetProperties = null;
}
if (strRowsetProperties != null) { if (strRowsetProperties != null) {
// Load user's implementation of SyncProvider // Load user's implementation of SyncProvider
// here. -Drowset.properties=/abc/def/pqr.txt // here. -Drowset.properties=/abc/def/pqr.txt
...@@ -393,7 +405,16 @@ public class SyncFactory { ...@@ -393,7 +405,16 @@ public class SyncFactory {
* load additional properties from -D command line * load additional properties from -D command line
*/ */
properties.clear(); properties.clear();
String providerImpls = System.getProperty(ROWSET_SYNC_PROVIDER); String providerImpls;
try {
providerImpls = AccessController.doPrivileged(new PrivilegedAction<String>() {
public String run() {
return System.getProperty(ROWSET_SYNC_PROVIDER);
}
}, null, new PropertyPermission(ROWSET_SYNC_PROVIDER,"read"));
} catch (Exception ex) {
providerImpls = null;
}
if (providerImpls != null) { if (providerImpls != null) {
int i = 0; int i = 0;
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
*/ */
package javax.swing; package javax.swing;
import sun.reflect.misc.ReflectUtil;
import sun.swing.SwingUtilities2; import sun.swing.SwingUtilities2;
import sun.swing.UIAction; import sun.swing.UIAction;
...@@ -33,9 +34,6 @@ import java.awt.*; ...@@ -33,9 +34,6 @@ import java.awt.*;
import java.awt.event.*; import java.awt.event.*;
import java.awt.dnd.DropTarget; import java.awt.dnd.DropTarget;
import java.util.Vector;
import java.util.Hashtable;
import java.lang.reflect.*; import java.lang.reflect.*;
import javax.accessibility.*; import javax.accessibility.*;
...@@ -1872,6 +1870,7 @@ public class SwingUtilities implements SwingConstants ...@@ -1872,6 +1870,7 @@ public class SwingUtilities implements SwingConstants
static Class<?> loadSystemClass(String className) throws ClassNotFoundException { static Class<?> loadSystemClass(String className) throws ClassNotFoundException {
ReflectUtil.checkPackageAccess(className);
return Class.forName(className, true, Thread.currentThread(). return Class.forName(className, true, Thread.currentThread().
getContextClassLoader()); getContextClassLoader());
} }
......
...@@ -27,6 +27,7 @@ package javax.swing.event; ...@@ -27,6 +27,7 @@ package javax.swing.event;
import java.io.*; import java.io.*;
import java.util.*; import java.util.*;
import java.lang.reflect.Array; import java.lang.reflect.Array;
import sun.reflect.misc.ReflectUtil;
/** /**
* A class that holds a list of EventListeners. A single instance * A class that holds a list of EventListeners. A single instance
...@@ -271,7 +272,9 @@ public class EventListenerList implements Serializable { ...@@ -271,7 +272,9 @@ public class EventListenerList implements Serializable {
while (null != (listenerTypeOrNull = s.readObject())) { while (null != (listenerTypeOrNull = s.readObject())) {
ClassLoader cl = Thread.currentThread().getContextClassLoader(); ClassLoader cl = Thread.currentThread().getContextClassLoader();
EventListener l = (EventListener)s.readObject(); EventListener l = (EventListener)s.readObject();
add((Class<EventListener>)Class.forName((String)listenerTypeOrNull, true, cl), l); String name = (String) listenerTypeOrNull;
ReflectUtil.checkPackageAccess(name);
add((Class<EventListener>)Class.forName(name, true, cl), l);
} }
} }
......
...@@ -428,6 +428,10 @@ abstract class AsynchronousSocketChannelImpl ...@@ -428,6 +428,10 @@ abstract class AsynchronousSocketChannelImpl
throw new AlreadyBoundException(); throw new AlreadyBoundException();
InetSocketAddress isa = (local == null) ? InetSocketAddress isa = (local == null) ?
new InetSocketAddress(0) : Net.checkAddress(local); new InetSocketAddress(0) : Net.checkAddress(local);
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
sm.checkListen(isa.getPort());
}
NetHooks.beforeTcpBind(fd, isa.getAddress(), isa.getPort()); NetHooks.beforeTcpBind(fd, isa.getAddress(), isa.getPort());
Net.bind(fd, isa.getAddress(), isa.getPort()); Net.bind(fd, isa.getAddress(), isa.getPort());
localAddress = Net.localAddress(fd); localAddress = Net.localAddress(fd);
......
...@@ -572,6 +572,10 @@ class SocketChannelImpl ...@@ -572,6 +572,10 @@ class SocketChannelImpl
throw new AlreadyBoundException(); throw new AlreadyBoundException();
InetSocketAddress isa = (local == null) ? InetSocketAddress isa = (local == null) ?
new InetSocketAddress(0) : Net.checkAddress(local); new InetSocketAddress(0) : Net.checkAddress(local);
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
sm.checkListen(isa.getPort());
}
NetHooks.beforeTcpBind(fd, isa.getAddress(), isa.getPort()); NetHooks.beforeTcpBind(fd, isa.getAddress(), isa.getPort());
Net.bind(fd, isa.getAddress(), isa.getPort()); Net.bind(fd, isa.getAddress(), isa.getPort());
localAddress = Net.localAddress(fd); localAddress = Net.localAddress(fd);
......
...@@ -28,7 +28,10 @@ package sun.reflect.generics.reflectiveObjects; ...@@ -28,7 +28,10 @@ package sun.reflect.generics.reflectiveObjects;
import java.lang.annotation.*; import java.lang.annotation.*;
import java.lang.reflect.AnnotatedType; import java.lang.reflect.AnnotatedType;
import java.lang.reflect.Array; import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.GenericDeclaration; import java.lang.reflect.GenericDeclaration;
import java.lang.reflect.Member;
import java.lang.reflect.Method;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable; import java.lang.reflect.TypeVariable;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
...@@ -40,6 +43,7 @@ import sun.reflect.annotation.AnnotationType; ...@@ -40,6 +43,7 @@ import sun.reflect.annotation.AnnotationType;
import sun.reflect.generics.factory.GenericsFactory; import sun.reflect.generics.factory.GenericsFactory;
import sun.reflect.generics.tree.FieldTypeSignature; import sun.reflect.generics.tree.FieldTypeSignature;
import sun.reflect.generics.visitor.Reifier; import sun.reflect.generics.visitor.Reifier;
import sun.reflect.misc.ReflectUtil;
/** /**
* Implementation of <tt>java.lang.reflect.TypeVariable</tt> interface * Implementation of <tt>java.lang.reflect.TypeVariable</tt> interface
...@@ -95,6 +99,13 @@ public class TypeVariableImpl<D extends GenericDeclaration> ...@@ -95,6 +99,13 @@ public class TypeVariableImpl<D extends GenericDeclaration>
TypeVariableImpl<T> make(T decl, String name, TypeVariableImpl<T> make(T decl, String name,
FieldTypeSignature[] bs, FieldTypeSignature[] bs,
GenericsFactory f) { GenericsFactory f) {
if (!((decl instanceof Class) ||
(decl instanceof Method) ||
(decl instanceof Constructor))) {
throw new AssertionError("Unexpected kind of GenericDeclaration" +
decl.getClass().toString());
}
return new TypeVariableImpl<T>(decl, name, bs, f); return new TypeVariableImpl<T>(decl, name, bs, f);
} }
...@@ -149,6 +160,13 @@ public class TypeVariableImpl<D extends GenericDeclaration> ...@@ -149,6 +160,13 @@ public class TypeVariableImpl<D extends GenericDeclaration>
* @since 1.5 * @since 1.5
*/ */
public D getGenericDeclaration(){ public D getGenericDeclaration(){
if (genericDeclaration instanceof Class)
ReflectUtil.checkPackageAccess((Class)genericDeclaration);
else if ((genericDeclaration instanceof Method) ||
(genericDeclaration instanceof Constructor))
ReflectUtil.conservativeCheckMemberAccess((Member)genericDeclaration);
else
throw new AssertionError("Unexpected kind of GenericDeclaration");
return genericDeclaration; return genericDeclaration;
} }
...@@ -164,7 +182,8 @@ public class TypeVariableImpl<D extends GenericDeclaration> ...@@ -164,7 +182,8 @@ public class TypeVariableImpl<D extends GenericDeclaration>
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (o instanceof TypeVariable) { if (o instanceof TypeVariable &&
o.getClass() == TypeVariableImpl.class) {
TypeVariable<?> that = (TypeVariable<?>) o; TypeVariable<?> that = (TypeVariable<?>) o;
GenericDeclaration thatDecl = that.getGenericDeclaration(); GenericDeclaration thatDecl = that.getGenericDeclaration();
......
...@@ -26,11 +26,13 @@ ...@@ -26,11 +26,13 @@
package sun.reflect.misc; package sun.reflect.misc;
import java.lang.reflect.Member;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.lang.reflect.Proxy; import java.lang.reflect.Proxy;
import java.util.Arrays; import java.util.Arrays;
import sun.reflect.Reflection; import sun.reflect.Reflection;
import sun.security.util.SecurityConstants;
public final class ReflectUtil { public final class ReflectUtil {
...@@ -117,6 +119,40 @@ public final class ReflectUtil { ...@@ -117,6 +119,40 @@ public final class ReflectUtil {
return false; return false;
} }
/**
* Does a conservative approximation of member access check. Use this if
* you don't have an actual 'userland' caller Class/ClassLoader available.
* This might be more restrictive than a precise member access check where
* you have a caller, but should never allow a member access that is
* forbidden.
*
* @param m the {@code Member} about to be accessed
*/
public static void conservativeCheckMemberAccess(Member m) throws SecurityException{
final SecurityManager sm = System.getSecurityManager();
if (sm == null)
return;
// Check for package access on the declaring class.
//
// In addition, unless the member and the declaring class are both
// public check for access declared member permissions.
//
// This is done regardless of ClassLoader relations between the {@code
// Member m} and any potential caller.
final Class<?> declaringClass = m.getDeclaringClass();
checkPackageAccess(declaringClass);
if (Modifier.isPublic(m.getModifiers()) &&
Modifier.isPublic(declaringClass.getModifiers()))
return;
// Check for declared member access.
sm.checkPermission(SecurityConstants.CHECK_MEMBER_ACCESS_PERMISSION);
}
/** /**
* Checks package access on the given class. * Checks package access on the given class.
* *
......
...@@ -94,8 +94,23 @@ public class RegistryImpl extends java.rmi.server.RemoteServer ...@@ -94,8 +94,23 @@ public class RegistryImpl extends java.rmi.server.RemoteServer
RMIServerSocketFactory ssf) RMIServerSocketFactory ssf)
throws RemoteException throws RemoteException
{ {
LiveRef lref = new LiveRef(id, port, csf, ssf); if (port == Registry.REGISTRY_PORT && System.getSecurityManager() != null) {
setup(new UnicastServerRef2(lref)); // grant permission for default port only.
try {
AccessController.doPrivileged(new PrivilegedExceptionAction<Void>() {
public Void run() throws RemoteException {
LiveRef lref = new LiveRef(id, port, csf, ssf);
setup(new UnicastServerRef2(lref));
return null;
}
}, null, new SocketPermission("localhost:"+port, "listen,accept"));
} catch (PrivilegedActionException pae) {
throw (RemoteException)pae.getException();
}
} else {
LiveRef lref = new LiveRef(id, port, csf, ssf);
setup(new UnicastServerRef2(lref));
}
} }
/** /**
...@@ -104,8 +119,23 @@ public class RegistryImpl extends java.rmi.server.RemoteServer ...@@ -104,8 +119,23 @@ public class RegistryImpl extends java.rmi.server.RemoteServer
public RegistryImpl(int port) public RegistryImpl(int port)
throws RemoteException throws RemoteException
{ {
LiveRef lref = new LiveRef(id, port); if (port == Registry.REGISTRY_PORT && System.getSecurityManager() != null) {
setup(new UnicastServerRef(lref)); // grant permission for default port only.
try {
AccessController.doPrivileged(new PrivilegedExceptionAction<Void>() {
public Void run() throws RemoteException {
LiveRef lref = new LiveRef(id, port);
setup(new UnicastServerRef(lref));
return null;
}
}, null, new SocketPermission("localhost:"+port, "listen,accept"));
} catch (PrivilegedActionException pae) {
throw (RemoteException)pae.getException();
}
} else {
LiveRef lref = new LiveRef(id, port);
setup(new UnicastServerRef(lref));
}
} }
/* /*
...@@ -352,7 +382,7 @@ public class RegistryImpl extends java.rmi.server.RemoteServer ...@@ -352,7 +382,7 @@ public class RegistryImpl extends java.rmi.server.RemoteServer
public RegistryImpl run() throws RemoteException { public RegistryImpl run() throws RemoteException {
return new RegistryImpl(regPort); return new RegistryImpl(regPort);
} }
}, getAccessControlContext()); }, getAccessControlContext(regPort));
} catch (PrivilegedActionException ex) { } catch (PrivilegedActionException ex) {
throw (RemoteException) ex.getException(); throw (RemoteException) ex.getException();
} }
...@@ -382,7 +412,7 @@ public class RegistryImpl extends java.rmi.server.RemoteServer ...@@ -382,7 +412,7 @@ public class RegistryImpl extends java.rmi.server.RemoteServer
* The approach used here is taken from the similar method * The approach used here is taken from the similar method
* getAccessControlContext() in the sun.applet.AppletPanel class. * getAccessControlContext() in the sun.applet.AppletPanel class.
*/ */
private static AccessControlContext getAccessControlContext() { private static AccessControlContext getAccessControlContext(int port) {
// begin with permissions granted to all code in current policy // begin with permissions granted to all code in current policy
PermissionCollection perms = AccessController.doPrivileged( PermissionCollection perms = AccessController.doPrivileged(
new java.security.PrivilegedAction<PermissionCollection>() { new java.security.PrivilegedAction<PermissionCollection>() {
...@@ -404,6 +434,7 @@ public class RegistryImpl extends java.rmi.server.RemoteServer ...@@ -404,6 +434,7 @@ public class RegistryImpl extends java.rmi.server.RemoteServer
* related classes themselves are more tightly limited by RMI. * related classes themselves are more tightly limited by RMI.
*/ */
perms.add(new SocketPermission("*", "connect,accept")); perms.add(new SocketPermission("*", "connect,accept"));
perms.add(new SocketPermission("localhost:"+port, "listen,accept"));
perms.add(new RuntimePermission("accessClassInPackage.sun.jvmstat.*")); perms.add(new RuntimePermission("accessClassInPackage.sun.jvmstat.*"));
perms.add(new RuntimePermission("accessClassInPackage.sun.jvm.hotspot.*")); perms.add(new RuntimePermission("accessClassInPackage.sun.jvm.hotspot.*"));
......
/* /*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2013, 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
...@@ -45,11 +45,12 @@ public class TlsRsaPremasterSecretParameterSpec ...@@ -45,11 +45,12 @@ public class TlsRsaPremasterSecretParameterSpec
private final int majorVersion; private final int majorVersion;
private final int minorVersion; private final int minorVersion;
private final byte[] encodedSecret;
/** /**
* Constructs a new TlsRsaPremasterSecretParameterSpec. * Constructs a new TlsRsaPremasterSecretParameterSpec.
* * <P>
* <p>The version numbers will be placed inside the premaster secret to * The version numbers will be placed inside the premaster secret to
* detect version rollbacks attacks as described in the TLS specification. * detect version rollbacks attacks as described in the TLS specification.
* Note that they do not indicate the protocol version negotiated for * Note that they do not indicate the protocol version negotiated for
* the handshake. * the handshake.
...@@ -65,7 +66,42 @@ public class TlsRsaPremasterSecretParameterSpec ...@@ -65,7 +66,42 @@ public class TlsRsaPremasterSecretParameterSpec
this.majorVersion = this.majorVersion =
TlsMasterSecretParameterSpec.checkVersion(majorVersion); TlsMasterSecretParameterSpec.checkVersion(majorVersion);
this.minorVersion = this.minorVersion =
TlsMasterSecretParameterSpec.checkVersion(minorVersion); } TlsMasterSecretParameterSpec.checkVersion(minorVersion);
this.encodedSecret = null;
}
/**
* Constructs a new TlsRsaPremasterSecretParameterSpec.
* <P>
* The version numbers will be placed inside the premaster secret to
* detect version rollbacks attacks as described in the TLS specification.
* Note that they do not indicate the protocol version negotiated for
* the handshake.
* <P>
* Usually, the encoded secret key is a random number that acts as
* dummy pre_master_secret to avoid vulnerabilities described by
* section 7.4.7.1, RFC 5246.
*
* @param majorVersion the major number of the protocol version
* @param minorVersion the minor number of the protocol version
* @param encodedSecret the encoded secret key
*
* @throws IllegalArgumentException if minorVersion or majorVersion are
* negative or larger than 255, or encodedSecret is not exactly 48 bytes.
*/
public TlsRsaPremasterSecretParameterSpec(int majorVersion,
int minorVersion, byte[] encodedSecret) {
this.majorVersion =
TlsMasterSecretParameterSpec.checkVersion(majorVersion);
this.minorVersion =
TlsMasterSecretParameterSpec.checkVersion(minorVersion);
if (encodedSecret == null || encodedSecret.length != 48) {
throw new IllegalArgumentException(
"Encoded secret is not exactly 48 bytes");
}
this.encodedSecret = encodedSecret.clone();
}
/** /**
* Returns the major version. * Returns the major version.
...@@ -84,4 +120,13 @@ public class TlsRsaPremasterSecretParameterSpec ...@@ -84,4 +120,13 @@ public class TlsRsaPremasterSecretParameterSpec
public int getMinorVersion() { public int getMinorVersion() {
return minorVersion; return minorVersion;
} }
/**
* Returns the encoded secret.
*
* @return the encoded secret, may be null if no encoded secret.
*/
public byte[] getEncodedSecret() {
return encodedSecret == null ? null : encodedSecret.clone();
}
} }
/* /*
* Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2013, 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
...@@ -451,30 +451,7 @@ final class P11RSACipher extends CipherSpi { ...@@ -451,30 +451,7 @@ final class P11RSACipher extends CipherSpi {
// see JCE spec // see JCE spec
protected Key engineUnwrap(byte[] wrappedKey, String algorithm, protected Key engineUnwrap(byte[] wrappedKey, String algorithm,
int type) throws InvalidKeyException, NoSuchAlgorithmException { int type) throws InvalidKeyException, NoSuchAlgorithmException {
if (algorithm.equals("TlsRsaPremasterSecret")) {
// the instance variable "session" has been initialized for
// decrypt mode, so use a local variable instead.
Session s = null;
try {
s = token.getObjSession();
long keyType = CKK_GENERIC_SECRET;
CK_ATTRIBUTE[] attributes = new CK_ATTRIBUTE[] {
new CK_ATTRIBUTE(CKA_CLASS, CKO_SECRET_KEY),
new CK_ATTRIBUTE(CKA_KEY_TYPE, keyType),
};
attributes = token.getAttributes
(O_IMPORT, CKO_SECRET_KEY, keyType, attributes);
long keyID = token.p11.C_UnwrapKey(s.id(),
new CK_MECHANISM(mechanism), p11Key.keyID, wrappedKey,
attributes);
return P11Key.secretKey(s, keyID, algorithm, 48 << 3,
attributes);
} catch (PKCS11Exception e) {
throw new InvalidKeyException("unwrap() failed", e);
} finally {
token.releaseSession(s);
}
}
// XXX implement unwrap using C_Unwrap() for all keys // XXX implement unwrap using C_Unwrap() for all keys
implInit(Cipher.DECRYPT_MODE, p11Key); implInit(Cipher.DECRYPT_MODE, p11Key);
if (wrappedKey.length > maxInputSize) { if (wrappedKey.length > maxInputSize) {
......
/* /*
* Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2013, 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
...@@ -88,23 +88,33 @@ final class P11TlsRsaPremasterSecretGenerator extends KeyGeneratorSpi { ...@@ -88,23 +88,33 @@ final class P11TlsRsaPremasterSecretGenerator extends KeyGeneratorSpi {
throw new IllegalStateException throw new IllegalStateException
("TlsRsaPremasterSecretGenerator must be initialized"); ("TlsRsaPremasterSecretGenerator must be initialized");
} }
CK_VERSION version =
new CK_VERSION(spec.getMajorVersion(), spec.getMinorVersion()); byte[] b = spec.getEncodedSecret();
Session session = null; if (b == null) {
try { CK_VERSION version = new CK_VERSION(
session = token.getObjSession(); spec.getMajorVersion(), spec.getMinorVersion());
CK_ATTRIBUTE[] attributes = token.getAttributes Session session = null;
(O_GENERATE, CKO_SECRET_KEY, CKK_GENERIC_SECRET, new CK_ATTRIBUTE[0]); try {
long keyID = token.p11.C_GenerateKey session = token.getObjSession();
(session.id(), new CK_MECHANISM(mechanism, version), attributes); CK_ATTRIBUTE[] attributes = token.getAttributes(
SecretKey key = P11Key.secretKey O_GENERATE, CKO_SECRET_KEY,
(session, keyID, "TlsRsaPremasterSecret", 48 << 3, attributes); CKK_GENERIC_SECRET, new CK_ATTRIBUTE[0]);
return key; long keyID = token.p11.C_GenerateKey(session.id(),
} catch (PKCS11Exception e) { new CK_MECHANISM(mechanism, version), attributes);
throw new ProviderException("Could not generate premaster secret", e); SecretKey key = P11Key.secretKey(session,
} finally { keyID, "TlsRsaPremasterSecret", 48 << 3, attributes);
token.releaseSession(session); return key;
} catch (PKCS11Exception e) {
throw new ProviderException(
"Could not generate premaster secret", e);
} finally {
token.releaseSession(session);
}
} }
// Won't worry, the TlsRsaPremasterSecret will be soon converted to
// TlsMasterSecret.
return new SecretKeySpec(b, "TlsRsaPremasterSecret");
} }
} }
/* /*
* Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2006, 2013, 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
...@@ -43,10 +43,8 @@ import sun.misc.Unsafe; ...@@ -43,10 +43,8 @@ import sun.misc.Unsafe;
* These are the only platforms we currently support, but other optimized * These are the only platforms we currently support, but other optimized
* variants could be added as needed. * variants could be added as needed.
* *
* NOTE that because this code performs unchecked direct memory access, it * NOTE that ArrayIndexOutOfBoundsException will be thrown if the bounds checks
* MUST be restricted to trusted code. It is imperative that the caller protects * failed.
* against out of bounds memory access by performing the necessary bounds
* checks before calling methods in this class.
* *
* This class may also be helpful in improving the performance of the * This class may also be helpful in improving the performance of the
* crypto code in the SunJCE provider. However, for now it is only accessible by * crypto code in the SunJCE provider. However, for now it is only accessible by
...@@ -103,6 +101,10 @@ final class ByteArrayAccess { ...@@ -103,6 +101,10 @@ final class ByteArrayAccess {
* byte[] to int[] conversion, little endian byte order. * byte[] to int[] conversion, little endian byte order.
*/ */
static void b2iLittle(byte[] in, int inOfs, int[] out, int outOfs, int len) { static void b2iLittle(byte[] in, int inOfs, int[] out, int outOfs, int len) {
if ((inOfs < 0) || ((in.length - inOfs) < len) ||
(outOfs < 0) || ((out.length - outOfs) < len/4)) {
throw new ArrayIndexOutOfBoundsException();
}
if (littleEndianUnaligned) { if (littleEndianUnaligned) {
inOfs += byteArrayOfs; inOfs += byteArrayOfs;
len += inOfs; len += inOfs;
...@@ -131,6 +133,10 @@ final class ByteArrayAccess { ...@@ -131,6 +133,10 @@ final class ByteArrayAccess {
// Special optimization of b2iLittle(in, inOfs, out, 0, 64) // Special optimization of b2iLittle(in, inOfs, out, 0, 64)
static void b2iLittle64(byte[] in, int inOfs, int[] out) { static void b2iLittle64(byte[] in, int inOfs, int[] out) {
if ((inOfs < 0) || ((in.length - inOfs) < 64) ||
(out.length < 16)) {
throw new ArrayIndexOutOfBoundsException();
}
if (littleEndianUnaligned) { if (littleEndianUnaligned) {
inOfs += byteArrayOfs; inOfs += byteArrayOfs;
out[ 0] = unsafe.getInt(in, (long)(inOfs )); out[ 0] = unsafe.getInt(in, (long)(inOfs ));
...@@ -176,6 +182,10 @@ final class ByteArrayAccess { ...@@ -176,6 +182,10 @@ final class ByteArrayAccess {
* int[] to byte[] conversion, little endian byte order. * int[] to byte[] conversion, little endian byte order.
*/ */
static void i2bLittle(int[] in, int inOfs, byte[] out, int outOfs, int len) { static void i2bLittle(int[] in, int inOfs, byte[] out, int outOfs, int len) {
if ((inOfs < 0) || ((in.length - inOfs) < len/4) ||
(outOfs < 0) || ((out.length - outOfs) < len)) {
throw new ArrayIndexOutOfBoundsException();
}
if (littleEndianUnaligned) { if (littleEndianUnaligned) {
outOfs += byteArrayOfs; outOfs += byteArrayOfs;
len += outOfs; len += outOfs;
...@@ -204,6 +214,9 @@ final class ByteArrayAccess { ...@@ -204,6 +214,9 @@ final class ByteArrayAccess {
// Store one 32-bit value into out[outOfs..outOfs+3] in little endian order. // Store one 32-bit value into out[outOfs..outOfs+3] in little endian order.
static void i2bLittle4(int val, byte[] out, int outOfs) { static void i2bLittle4(int val, byte[] out, int outOfs) {
if ((outOfs < 0) || ((out.length - outOfs) < 4)) {
throw new ArrayIndexOutOfBoundsException();
}
if (littleEndianUnaligned) { if (littleEndianUnaligned) {
unsafe.putInt(out, (long)(byteArrayOfs + outOfs), val); unsafe.putInt(out, (long)(byteArrayOfs + outOfs), val);
} else if (bigEndian && ((outOfs & 3) == 0)) { } else if (bigEndian && ((outOfs & 3) == 0)) {
...@@ -220,6 +233,10 @@ final class ByteArrayAccess { ...@@ -220,6 +233,10 @@ final class ByteArrayAccess {
* byte[] to int[] conversion, big endian byte order. * byte[] to int[] conversion, big endian byte order.
*/ */
static void b2iBig(byte[] in, int inOfs, int[] out, int outOfs, int len) { static void b2iBig(byte[] in, int inOfs, int[] out, int outOfs, int len) {
if ((inOfs < 0) || ((in.length - inOfs) < len) ||
(outOfs < 0) || ((out.length - outOfs) < len/4)) {
throw new ArrayIndexOutOfBoundsException();
}
if (littleEndianUnaligned) { if (littleEndianUnaligned) {
inOfs += byteArrayOfs; inOfs += byteArrayOfs;
len += inOfs; len += inOfs;
...@@ -248,6 +265,10 @@ final class ByteArrayAccess { ...@@ -248,6 +265,10 @@ final class ByteArrayAccess {
// Special optimization of b2iBig(in, inOfs, out, 0, 64) // Special optimization of b2iBig(in, inOfs, out, 0, 64)
static void b2iBig64(byte[] in, int inOfs, int[] out) { static void b2iBig64(byte[] in, int inOfs, int[] out) {
if ((inOfs < 0) || ((in.length - inOfs) < 64) ||
(out.length < 16)) {
throw new ArrayIndexOutOfBoundsException();
}
if (littleEndianUnaligned) { if (littleEndianUnaligned) {
inOfs += byteArrayOfs; inOfs += byteArrayOfs;
out[ 0] = reverseBytes(unsafe.getInt(in, (long)(inOfs ))); out[ 0] = reverseBytes(unsafe.getInt(in, (long)(inOfs )));
...@@ -293,6 +314,10 @@ final class ByteArrayAccess { ...@@ -293,6 +314,10 @@ final class ByteArrayAccess {
* int[] to byte[] conversion, big endian byte order. * int[] to byte[] conversion, big endian byte order.
*/ */
static void i2bBig(int[] in, int inOfs, byte[] out, int outOfs, int len) { static void i2bBig(int[] in, int inOfs, byte[] out, int outOfs, int len) {
if ((inOfs < 0) || ((in.length - inOfs) < len/4) ||
(outOfs < 0) || ((out.length - outOfs) < len)) {
throw new ArrayIndexOutOfBoundsException();
}
if (littleEndianUnaligned) { if (littleEndianUnaligned) {
outOfs += byteArrayOfs; outOfs += byteArrayOfs;
len += outOfs; len += outOfs;
...@@ -321,6 +346,9 @@ final class ByteArrayAccess { ...@@ -321,6 +346,9 @@ final class ByteArrayAccess {
// Store one 32-bit value into out[outOfs..outOfs+3] in big endian order. // Store one 32-bit value into out[outOfs..outOfs+3] in big endian order.
static void i2bBig4(int val, byte[] out, int outOfs) { static void i2bBig4(int val, byte[] out, int outOfs) {
if ((outOfs < 0) || ((out.length - outOfs) < 4)) {
throw new ArrayIndexOutOfBoundsException();
}
if (littleEndianUnaligned) { if (littleEndianUnaligned) {
unsafe.putInt(out, (long)(byteArrayOfs + outOfs), reverseBytes(val)); unsafe.putInt(out, (long)(byteArrayOfs + outOfs), reverseBytes(val));
} else if (bigEndian && ((outOfs & 3) == 0)) { } else if (bigEndian && ((outOfs & 3) == 0)) {
...@@ -337,6 +365,10 @@ final class ByteArrayAccess { ...@@ -337,6 +365,10 @@ final class ByteArrayAccess {
* byte[] to long[] conversion, big endian byte order. * byte[] to long[] conversion, big endian byte order.
*/ */
static void b2lBig(byte[] in, int inOfs, long[] out, int outOfs, int len) { static void b2lBig(byte[] in, int inOfs, long[] out, int outOfs, int len) {
if ((inOfs < 0) || ((in.length - inOfs) < len) ||
(outOfs < 0) || ((out.length - outOfs) < len/8)) {
throw new ArrayIndexOutOfBoundsException();
}
if (littleEndianUnaligned) { if (littleEndianUnaligned) {
inOfs += byteArrayOfs; inOfs += byteArrayOfs;
len += inOfs; len += inOfs;
...@@ -378,6 +410,10 @@ final class ByteArrayAccess { ...@@ -378,6 +410,10 @@ final class ByteArrayAccess {
// Special optimization of b2lBig(in, inOfs, out, 0, 128) // Special optimization of b2lBig(in, inOfs, out, 0, 128)
static void b2lBig128(byte[] in, int inOfs, long[] out) { static void b2lBig128(byte[] in, int inOfs, long[] out) {
if ((inOfs < 0) || ((in.length - inOfs) < 128) ||
(out.length < 16)) {
throw new ArrayIndexOutOfBoundsException();
}
if (littleEndianUnaligned) { if (littleEndianUnaligned) {
inOfs += byteArrayOfs; inOfs += byteArrayOfs;
out[ 0] = reverseBytes(unsafe.getLong(in, (long)(inOfs ))); out[ 0] = reverseBytes(unsafe.getLong(in, (long)(inOfs )));
...@@ -406,6 +442,10 @@ final class ByteArrayAccess { ...@@ -406,6 +442,10 @@ final class ByteArrayAccess {
* long[] to byte[] conversion, big endian byte order. * long[] to byte[] conversion, big endian byte order.
*/ */
static void l2bBig(long[] in, int inOfs, byte[] out, int outOfs, int len) { static void l2bBig(long[] in, int inOfs, byte[] out, int outOfs, int len) {
if ((inOfs < 0) || ((in.length - inOfs) < len/8) ||
(outOfs < 0) || ((out.length - outOfs) < len)) {
throw new ArrayIndexOutOfBoundsException();
}
len += outOfs; len += outOfs;
while (outOfs < len) { while (outOfs < len) {
long i = in[inOfs++]; long i = in[inOfs++];
...@@ -419,5 +459,4 @@ final class ByteArrayAccess { ...@@ -419,5 +459,4 @@ final class ByteArrayAccess {
out[outOfs++] = (byte)(i ); out[outOfs++] = (byte)(i );
} }
} }
} }
/* /*
* Copyright (c) 2003, 2013 Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2013, 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
...@@ -318,33 +318,53 @@ public final class RSAPadding { ...@@ -318,33 +318,53 @@ public final class RSAPadding {
/** /**
* PKCS#1 v1.5 unpadding (blocktype 1 and 2). * PKCS#1 v1.5 unpadding (blocktype 1 and 2).
*
* Note that we want to make it a constant-time operation
*/ */
private byte[] unpadV15(byte[] padded) throws BadPaddingException { private byte[] unpadV15(byte[] padded) throws BadPaddingException {
int k = 0; int k = 0;
BadPaddingException bpe = null;
if (padded[k++] != 0) { if (padded[k++] != 0) {
throw new BadPaddingException("Data must start with zero"); bpe = new BadPaddingException("Data must start with zero");
} }
if (padded[k++] != type) { if (padded[k++] != type && bpe == null) {
throw new BadPaddingException("Blocktype mismatch: " + padded[1]); bpe = new BadPaddingException("Blocktype mismatch: " + padded[1]);
} }
while (true) { int p = 0;
while (k < padded.length) {
int b = padded[k++] & 0xff; int b = padded[k++] & 0xff;
if (b == 0) { if (b == 0 && p == 0) {
break; p = k;
} }
if (k == padded.length) { if (k == padded.length && p == 0 && bpe == null) {
throw new BadPaddingException("Padding string not terminated"); bpe = new BadPaddingException("Padding string not terminated");
} }
if ((type == PAD_BLOCKTYPE_1) && (b != 0xff)) { if ((type == PAD_BLOCKTYPE_1) && (b != 0xff) &&
throw new BadPaddingException("Padding byte not 0xff: " + b); p == 0 && bpe == null) {
bpe = new BadPaddingException("Padding byte not 0xff: " + b);
} }
} }
int n = padded.length - k; int n = padded.length - p;
if (n > maxDataSize) { if (n > maxDataSize && bpe == null) {
throw new BadPaddingException("Padding string too short"); bpe = new BadPaddingException("Padding string too short");
} }
// copy useless padding array for a constant-time method
//
// Is it necessary?
byte[] padding = new byte[p];
System.arraycopy(padded, 0, padding, 0, p);
byte[] data = new byte[n]; byte[] data = new byte[n];
System.arraycopy(padded, padded.length - n, data, 0, n); System.arraycopy(padded, p, data, 0, n);
if (bpe == null) {
bpe = new BadPaddingException("Unused exception");
} else {
throw bpe;
}
return data; return data;
} }
......
...@@ -1104,94 +1104,23 @@ abstract class Handshaker { ...@@ -1104,94 +1104,23 @@ abstract class Handshaker {
clnt_random.random_bytes, svr_random.random_bytes, clnt_random.random_bytes, svr_random.random_bytes,
prfHashAlg, prfHashLength, prfBlockSize); prfHashAlg, prfHashLength, prfBlockSize);
SecretKey masterSecret;
try { try {
KeyGenerator kg = JsseJce.getKeyGenerator(masterAlg); KeyGenerator kg = JsseJce.getKeyGenerator(masterAlg);
kg.init(spec); kg.init(spec);
masterSecret = kg.generateKey(); return kg.generateKey();
} catch (GeneralSecurityException e) { } catch (InvalidAlgorithmParameterException |
NoSuchAlgorithmException iae) {
// unlikely to happen, otherwise, must be a provider exception
//
// For RSA premaster secrets, do not signal a protocol error // For RSA premaster secrets, do not signal a protocol error
// due to the Bleichenbacher attack. See comments further down. // due to the Bleichenbacher attack. See comments further down.
if (!preMasterSecret.getAlgorithm().equals(
"TlsRsaPremasterSecret")) {
throw new ProviderException(e);
}
if (debug != null && Debug.isOn("handshake")) { if (debug != null && Debug.isOn("handshake")) {
System.out.println("RSA master secret generation error:"); System.out.println("RSA master secret generation error:");
e.printStackTrace(System.out); iae.printStackTrace(System.out);
}
if (requestedVersion != null) {
preMasterSecret =
RSAClientKeyExchange.generateDummySecret(requestedVersion);
} else {
preMasterSecret =
RSAClientKeyExchange.generateDummySecret(protocolVersion);
} }
throw new ProviderException(iae);
// recursive call with new premaster secret
return calculateMasterSecret(preMasterSecret, null);
} }
// if no version check requested (client side handshake), or version
// information is not available (not an RSA premaster secret),
// return master secret immediately.
if ((requestedVersion == null) ||
!(masterSecret instanceof TlsMasterSecret)) {
return masterSecret;
}
// we have checked the ClientKeyExchange message when reading TLS
// record, the following check is necessary to ensure that
// JCE provider does not ignore the checking, or the previous
// checking process bypassed the premaster secret version checking.
TlsMasterSecret tlsKey = (TlsMasterSecret)masterSecret;
int major = tlsKey.getMajorVersion();
int minor = tlsKey.getMinorVersion();
if ((major < 0) || (minor < 0)) {
return masterSecret;
}
// check if the premaster secret version is ok
// the specification says that it must be the maximum version supported
// by the client from its ClientHello message. However, many
// implementations send the negotiated version, so accept both
// for SSL v3.0 and TLS v1.0.
// NOTE that we may be comparing two unsupported version numbers, which
// is why we cannot use object reference equality in this special case.
ProtocolVersion premasterVersion =
ProtocolVersion.valueOf(major, minor);
boolean versionMismatch = (premasterVersion.v != requestedVersion.v);
/*
* we never checked the client_version in server side
* for TLS v1.0 and SSL v3.0. For compatibility, we
* maintain this behavior.
*/
if (versionMismatch && requestedVersion.v <= ProtocolVersion.TLS10.v) {
versionMismatch = (premasterVersion.v != protocolVersion.v);
}
if (versionMismatch == false) {
// check passed, return key
return masterSecret;
}
// Due to the Bleichenbacher attack, do not signal a protocol error.
// Generate a random premaster secret and continue with the handshake,
// which will fail when verifying the finished messages.
// For more information, see comments in PreMasterSecret.
if (debug != null && Debug.isOn("handshake")) {
System.out.println("RSA PreMasterSecret version error: expected"
+ protocolVersion + " or " + requestedVersion + ", decrypted: "
+ premasterVersion);
}
preMasterSecret =
RSAClientKeyExchange.generateDummySecret(requestedVersion);
// recursive call with new premaster secret
return calculateMasterSecret(preMasterSecret, null);
} }
/* /*
......
/* /*
* Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1996, 2013, 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
...@@ -133,26 +133,37 @@ final class RSAClientKeyExchange extends HandshakeMessage { ...@@ -133,26 +133,37 @@ final class RSAClientKeyExchange extends HandshakeMessage {
} else { } else {
encrypted = new byte [messageSize]; encrypted = new byte [messageSize];
if (input.read(encrypted) != messageSize) { if (input.read(encrypted) != messageSize) {
throw new SSLProtocolException throw new SSLProtocolException(
("SSL: read PreMasterSecret: short read"); "SSL: read PreMasterSecret: short read");
} }
} }
Exception failover = null;
byte[] encoded = null;
try { try {
Cipher cipher = JsseJce.getCipher(JsseJce.CIPHER_RSA_PKCS1); Cipher cipher = JsseJce.getCipher(JsseJce.CIPHER_RSA_PKCS1);
cipher.init(Cipher.UNWRAP_MODE, privateKey); // Cannot generate key here, please don't use Cipher.UNWRAP_MODE!
preMaster = (SecretKey)cipher.unwrap(encrypted, cipher.init(Cipher.DECRYPT_MODE, privateKey);
"TlsRsaPremasterSecret", Cipher.SECRET_KEY); encoded = cipher.doFinal(encrypted);
} catch (BadPaddingException bpe) {
// polish the premaster secret failover = bpe;
preMaster = polishPreMasterSecretKey(currentVersion, maxVersion, encoded = null;
generator, preMaster, null); } catch (IllegalBlockSizeException ibse) {
// the message it too big to process with RSA
throw new SSLProtocolException(
"Unable to process PreMasterSecret, may be too big");
} catch (Exception e) { } catch (Exception e) {
// polish the premaster secret // unlikely to happen, otherwise, must be a provider exception
preMaster = if (debug != null && Debug.isOn("handshake")) {
polishPreMasterSecretKey(currentVersion, maxVersion, System.out.println("RSA premaster secret decryption error:");
generator, null, e); e.printStackTrace(System.out);
}
throw new RuntimeException("Could not generate dummy secret", e);
} }
// polish the premaster secret
preMaster = polishPreMasterSecretKey(
currentVersion, maxVersion, generator, encoded, failover);
} }
/** /**
...@@ -163,85 +174,74 @@ final class RSAClientKeyExchange extends HandshakeMessage { ...@@ -163,85 +174,74 @@ final class RSAClientKeyExchange extends HandshakeMessage {
* *
* RFC 5246 describes the approach as : * RFC 5246 describes the approach as :
* *
* 1. Generate a string R of 46 random bytes * 1. Generate a string R of 48 random bytes
* *
* 2. Decrypt the message to recover the plaintext M * 2. Decrypt the message to recover the plaintext M
* *
* 3. If the PKCS#1 padding is not correct, or the length of message * 3. If the PKCS#1 padding is not correct, or the length of message
* M is not exactly 48 bytes: * M is not exactly 48 bytes:
* pre_master_secret = ClientHello.client_version || R * pre_master_secret = R
* else If ClientHello.client_version <= TLS 1.0, and version * else If ClientHello.client_version <= TLS 1.0, and version
* number check is explicitly disabled: * number check is explicitly disabled:
* pre_master_secret = M * premaster secret = M
* else If M[0..1] != ClientHello.client_version:
* premaster secret = R
* else: * else:
* pre_master_secret = ClientHello.client_version || M[2..47] * premaster secret = M
*
* Note that #2 has completed before the call of this method.
*/ */
private SecretKey polishPreMasterSecretKey(ProtocolVersion currentVersion, private SecretKey polishPreMasterSecretKey(ProtocolVersion currentVersion,
ProtocolVersion clientHelloVersion, SecureRandom generator, ProtocolVersion clientHelloVersion, SecureRandom generator,
SecretKey secretKey, Exception failoverException) { byte[] encoded, Exception failoverException) {
this.protocolVersion = clientHelloVersion; this.protocolVersion = clientHelloVersion;
if (generator == null) {
generator = new SecureRandom();
}
byte[] random = new byte[48];
generator.nextBytes(random);
if (failoverException == null && secretKey != null) { if (failoverException == null && encoded != null) {
// check the length // check the length
byte[] encoded = secretKey.getEncoded(); if (encoded.length != 48) {
if (encoded == null) { // unable to get the encoded key
if (debug != null && Debug.isOn("handshake")) { if (debug != null && Debug.isOn("handshake")) {
System.out.println( System.out.println(
"unable to get the plaintext of the premaster secret"); "incorrect length of premaster secret: " +
encoded.length);
} }
int keySize = KeyUtil.getKeySize(secretKey); return generatePreMasterSecret(
if (keySize > 0 && keySize != 384) { // 384 = 48 * 8 clientHelloVersion, random, generator);
if (debug != null && Debug.isOn("handshake")) { }
System.out.println(
"incorrect length of premaster secret: " +
(keySize/8));
}
return generateDummySecret(clientHelloVersion); if (clientHelloVersion.major != encoded[0] ||
} clientHelloVersion.minor != encoded[1]) {
// The key size is exactly 48 bytes or not accessible. if (clientHelloVersion.v <= ProtocolVersion.TLS10.v &&
// currentVersion.major == encoded[0] &&
// Conservatively, pass the checking to master secret currentVersion.minor == encoded[1]) {
// calculation.
return secretKey;
} else if (encoded.length == 48) {
// check the version
if (clientHelloVersion.major == encoded[0] &&
clientHelloVersion.minor == encoded[1]) {
return secretKey;
} else if (clientHelloVersion.v <= ProtocolVersion.TLS10.v &&
currentVersion.major == encoded[0] &&
currentVersion.minor == encoded[1]) {
/* /*
* For compatibility, we maintain the behavior that the * For compatibility, we maintain the behavior that the
* version in pre_master_secret can be the negotiated * version in pre_master_secret can be the negotiated
* version for TLS v1.0 and SSL v3.0. * version for TLS v1.0 and SSL v3.0.
*/ */
this.protocolVersion = currentVersion; this.protocolVersion = currentVersion;
return secretKey; } else {
} if (debug != null && Debug.isOn("handshake")) {
System.out.println("Mismatching Protocol Versions, " +
if (debug != null && Debug.isOn("handshake")) { "ClientHello.client_version is " +
System.out.println("Mismatching Protocol Versions, " + clientHelloVersion +
"ClientHello.client_version is " + clientHelloVersion + ", while PreMasterSecret.client_version is " +
", while PreMasterSecret.client_version is " + ProtocolVersion.valueOf(encoded[0], encoded[1]));
ProtocolVersion.valueOf(encoded[0], encoded[1])); }
}
return generateDummySecret(clientHelloVersion); encoded = random;
} else {
if (debug != null && Debug.isOn("handshake")) {
System.out.println(
"incorrect length of premaster secret: " +
encoded.length);
} }
return generateDummySecret(clientHelloVersion);
} }
return generatePreMasterSecret(
clientHelloVersion, encoded, generator);
} }
if (debug != null && Debug.isOn("handshake") && if (debug != null && Debug.isOn("handshake") &&
...@@ -250,11 +250,14 @@ final class RSAClientKeyExchange extends HandshakeMessage { ...@@ -250,11 +250,14 @@ final class RSAClientKeyExchange extends HandshakeMessage {
failoverException.printStackTrace(System.out); failoverException.printStackTrace(System.out);
} }
return generateDummySecret(clientHelloVersion); return generatePreMasterSecret(clientHelloVersion, random, generator);
} }
// generate a premaster secret with the specified version number // generate a premaster secret with the specified version number
static SecretKey generateDummySecret(ProtocolVersion version) { private static SecretKey generatePreMasterSecret(
ProtocolVersion version, byte[] encodedSecret,
SecureRandom generator) {
if (debug != null && Debug.isOn("handshake")) { if (debug != null && Debug.isOn("handshake")) {
System.out.println("Generating a random fake premaster secret"); System.out.println("Generating a random fake premaster secret");
} }
...@@ -263,11 +266,17 @@ final class RSAClientKeyExchange extends HandshakeMessage { ...@@ -263,11 +266,17 @@ final class RSAClientKeyExchange extends HandshakeMessage {
String s = ((version.v >= ProtocolVersion.TLS12.v) ? String s = ((version.v >= ProtocolVersion.TLS12.v) ?
"SunTls12RsaPremasterSecret" : "SunTlsRsaPremasterSecret"); "SunTls12RsaPremasterSecret" : "SunTlsRsaPremasterSecret");
KeyGenerator kg = JsseJce.getKeyGenerator(s); KeyGenerator kg = JsseJce.getKeyGenerator(s);
kg.init(new TlsRsaPremasterSecretParameterSpec kg.init(new TlsRsaPremasterSecretParameterSpec(
(version.major, version.minor)); version.major, version.minor, encodedSecret), generator);
return kg.generateKey(); return kg.generateKey();
} catch (GeneralSecurityException e) { } catch (InvalidAlgorithmParameterException |
throw new RuntimeException("Could not generate dummy secret", e); NoSuchAlgorithmException iae) {
// unlikely to happen, otherwise, must be a provider exception
if (debug != null && Debug.isOn("handshake")) {
System.out.println("RSA premaster secret generation error:");
iae.printStackTrace(System.out);
}
throw new RuntimeException("Could not generate dummy secret", iae);
} }
} }
......
...@@ -158,8 +158,13 @@ public class Main { ...@@ -158,8 +158,13 @@ public class Main {
private String altSignerClasspath = null; private String altSignerClasspath = null;
private ZipFile zipFile = null; private ZipFile zipFile = null;
private boolean hasExpiredCert = false; // Informational warnings
private boolean hasExpiringCert = false; private boolean hasExpiringCert = false;
private boolean noTimestamp = false;
private Date expireDate = new Date(0L); // used in noTimestamp warning
// Severe warnings
private boolean hasExpiredCert = false;
private boolean notYetValidCert = false; private boolean notYetValidCert = false;
private boolean chainNotValidated = false; private boolean chainNotValidated = false;
private boolean notSignedByAlias = false; private boolean notSignedByAlias = false;
...@@ -258,9 +263,6 @@ public class Main { ...@@ -258,9 +263,6 @@ public class Main {
if (strict) { if (strict) {
int exitCode = 0; int exitCode = 0;
if (hasExpiringCert) {
exitCode |= 2;
}
if (chainNotValidated || hasExpiredCert || notYetValidCert) { if (chainNotValidated || hasExpiredCert || notYetValidCert) {
exitCode |= 4; exitCode |= 4;
} }
...@@ -754,14 +756,25 @@ public class Main { ...@@ -754,14 +756,25 @@ public class Main {
System.out.println(rb.getString( System.out.println(rb.getString(
"jar.is.unsigned.signatures.missing.or.not.parsable.")); "jar.is.unsigned.signatures.missing.or.not.parsable."));
} else { } else {
System.out.println(rb.getString("jar.verified.")); boolean warningAppeared = false;
if (hasUnsignedEntry || hasExpiredCert || hasExpiringCert || boolean errorAppeared = false;
badKeyUsage || badExtendedKeyUsage || badNetscapeCertType || if (badKeyUsage || badExtendedKeyUsage || badNetscapeCertType ||
notYetValidCert || chainNotValidated || notYetValidCert || chainNotValidated || hasExpiredCert ||
aliasNotInStore || notSignedByAlias) { hasUnsignedEntry ||
aliasNotInStore || notSignedByAlias) {
if (strict) {
System.out.println(rb.getString("jar.verified.with.signer.errors."));
System.out.println();
System.out.println(rb.getString("Error."));
errorAppeared = true;
} else {
System.out.println(rb.getString("jar.verified."));
System.out.println();
System.out.println(rb.getString("Warning."));
warningAppeared = true;
}
System.out.println();
System.out.println(rb.getString("Warning."));
if (badKeyUsage) { if (badKeyUsage) {
System.out.println( System.out.println(
rb.getString("This.jar.contains.entries.whose.signer.certificate.s.KeyUsage.extension.doesn.t.allow.code.signing.")); rb.getString("This.jar.contains.entries.whose.signer.certificate.s.KeyUsage.extension.doesn.t.allow.code.signing."));
...@@ -785,10 +798,6 @@ public class Main { ...@@ -785,10 +798,6 @@ public class Main {
System.out.println(rb.getString( System.out.println(rb.getString(
"This.jar.contains.entries.whose.signer.certificate.has.expired.")); "This.jar.contains.entries.whose.signer.certificate.has.expired."));
} }
if (hasExpiringCert) {
System.out.println(rb.getString(
"This.jar.contains.entries.whose.signer.certificate.will.expire.within.six.months."));
}
if (notYetValidCert) { if (notYetValidCert) {
System.out.println(rb.getString( System.out.println(rb.getString(
"This.jar.contains.entries.whose.signer.certificate.is.not.yet.valid.")); "This.jar.contains.entries.whose.signer.certificate.is.not.yet.valid."));
...@@ -807,10 +816,29 @@ public class Main { ...@@ -807,10 +816,29 @@ public class Main {
if (aliasNotInStore) { if (aliasNotInStore) {
System.out.println(rb.getString("This.jar.contains.signed.entries.that.s.not.signed.by.alias.in.this.keystore.")); System.out.println(rb.getString("This.jar.contains.signed.entries.that.s.not.signed.by.alias.in.this.keystore."));
} }
} else {
System.out.println(rb.getString("jar.verified."));
}
if (hasExpiringCert || noTimestamp) {
if (!warningAppeared) {
System.out.println();
System.out.println(rb.getString("Warning."));
warningAppeared = true;
}
if (hasExpiringCert) {
System.out.println(rb.getString(
"This.jar.contains.entries.whose.signer.certificate.will.expire.within.six.months."));
}
if (noTimestamp) {
System.out.println(
String.format(rb.getString("no.timestamp.verifying"), expireDate));
}
}
if (warningAppeared || errorAppeared) {
if (! (verbose != null && showcerts)) { if (! (verbose != null && showcerts)) {
System.out.println(); System.out.println();
System.out.println(rb.getString( System.out.println(rb.getString(
"Re.run.with.the.verbose.and.certs.options.for.more.details.")); "Re.run.with.the.verbose.and.certs.options.for.more.details."));
} }
} }
} }
...@@ -870,6 +898,9 @@ public class Main { ...@@ -870,6 +898,9 @@ public class Main {
try { try {
boolean printValidity = true; boolean printValidity = true;
if (timestamp == null) { if (timestamp == null) {
if (expireDate.getTime() == 0 || expireDate.after(notAfter)) {
expireDate = notAfter;
}
x509Cert.checkValidity(); x509Cert.checkValidity();
// test if cert will expire within six months // test if cert will expire within six months
if (notAfter.getTime() < System.currentTimeMillis() + SIX_MONTHS) { if (notAfter.getTime() < System.currentTimeMillis() + SIX_MONTHS) {
...@@ -1233,6 +1264,10 @@ public class Main { ...@@ -1233,6 +1264,10 @@ public class Main {
tsaCert = getTsaCert(tsaAlias); tsaCert = getTsaCert(tsaAlias);
} }
if (tsaUrl == null && tsaCert == null) {
noTimestamp = true;
}
SignatureFile.Block block = null; SignatureFile.Block block = null;
try { try {
...@@ -1380,12 +1415,20 @@ public class Main { ...@@ -1380,12 +1415,20 @@ public class Main {
} }
} }
if (hasExpiredCert || hasExpiringCert || notYetValidCert boolean warningAppeared = false;
|| badKeyUsage || badExtendedKeyUsage if (badKeyUsage || badExtendedKeyUsage || badNetscapeCertType ||
|| badNetscapeCertType || chainNotValidated) { notYetValidCert || chainNotValidated || hasExpiredCert) {
System.out.println(); if (strict) {
System.out.println(rb.getString("jar.signed.with.signer.errors."));
System.out.println();
System.out.println(rb.getString("Error."));
} else {
System.out.println(rb.getString("jar.signed."));
System.out.println();
System.out.println(rb.getString("Warning."));
warningAppeared = true;
}
System.out.println(rb.getString("Warning."));
if (badKeyUsage) { if (badKeyUsage) {
System.out.println( System.out.println(
rb.getString("The.signer.certificate.s.KeyUsage.extension.doesn.t.allow.code.signing.")); rb.getString("The.signer.certificate.s.KeyUsage.extension.doesn.t.allow.code.signing."));
...@@ -1404,9 +1447,6 @@ public class Main { ...@@ -1404,9 +1447,6 @@ public class Main {
if (hasExpiredCert) { if (hasExpiredCert) {
System.out.println( System.out.println(
rb.getString("The.signer.certificate.has.expired.")); rb.getString("The.signer.certificate.has.expired."));
} else if (hasExpiringCert) {
System.out.println(
rb.getString("The.signer.certificate.will.expire.within.six.months."));
} else if (notYetValidCert) { } else if (notYetValidCert) {
System.out.println( System.out.println(
rb.getString("The.signer.certificate.is.not.yet.valid.")); rb.getString("The.signer.certificate.is.not.yet.valid."));
...@@ -1416,6 +1456,24 @@ public class Main { ...@@ -1416,6 +1456,24 @@ public class Main {
System.out.println( System.out.println(
rb.getString("The.signer.s.certificate.chain.is.not.validated.")); rb.getString("The.signer.s.certificate.chain.is.not.validated."));
} }
} else {
System.out.println(rb.getString("jar.signed."));
}
if (hasExpiringCert || noTimestamp) {
if (!warningAppeared) {
System.out.println();
System.out.println(rb.getString("Warning."));
}
if (hasExpiringCert) {
System.out.println(
rb.getString("The.signer.certificate.will.expire.within.six.months."));
}
if (noTimestamp) {
System.out.println(
String.format(rb.getString("no.timestamp.signing"), expireDate));
}
} }
// no IOException thrown in the above try clause, so disable // no IOException thrown in the above try clause, so disable
...@@ -1502,6 +1560,7 @@ public class Main { ...@@ -1502,6 +1560,7 @@ public class Main {
timestamp = ts.getTimestamp(); timestamp = ts.getTimestamp();
} else { } else {
timestamp = null; timestamp = null;
noTimestamp = true;
} }
// display the certificate(s). The first one is end-entity cert and // display the certificate(s). The first one is end-entity cert and
// its KeyUsage should be checked. // its KeyUsage should be checked.
......
...@@ -112,9 +112,9 @@ public class Resources extends java.util.ListResourceBundle { ...@@ -112,9 +112,9 @@ public class Resources extends java.util.ListResourceBundle {
{"Please.specify.alias.name", "Please specify alias name"}, {"Please.specify.alias.name", "Please specify alias name"},
{"Only.one.alias.can.be.specified", "Only one alias can be specified"}, {"Only.one.alias.can.be.specified", "Only one alias can be specified"},
{"This.jar.contains.signed.entries.which.is.not.signed.by.the.specified.alias.es.", {"This.jar.contains.signed.entries.which.is.not.signed.by.the.specified.alias.es.",
"This jar contains signed entries which is not signed by the specified alias(es)."}, "This jar contains signed entries which are not signed by the specified alias(es)."},
{"This.jar.contains.signed.entries.that.s.not.signed.by.alias.in.this.keystore.", {"This.jar.contains.signed.entries.that.s.not.signed.by.alias.in.this.keystore.",
"This jar contains signed entries that's not signed by alias in this keystore."}, "This jar contains signed entries that are not signed by alias in this keystore."},
{"s", "s"}, {"s", "s"},
{"m", "m"}, {"m", "m"},
{"k", "k"}, {"k", "k"},
...@@ -135,7 +135,10 @@ public class Resources extends java.util.ListResourceBundle { ...@@ -135,7 +135,10 @@ public class Resources extends java.util.ListResourceBundle {
{".Unsigned.entries.", "(Unsigned entries)"}, {".Unsigned.entries.", "(Unsigned entries)"},
{"jar.is.unsigned.signatures.missing.or.not.parsable.", {"jar.is.unsigned.signatures.missing.or.not.parsable.",
"jar is unsigned. (signatures missing or not parsable)"}, "jar is unsigned. (signatures missing or not parsable)"},
{"jar.signed.", "jar signed."},
{"jar.signed.with.signer.errors.", "jar signed, with signer errors."},
{"jar.verified.", "jar verified."}, {"jar.verified.", "jar verified."},
{"jar.verified.with.signer.errors.", "jar verified, with signer errors."},
{"jarsigner.", "jarsigner: "}, {"jarsigner.", "jarsigner: "},
{"signature.filename.must.consist.of.the.following.characters.A.Z.0.9.or.", {"signature.filename.must.consist.of.the.following.characters.A.Z.0.9.or.",
"signature filename must consist of the following characters: A-Z, 0-9, _ or -"}, "signature filename must consist of the following characters: A-Z, 0-9, _ or -"},
...@@ -193,6 +196,7 @@ public class Resources extends java.util.ListResourceBundle { ...@@ -193,6 +196,7 @@ public class Resources extends java.util.ListResourceBundle {
"using an alternative signing mechanism"}, "using an alternative signing mechanism"},
{"entry.was.signed.on", "entry was signed on {0}"}, {"entry.was.signed.on", "entry was signed on {0}"},
{"Warning.", "Warning: "}, {"Warning.", "Warning: "},
{"Error.", "Error: "},
{"This.jar.contains.unsigned.entries.which.have.not.been.integrity.checked.", {"This.jar.contains.unsigned.entries.which.have.not.been.integrity.checked.",
"This jar contains unsigned entries which have not been integrity-checked. "}, "This jar contains unsigned entries which have not been integrity-checked. "},
{"This.jar.contains.entries.whose.signer.certificate.has.expired.", {"This.jar.contains.entries.whose.signer.certificate.has.expired.",
...@@ -229,6 +233,10 @@ public class Resources extends java.util.ListResourceBundle { ...@@ -229,6 +233,10 @@ public class Resources extends java.util.ListResourceBundle {
"The signer's certificate chain is not validated."}, "The signer's certificate chain is not validated."},
{"This.jar.contains.entries.whose.certificate.chain.is.not.validated.", {"This.jar.contains.entries.whose.certificate.chain.is.not.validated.",
"This jar contains entries whose certificate chain is not validated."}, "This jar contains entries whose certificate chain is not validated."},
{"no.timestamp.signing",
"No -tsa or -tsacert is provided and this jar is not timestamped. Without a timestamp, users may not be able to validate this jar after the signer certificate's expiration date (%1$tY-%1$tm-%1$td) or after any future revocation date."},
{"no.timestamp.verifying",
"This jar contains signatures that does not include a timestamp. Without a timestamp, users may not be able to validate this jar after the signer certificate's expiration date (%1$tY-%1$tm-%1$td) or after any future revocation date."},
{"Unknown.password.type.", "Unknown password type: "}, {"Unknown.password.type.", "Unknown password type: "},
{"Cannot.find.environment.variable.", {"Cannot.find.environment.variable.",
"Cannot find environment variable: "}, "Cannot find environment variable: "},
......
...@@ -222,5 +222,5 @@ public final class SecurityConstants { ...@@ -222,5 +222,5 @@ public final class SecurityConstants {
// java.lang.SecurityManager // java.lang.SecurityManager
public static final SocketPermission LOCAL_LISTEN_PERMISSION = public static final SocketPermission LOCAL_LISTEN_PERMISSION =
new SocketPermission("localhost:1024-", SOCKET_LISTEN_ACTION); new SocketPermission("localhost:0", SOCKET_LISTEN_ACTION);
} }
...@@ -2,48 +2,48 @@ ...@@ -2,48 +2,48 @@
// Standard extensions get all permissions by default // Standard extensions get all permissions by default
grant codeBase "file:${{java.ext.dirs}}/*" { grant codeBase "file:${{java.ext.dirs}}/*" {
permission java.security.AllPermission; permission java.security.AllPermission;
}; };
// default permissions granted to all domains // default permissions granted to all domains
grant { grant {
// Allows any thread to stop itself using the java.lang.Thread.stop() // Allows any thread to stop itself using the java.lang.Thread.stop()
// method that takes no argument. // method that takes no argument.
// Note that this permission is granted by default only to remain // Note that this permission is granted by default only to remain
// backwards compatible. // backwards compatible.
// It is strongly recommended that you either remove this permission // It is strongly recommended that you either remove this permission
// from this policy file or further restrict it to code sources // from this policy file or further restrict it to code sources
// that you specify, because Thread.stop() is potentially unsafe. // that you specify, because Thread.stop() is potentially unsafe.
// See the API specification of java.lang.Thread.stop() for more // See the API specification of java.lang.Thread.stop() for more
// information. // information.
permission java.lang.RuntimePermission "stopThread"; permission java.lang.RuntimePermission "stopThread";
// allows anyone to listen on un-privileged ports // allows anyone to listen on dynamic ports
permission java.net.SocketPermission "localhost:1024-", "listen"; permission java.net.SocketPermission "localhost:0", "listen";
// "standard" properies that can be read by anyone // "standard" properies that can be read by anyone
permission java.util.PropertyPermission "java.version", "read"; permission java.util.PropertyPermission "java.version", "read";
permission java.util.PropertyPermission "java.vendor", "read"; permission java.util.PropertyPermission "java.vendor", "read";
permission java.util.PropertyPermission "java.vendor.url", "read"; permission java.util.PropertyPermission "java.vendor.url", "read";
permission java.util.PropertyPermission "java.class.version", "read"; permission java.util.PropertyPermission "java.class.version", "read";
permission java.util.PropertyPermission "os.name", "read"; permission java.util.PropertyPermission "os.name", "read";
permission java.util.PropertyPermission "os.version", "read"; permission java.util.PropertyPermission "os.version", "read";
permission java.util.PropertyPermission "os.arch", "read"; permission java.util.PropertyPermission "os.arch", "read";
permission java.util.PropertyPermission "file.separator", "read"; permission java.util.PropertyPermission "file.separator", "read";
permission java.util.PropertyPermission "path.separator", "read"; permission java.util.PropertyPermission "path.separator", "read";
permission java.util.PropertyPermission "line.separator", "read"; permission java.util.PropertyPermission "line.separator", "read";
permission java.util.PropertyPermission "java.specification.version", "read"; permission java.util.PropertyPermission "java.specification.version", "read";
permission java.util.PropertyPermission "java.specification.vendor", "read"; permission java.util.PropertyPermission "java.specification.vendor", "read";
permission java.util.PropertyPermission "java.specification.name", "read"; permission java.util.PropertyPermission "java.specification.name", "read";
permission java.util.PropertyPermission "java.vm.specification.version", "read"; permission java.util.PropertyPermission "java.vm.specification.version", "read";
permission java.util.PropertyPermission "java.vm.specification.vendor", "read"; permission java.util.PropertyPermission "java.vm.specification.vendor", "read";
permission java.util.PropertyPermission "java.vm.specification.name", "read"; permission java.util.PropertyPermission "java.vm.specification.name", "read";
permission java.util.PropertyPermission "java.vm.version", "read"; permission java.util.PropertyPermission "java.vm.version", "read";
permission java.util.PropertyPermission "java.vm.vendor", "read"; permission java.util.PropertyPermission "java.vm.vendor", "read";
permission java.util.PropertyPermission "java.vm.name", "read"; permission java.util.PropertyPermission "java.vm.name", "read";
}; };
...@@ -182,6 +182,7 @@ package.access=sun.,\ ...@@ -182,6 +182,7 @@ package.access=sun.,\
com.sun.istack.internal.,\ com.sun.istack.internal.,\
com.sun.jmx.,\ com.sun.jmx.,\
com.sun.media.sound.,\ com.sun.media.sound.,\
com.sun.naming.internal.,\
com.sun.proxy.,\ com.sun.proxy.,\
com.sun.corba.se.,\ com.sun.corba.se.,\
com.sun.org.apache.bcel.internal.,\ com.sun.org.apache.bcel.internal.,\
...@@ -205,7 +206,7 @@ package.access=sun.,\ ...@@ -205,7 +206,7 @@ package.access=sun.,\
com.sun.org.glassfish.,\ com.sun.org.glassfish.,\
com.oracle.xmlns.internal.,\ com.oracle.xmlns.internal.,\
com.oracle.webservices.internal.,\ com.oracle.webservices.internal.,\
oracle.jrockit.jfr.,\ oracle.jrockit.jfr.,\
org.jcp.xml.dsig.internal.,\ org.jcp.xml.dsig.internal.,\
jdk.internal.,\ jdk.internal.,\
jdk.nashorn.internal.,\ jdk.nashorn.internal.,\
...@@ -228,6 +229,7 @@ package.definition=sun.,\ ...@@ -228,6 +229,7 @@ package.definition=sun.,\
com.sun.istack.internal.,\ com.sun.istack.internal.,\
com.sun.jmx.,\ com.sun.jmx.,\
com.sun.media.sound.,\ com.sun.media.sound.,\
com.sun.naming.internal.,\
com.sun.proxy.,\ com.sun.proxy.,\
com.sun.corba.se.,\ com.sun.corba.se.,\
com.sun.org.apache.bcel.internal.,\ com.sun.org.apache.bcel.internal.,\
...@@ -251,7 +253,7 @@ package.definition=sun.,\ ...@@ -251,7 +253,7 @@ package.definition=sun.,\
com.sun.org.glassfish.,\ com.sun.org.glassfish.,\
com.oracle.xmlns.internal.,\ com.oracle.xmlns.internal.,\
com.oracle.webservices.internal.,\ com.oracle.webservices.internal.,\
oracle.jrockit.jfr.,\ oracle.jrockit.jfr.,\
org.jcp.xml.dsig.internal.,\ org.jcp.xml.dsig.internal.,\
jdk.internal.,\ jdk.internal.,\
jdk.nashorn.internal.,\ jdk.nashorn.internal.,\
...@@ -494,4 +496,3 @@ jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024 ...@@ -494,4 +496,3 @@ jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024
# #
# Example: # Example:
# jdk.tls.disabledAlgorithms=MD5, SHA1, DSA, RSA keySize < 2048 # jdk.tls.disabledAlgorithms=MD5, SHA1, DSA, RSA keySize < 2048
...@@ -183,6 +183,7 @@ package.access=sun.,\ ...@@ -183,6 +183,7 @@ package.access=sun.,\
com.sun.istack.internal.,\ com.sun.istack.internal.,\
com.sun.jmx.,\ com.sun.jmx.,\
com.sun.media.sound.,\ com.sun.media.sound.,\
com.sun.naming.internal.,\
com.sun.proxy.,\ com.sun.proxy.,\
com.sun.corba.se.,\ com.sun.corba.se.,\
com.sun.org.apache.bcel.internal.,\ com.sun.org.apache.bcel.internal.,\
...@@ -229,6 +230,7 @@ package.definition=sun.,\ ...@@ -229,6 +230,7 @@ package.definition=sun.,\
com.sun.istack.internal.,\ com.sun.istack.internal.,\
com.sun.jmx.,\ com.sun.jmx.,\
com.sun.media.sound.,\ com.sun.media.sound.,\
com.sun.naming.internal.,\
com.sun.proxy.,\ com.sun.proxy.,\
com.sun.corba.se.,\ com.sun.corba.se.,\
com.sun.org.apache.bcel.internal.,\ com.sun.org.apache.bcel.internal.,\
...@@ -495,4 +497,3 @@ jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024 ...@@ -495,4 +497,3 @@ jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024
# #
# Example: # Example:
# jdk.tls.disabledAlgorithms=MD5, SHA1, DSA, RSA keySize < 2048 # jdk.tls.disabledAlgorithms=MD5, SHA1, DSA, RSA keySize < 2048
...@@ -184,6 +184,7 @@ package.access=sun.,\ ...@@ -184,6 +184,7 @@ package.access=sun.,\
com.sun.istack.internal.,\ com.sun.istack.internal.,\
com.sun.jmx.,\ com.sun.jmx.,\
com.sun.media.sound.,\ com.sun.media.sound.,\
com.sun.naming.internal.,\
com.sun.proxy.,\ com.sun.proxy.,\
com.sun.corba.se.,\ com.sun.corba.se.,\
com.sun.org.apache.bcel.internal.,\ com.sun.org.apache.bcel.internal.,\
...@@ -207,7 +208,7 @@ package.access=sun.,\ ...@@ -207,7 +208,7 @@ package.access=sun.,\
com.sun.org.glassfish.,\ com.sun.org.glassfish.,\
com.oracle.xmlns.internal.,\ com.oracle.xmlns.internal.,\
com.oracle.webservices.internal.,\ com.oracle.webservices.internal.,\
oracle.jrockit.jfr.,\ oracle.jrockit.jfr.,\
org.jcp.xml.dsig.internal.,\ org.jcp.xml.dsig.internal.,\
jdk.internal.,\ jdk.internal.,\
jdk.nashorn.internal.,\ jdk.nashorn.internal.,\
...@@ -229,6 +230,7 @@ package.definition=sun.,\ ...@@ -229,6 +230,7 @@ package.definition=sun.,\
com.sun.istack.internal.,\ com.sun.istack.internal.,\
com.sun.jmx.,\ com.sun.jmx.,\
com.sun.media.sound.,\ com.sun.media.sound.,\
com.sun.naming.internal.,\
com.sun.proxy.,\ com.sun.proxy.,\
com.sun.corba.se.,\ com.sun.corba.se.,\
com.sun.org.apache.bcel.internal.,\ com.sun.org.apache.bcel.internal.,\
...@@ -252,7 +254,7 @@ package.definition=sun.,\ ...@@ -252,7 +254,7 @@ package.definition=sun.,\
com.sun.org.glassfish.,\ com.sun.org.glassfish.,\
com.oracle.xmlns.internal.,\ com.oracle.xmlns.internal.,\
com.oracle.webservices.internal.,\ com.oracle.webservices.internal.,\
oracle.jrockit.jfr.,\ oracle.jrockit.jfr.,\
org.jcp.xml.dsig.internal.,\ org.jcp.xml.dsig.internal.,\
jdk.internal.,\ jdk.internal.,\
jdk.nashorn.internal.,\ jdk.nashorn.internal.,\
...@@ -494,4 +496,3 @@ jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024 ...@@ -494,4 +496,3 @@ jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024
# #
# Example: # Example:
# jdk.tls.disabledAlgorithms=MD5, SHA1, DSA, RSA keySize < 2048 # jdk.tls.disabledAlgorithms=MD5, SHA1, DSA, RSA keySize < 2048
...@@ -183,6 +183,7 @@ package.access=sun.,\ ...@@ -183,6 +183,7 @@ package.access=sun.,\
com.sun.istack.internal.,\ com.sun.istack.internal.,\
com.sun.jmx.,\ com.sun.jmx.,\
com.sun.media.sound.,\ com.sun.media.sound.,\
com.sun.naming.internal.,\
com.sun.proxy.,\ com.sun.proxy.,\
com.sun.corba.se.,\ com.sun.corba.se.,\
com.sun.org.apache.bcel.internal.,\ com.sun.org.apache.bcel.internal.,\
...@@ -206,7 +207,7 @@ package.access=sun.,\ ...@@ -206,7 +207,7 @@ package.access=sun.,\
com.sun.org.glassfish.,\ com.sun.org.glassfish.,\
com.oracle.xmlns.internal.,\ com.oracle.xmlns.internal.,\
com.oracle.webservices.internal.,\ com.oracle.webservices.internal.,\
oracle.jrockit.jfr.,\ oracle.jrockit.jfr.,\
org.jcp.xml.dsig.internal.,\ org.jcp.xml.dsig.internal.,\
jdk.internal.,\ jdk.internal.,\
jdk.nashorn.internal.,\ jdk.nashorn.internal.,\
...@@ -229,6 +230,7 @@ package.definition=sun.,\ ...@@ -229,6 +230,7 @@ package.definition=sun.,\
com.sun.istack.internal.,\ com.sun.istack.internal.,\
com.sun.jmx.,\ com.sun.jmx.,\
com.sun.media.sound.,\ com.sun.media.sound.,\
com.sun.naming.internal.,\
com.sun.proxy.,\ com.sun.proxy.,\
com.sun.corba.se.,\ com.sun.corba.se.,\
com.sun.org.apache.bcel.internal.,\ com.sun.org.apache.bcel.internal.,\
...@@ -252,7 +254,7 @@ package.definition=sun.,\ ...@@ -252,7 +254,7 @@ package.definition=sun.,\
com.sun.org.glassfish.,\ com.sun.org.glassfish.,\
com.oracle.xmlns.internal.,\ com.oracle.xmlns.internal.,\
com.oracle.webservices.internal.,\ com.oracle.webservices.internal.,\
oracle.jrockit.jfr.,\ oracle.jrockit.jfr.,\
org.jcp.xml.dsig.internal.,\ org.jcp.xml.dsig.internal.,\
jdk.internal.,\ jdk.internal.,\
jdk.nashorn.internal.,\ jdk.nashorn.internal.,\
...@@ -495,4 +497,3 @@ jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024 ...@@ -495,4 +497,3 @@ jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024
# #
# Example: # Example:
# jdk.tls.disabledAlgorithms=MD5, SHA1, DSA, RSA keySize < 2048 # jdk.tls.disabledAlgorithms=MD5, SHA1, DSA, RSA keySize < 2048
...@@ -111,8 +111,9 @@ SplashDone(Splash * splash) ...@@ -111,8 +111,9 @@ SplashDone(Splash * splash)
int int
SplashIsStillLooping(Splash * splash) SplashIsStillLooping(Splash * splash)
{ {
if (splash->currentFrame < 0) if (splash->currentFrame < 0) {
return 0; return 0;
}
return splash->loopCount != 1 || return splash->loopCount != 1 ||
splash->currentFrame + 1 < splash->frameCount; splash->currentFrame + 1 < splash->frameCount;
} }
...@@ -121,17 +122,22 @@ void ...@@ -121,17 +122,22 @@ void
SplashUpdateScreenData(Splash * splash) SplashUpdateScreenData(Splash * splash)
{ {
ImageRect srcRect, dstRect; ImageRect srcRect, dstRect;
if (splash->currentFrame < 0) {
return;
}
initRect(&srcRect, 0, 0, splash->width, splash->height, 1, initRect(&srcRect, 0, 0, splash->width, splash->height, 1,
splash->width * sizeof(rgbquad_t), splash->width * sizeof(rgbquad_t),
splash->frames[splash->currentFrame].bitmapBits, &splash->imageFormat); splash->frames[splash->currentFrame].bitmapBits, &splash->imageFormat);
if (splash->screenData) if (splash->screenData) {
free(splash->screenData); free(splash->screenData);
}
splash->screenStride = splash->width * splash->screenFormat.depthBytes; splash->screenStride = splash->width * splash->screenFormat.depthBytes;
if (splash->byteAlignment > 1) if (splash->byteAlignment > 1) {
splash->screenStride = splash->screenStride =
(splash->screenStride + splash->byteAlignment - 1) & (splash->screenStride + splash->byteAlignment - 1) &
~(splash->byteAlignment - 1); ~(splash->byteAlignment - 1);
}
splash->screenData = malloc(splash->height * splash->screenStride); splash->screenData = malloc(splash->height * splash->screenStride);
initRect(&dstRect, 0, 0, splash->width, splash->height, 1, initRect(&dstRect, 0, 0, splash->width, splash->height, 1,
splash->screenStride, splash->screenData, &splash->screenFormat); splash->screenStride, splash->screenData, &splash->screenFormat);
...@@ -146,16 +152,19 @@ SplashUpdateScreenData(Splash * splash) ...@@ -146,16 +152,19 @@ SplashUpdateScreenData(Splash * splash)
void void
SplashNextFrame(Splash * splash) SplashNextFrame(Splash * splash)
{ {
if (splash->currentFrame < 0) if (splash->currentFrame < 0) {
return; return;
}
do { do {
if (!SplashIsStillLooping(splash)) if (!SplashIsStillLooping(splash)) {
return; return;
}
splash->time += splash->frames[splash->currentFrame].delay; splash->time += splash->frames[splash->currentFrame].delay;
if (++splash->currentFrame >= splash->frameCount) { if (++splash->currentFrame >= splash->frameCount) {
splash->currentFrame = 0; splash->currentFrame = 0;
if (splash->loopCount > 0) if (splash->loopCount > 0) {
splash->loopCount--; splash->loopCount--;
}
} }
} while (splash->time + splash->frames[splash->currentFrame].delay - } while (splash->time + splash->frames[splash->currentFrame].delay -
SplashTime() <= 0); SplashTime() <= 0);
...@@ -183,8 +192,9 @@ BitmapToYXBandedRectangles(ImageRect * pSrcRect, RECT_T * out) ...@@ -183,8 +192,9 @@ BitmapToYXBandedRectangles(ImageRect * pSrcRect, RECT_T * out)
pSrc += pSrcRect->depthBytes; pSrc += pSrcRect->depthBytes;
++i; ++i;
} }
if (i >= pSrcRect->numSamples) if (i >= pSrcRect->numSamples) {
break; break;
}
i0 = i; i0 = i;
while (i < pSrcRect->numSamples && while (i < pSrcRect->numSamples &&
getRGBA(pSrc, pSrcRect->format) >= ALPHA_THRESHOLD) { getRGBA(pSrc, pSrcRect->format) >= ALPHA_THRESHOLD) {
......
...@@ -55,7 +55,7 @@ le_uint32 AlternateSubstitutionSubtable::process(const LEReferenceTo<AlternateSu ...@@ -55,7 +55,7 @@ le_uint32 AlternateSubstitutionSubtable::process(const LEReferenceTo<AlternateSu
(const AlternateSetTable *) ((char *) this + alternateSetTableOffset)); (const AlternateSetTable *) ((char *) this + alternateSetTableOffset));
TTGlyphID alternate = SWAPW(alternateSetTable->alternateArray[0]); TTGlyphID alternate = SWAPW(alternateSetTable->alternateArray[0]);
if (filter == NULL || filter->accept(LE_SET_GLYPH(glyph, alternate))) { if (filter == NULL || filter->accept(LE_SET_GLYPH(glyph, alternate), success)) {
glyphIterator->setCurrGlyphID(SWAPW(alternateSetTable->alternateArray[0])); glyphIterator->setCurrGlyphID(SWAPW(alternateSetTable->alternateArray[0]));
} }
......
...@@ -37,55 +37,54 @@ ...@@ -37,55 +37,54 @@
U_NAMESPACE_BEGIN U_NAMESPACE_BEGIN
void AnchorTable::getAnchor(LEGlyphID glyphID, const LEFontInstance *fontInstance, void AnchorTable::getAnchor(const LETableReference &base, LEGlyphID glyphID, const LEFontInstance *fontInstance,
LEPoint &anchor) const LEPoint &anchor, LEErrorCode &success) const
{ {
switch(SWAPW(anchorFormat)) { switch(SWAPW(anchorFormat)) {
case 1: case 1:
{ {
const Format1AnchorTable *f1 = (const Format1AnchorTable *) this; LEReferenceTo<Format1AnchorTable> f1(base, success);
f1->getAnchor(f1, fontInstance, anchor, success);
f1->getAnchor(fontInstance, anchor);
break; break;
} }
case 2: case 2:
{ {
const Format2AnchorTable *f2 = (const Format2AnchorTable *) this; LEReferenceTo<Format2AnchorTable> f2(base, success);
f2->getAnchor(f2, glyphID, fontInstance, anchor, success);
f2->getAnchor(glyphID, fontInstance, anchor);
break; break;
} }
case 3: case 3:
{ {
const Format3AnchorTable *f3 = (const Format3AnchorTable *) this; LEReferenceTo<Format3AnchorTable> f3(base, success);
f3->getAnchor(f3, fontInstance, anchor, success);
f3->getAnchor(fontInstance, anchor);
break; break;
} }
default: default:
{
// unknown format: just use x, y coordinate, like format 1... // unknown format: just use x, y coordinate, like format 1...
const Format1AnchorTable *f1 = (const Format1AnchorTable *) this; LEReferenceTo<Format1AnchorTable> f1(base, success);
f1->getAnchor(f1, fontInstance, anchor, success);
f1->getAnchor(fontInstance, anchor);
break; break;
} }
}
} }
void Format1AnchorTable::getAnchor(const LEFontInstance *fontInstance, LEPoint &anchor) const void Format1AnchorTable::getAnchor(const LEReferenceTo<Format1AnchorTable>& base, const LEFontInstance *fontInstance, LEPoint &anchor, LEErrorCode &success) const
{ {
le_int16 x = SWAPW(xCoordinate); le_int16 x = SWAPW(xCoordinate);
le_int16 y = SWAPW(yCoordinate); le_int16 y = SWAPW(yCoordinate);
LEPoint pixels; LEPoint pixels;
fontInstance->transformFunits(x, y, pixels); fontInstance->transformFunits(x, y, pixels);
fontInstance->pixelsToUnits(pixels, anchor); fontInstance->pixelsToUnits(pixels, anchor);
} }
void Format2AnchorTable::getAnchor(LEGlyphID glyphID, const LEFontInstance *fontInstance, LEPoint &anchor) const void Format2AnchorTable::getAnchor(const LEReferenceTo<Format2AnchorTable>& base,
LEGlyphID glyphID, const LEFontInstance *fontInstance, LEPoint &anchor
, LEErrorCode &success) const
{ {
LEPoint point; LEPoint point;
...@@ -100,7 +99,8 @@ void Format2AnchorTable::getAnchor(LEGlyphID glyphID, const LEFontInstance *font ...@@ -100,7 +99,8 @@ void Format2AnchorTable::getAnchor(LEGlyphID glyphID, const LEFontInstance *font
fontInstance->pixelsToUnits(point, anchor); fontInstance->pixelsToUnits(point, anchor);
} }
void Format3AnchorTable::getAnchor(const LEFontInstance *fontInstance, LEPoint &anchor) const void Format3AnchorTable::getAnchor(const LEReferenceTo<Format3AnchorTable> &base, const LEFontInstance *fontInstance,
LEPoint &anchor, LEErrorCode &success) const
{ {
le_int16 x = SWAPW(xCoordinate); le_int16 x = SWAPW(xCoordinate);
le_int16 y = SWAPW(yCoordinate); le_int16 y = SWAPW(yCoordinate);
...@@ -111,15 +111,15 @@ void Format3AnchorTable::getAnchor(const LEFontInstance *fontInstance, LEPoint & ...@@ -111,15 +111,15 @@ void Format3AnchorTable::getAnchor(const LEFontInstance *fontInstance, LEPoint &
fontInstance->transformFunits(x, y, pixels); fontInstance->transformFunits(x, y, pixels);
if (dtxOffset != 0) { if (dtxOffset != 0) {
const DeviceTable *dtx = (const DeviceTable *) ((char *) this + dtxOffset); LEReferenceTo<DeviceTable> dt(base, success, dtxOffset);
le_int16 adjx = dtx->getAdjustment((le_int16) fontInstance->getXPixelsPerEm()); le_int16 adjx = dt->getAdjustment(dt, (le_int16) fontInstance->getXPixelsPerEm(), success);
pixels.fX += adjx; pixels.fX += adjx;
} }
if (dtyOffset != 0) { if (dtyOffset != 0) {
const DeviceTable *dty = (const DeviceTable *) ((char *) this + dtyOffset); LEReferenceTo<DeviceTable> dt(base, success, dtyOffset);
le_int16 adjy = dty->getAdjustment((le_int16) fontInstance->getYPixelsPerEm()); le_int16 adjy = dt->getAdjustment(dt, (le_int16) fontInstance->getYPixelsPerEm(), success);
pixels.fY += adjy; pixels.fY += adjy;
} }
......
...@@ -49,20 +49,23 @@ struct AnchorTable ...@@ -49,20 +49,23 @@ struct AnchorTable
le_int16 xCoordinate; le_int16 xCoordinate;
le_int16 yCoordinate; le_int16 yCoordinate;
void getAnchor(LEGlyphID glyphID, const LEFontInstance *fontInstance, void getAnchor(const LETableReference &base, LEGlyphID glyphID, const LEFontInstance *fontInstance,
LEPoint &anchor) const; LEPoint &anchor, LEErrorCode &success) const;
}; };
struct Format1AnchorTable : AnchorTable struct Format1AnchorTable : AnchorTable
{ {
void getAnchor(const LEFontInstance *fontInstance, LEPoint &anchor) const; void getAnchor(const LEReferenceTo<Format1AnchorTable>& base,
const LEFontInstance *fontInstance, LEPoint &anchor, LEErrorCode &success) const;
}; };
struct Format2AnchorTable : AnchorTable struct Format2AnchorTable : AnchorTable
{ {
le_uint16 anchorPoint; le_uint16 anchorPoint;
void getAnchor(LEGlyphID glyphID, const LEFontInstance *fontInstance, LEPoint &anchor) const; void getAnchor(const LEReferenceTo<Format2AnchorTable>& base,
LEGlyphID glyphID, const LEFontInstance *fontInstance,
LEPoint &anchor, LEErrorCode &success) const;
}; };
struct Format3AnchorTable : AnchorTable struct Format3AnchorTable : AnchorTable
...@@ -70,7 +73,9 @@ struct Format3AnchorTable : AnchorTable ...@@ -70,7 +73,9 @@ struct Format3AnchorTable : AnchorTable
Offset xDeviceTableOffset; Offset xDeviceTableOffset;
Offset yDeviceTableOffset; Offset yDeviceTableOffset;
void getAnchor(const LEFontInstance *fontInstance, LEPoint &anchor) const; void getAnchor(const LEReferenceTo<Format3AnchorTable>& base,
const LEFontInstance *fontInstance, LEPoint &anchor,
LEErrorCode &success) const;
}; };
U_NAMESPACE_END U_NAMESPACE_END
......
...@@ -51,7 +51,7 @@ ...@@ -51,7 +51,7 @@
U_NAMESPACE_BEGIN U_NAMESPACE_BEGIN
le_bool CharSubstitutionFilter::accept(LEGlyphID glyph) const le_bool CharSubstitutionFilter::accept(LEGlyphID glyph, LEErrorCode &/*success*/) const
{ {
return fFontInstance->canDisplay((LEUnicode) glyph); return fFontInstance->canDisplay((LEUnicode) glyph);
} }
...@@ -147,7 +147,9 @@ void ArabicOpenTypeLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], l ...@@ -147,7 +147,9 @@ void ArabicOpenTypeLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], l
GDEFMarkFilter filter(fGDEFTable, success); GDEFMarkFilter filter(fGDEFTable, success);
adjustMarkGlyphs(glyphStorage, &filter, success); adjustMarkGlyphs(glyphStorage, &filter, success);
} else { } else {
LEReferenceTo<GlyphDefinitionTableHeader> gdefTable(CanonShaping::glyphDefinitionTable, CanonShaping::glyphDefinitionTableLen); LEReferenceTo<GlyphDefinitionTableHeader> gdefTable(LETableReference::kStaticData,
CanonShaping::glyphDefinitionTable,
CanonShaping::glyphDefinitionTableLen);
GDEFMarkFilter filter(gdefTable, success); GDEFMarkFilter filter(gdefTable, success);
adjustMarkGlyphs(&chars[offset], count, reverse, glyphStorage, &filter, success); adjustMarkGlyphs(&chars[offset], count, reverse, glyphStorage, &filter, success);
...@@ -157,9 +159,9 @@ void ArabicOpenTypeLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], l ...@@ -157,9 +159,9 @@ void ArabicOpenTypeLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], l
UnicodeArabicOpenTypeLayoutEngine::UnicodeArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, LEErrorCode &success) UnicodeArabicOpenTypeLayoutEngine::UnicodeArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, LEErrorCode &success)
: ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags | LE_CHAR_FILTER_FEATURE_FLAG, success) : ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags | LE_CHAR_FILTER_FEATURE_FLAG, success)
{ {
fGSUBTable = (const GlyphSubstitutionTableHeader *) CanonShaping::glyphSubstitutionTable; fGSUBTable.setTo(LETableReference::kStaticData, (const GlyphSubstitutionTableHeader *) CanonShaping::glyphSubstitutionTable, CanonShaping::glyphSubstitutionTableLen);
fGDEFTable = (const GlyphDefinitionTableHeader *) CanonShaping::glyphDefinitionTable; fGDEFTable.setTo(LETableReference::kStaticData, (const GlyphDefinitionTableHeader *) CanonShaping::glyphDefinitionTable, CanonShaping::glyphDefinitionTableLen);
/* OpenTypeLayoutEngine will allocate a substitution filter */ /* OpenTypeLayoutEngine will allocate a substitution filter */
} }
UnicodeArabicOpenTypeLayoutEngine::~UnicodeArabicOpenTypeLayoutEngine() UnicodeArabicOpenTypeLayoutEngine::~UnicodeArabicOpenTypeLayoutEngine()
......
...@@ -59,7 +59,8 @@ const ArabicShaping::ShapeType ArabicShaping::shapeTypes[] = ...@@ -59,7 +59,8 @@ const ArabicShaping::ShapeType ArabicShaping::shapeTypes[] =
ArabicShaping::ShapeType ArabicShaping::getShapeType(LEUnicode c) ArabicShaping::ShapeType ArabicShaping::getShapeType(LEUnicode c)
{ {
LEErrorCode success = LE_NO_ERROR; LEErrorCode success = LE_NO_ERROR;
const LEReferenceTo<ClassDefinitionTable> joiningTypes((const ClassDefinitionTable *) ArabicShaping::shapingTypeTable, const LEReferenceTo<ClassDefinitionTable> joiningTypes(LETableReference::kStaticData,
(const ClassDefinitionTable *) ArabicShaping::shapingTypeTable,
ArabicShaping::shapingTypeTableLen); ArabicShaping::shapingTypeTableLen);
le_int32 joiningType = joiningTypes->getGlyphClass(joiningTypes, c, success); le_int32 joiningType = joiningTypes->getGlyphClass(joiningTypes, c, success);
......
...@@ -60,7 +60,7 @@ void CanonShaping::reorderMarks(const LEUnicode *inChars, le_int32 charCount, le ...@@ -60,7 +60,7 @@ void CanonShaping::reorderMarks(const LEUnicode *inChars, le_int32 charCount, le
LEUnicode *outChars, LEGlyphStorage &glyphStorage) LEUnicode *outChars, LEGlyphStorage &glyphStorage)
{ {
LEErrorCode success = LE_NO_ERROR; LEErrorCode success = LE_NO_ERROR;
LEReferenceTo<GlyphDefinitionTableHeader> gdefTable(CanonShaping::glyphDefinitionTable, CanonShaping::glyphDefinitionTableLen); LEReferenceTo<GlyphDefinitionTableHeader> gdefTable(LETableReference::kStaticData, CanonShaping::glyphDefinitionTable, CanonShaping::glyphDefinitionTableLen);
LEReferenceTo<ClassDefinitionTable> classTable = gdefTable->getMarkAttachClassDefinitionTable(gdefTable, success); LEReferenceTo<ClassDefinitionTable> classTable = gdefTable->getMarkAttachClassDefinitionTable(gdefTable, success);
le_int32 *combiningClasses = LE_NEW_ARRAY(le_int32, charCount); le_int32 *combiningClasses = LE_NEW_ARRAY(le_int32, charCount);
le_int32 *indices = LE_NEW_ARRAY(le_int32, charCount); le_int32 *indices = LE_NEW_ARRAY(le_int32, charCount);
......
...@@ -43,6 +43,8 @@ class LEFontInstance; ...@@ -43,6 +43,8 @@ class LEFontInstance;
* This filter is used by character-based GSUB processors. It * This filter is used by character-based GSUB processors. It
* accepts only those characters which the given font can display. * accepts only those characters which the given font can display.
* *
* Note: Implementation is in ArabicLayoutEngine.cpp
*
* @internal * @internal
*/ */
class CharSubstitutionFilter : public UMemory, public LEGlyphFilter class CharSubstitutionFilter : public UMemory, public LEGlyphFilter
...@@ -97,7 +99,7 @@ public: ...@@ -97,7 +99,7 @@ public:
* *
* @internal * @internal
*/ */
le_bool accept(LEGlyphID glyph) const; le_bool accept(LEGlyphID glyph, LEErrorCode &success) const;
}; };
U_NAMESPACE_END U_NAMESPACE_END
......
...@@ -49,6 +49,7 @@ struct ClassDefinitionTable ...@@ -49,6 +49,7 @@ struct ClassDefinitionTable
le_int32 getGlyphClass(const LETableReference &base, LEGlyphID glyphID, LEErrorCode &success) const; le_int32 getGlyphClass(const LETableReference &base, LEGlyphID glyphID, LEErrorCode &success) const;
le_bool hasGlyphClass(const LETableReference &base, le_int32 glyphClass, LEErrorCode &success) const; le_bool hasGlyphClass(const LETableReference &base, le_int32 glyphClass, LEErrorCode &success) const;
#if LE_ENABLE_RAW
le_int32 getGlyphClass(LEGlyphID glyphID) const { le_int32 getGlyphClass(LEGlyphID glyphID) const {
LETableReference base((const le_uint8*)this); LETableReference base((const le_uint8*)this);
LEErrorCode ignored = LE_NO_ERROR; LEErrorCode ignored = LE_NO_ERROR;
...@@ -60,6 +61,7 @@ struct ClassDefinitionTable ...@@ -60,6 +61,7 @@ struct ClassDefinitionTable
LEErrorCode ignored = LE_NO_ERROR; LEErrorCode ignored = LE_NO_ERROR;
return hasGlyphClass(base,glyphClass,ignored); return hasGlyphClass(base,glyphClass,ignored);
} }
#endif
}; };
struct ClassDefFormat1Table : ClassDefinitionTable struct ClassDefFormat1Table : ClassDefinitionTable
......
...@@ -56,20 +56,32 @@ struct SubstitutionLookupRecord ...@@ -56,20 +56,32 @@ struct SubstitutionLookupRecord
struct ContextualSubstitutionBase : GlyphSubstitutionSubtable struct ContextualSubstitutionBase : GlyphSubstitutionSubtable
{ {
static le_bool matchGlyphIDs( static le_bool matchGlyphIDs(
const TTGlyphID *glyphArray, le_uint16 glyphCount, GlyphIterator *glyphIterator, const LEReferenceToArrayOf<TTGlyphID> &glyphArray, le_uint16 glyphCount, GlyphIterator *glyphIterator,
le_bool backtrack = FALSE); le_bool backtrack = FALSE);
static le_bool matchGlyphClasses( static le_bool matchGlyphClasses(
const le_uint16 *classArray, le_uint16 glyphCount, GlyphIterator *glyphIterator, const LEReferenceToArrayOf<le_uint16> &classArray, le_uint16 glyphCount, GlyphIterator *glyphIterator,
const ClassDefinitionTable *classDefinitionTable, le_bool backtrack = FALSE); const LEReferenceTo<ClassDefinitionTable> &classDefinitionTable, LEErrorCode &success, le_bool backtrack = FALSE);
static le_bool matchGlyphCoverages( static le_bool matchGlyphCoverages(
const Offset *coverageTableOffsetArray, le_uint16 glyphCount, const LEReferenceToArrayOf<Offset> &coverageTableOffsetArray, le_uint16 glyphCount,
GlyphIterator *glyphIterator, const char *offsetBase, le_bool backtrack = FALSE); GlyphIterator *glyphIterator, const LETableReference& offsetBase, LEErrorCode &success, le_bool backtrack = FALSE);
/**
* little shim to wrap the Offset array in range checking
* @private
*/
static le_bool matchGlyphCoverages(
const Offset *coverageTableOffsetArray, le_uint16 glyphCount,
GlyphIterator *glyphIterator, const LETableReference& offsetBase, LEErrorCode &success, le_bool backtrack = FALSE) {
LEReferenceToArrayOf<Offset> ref(offsetBase, success, coverageTableOffsetArray, glyphCount);
if( LE_FAILURE(success) ) { return FALSE; }
return matchGlyphCoverages(ref, glyphCount, glyphIterator, offsetBase, success, backtrack);
}
static void applySubstitutionLookups( static void applySubstitutionLookups(
const LookupProcessor *lookupProcessor, const LookupProcessor *lookupProcessor,
const SubstitutionLookupRecord *substLookupRecordArray, const LEReferenceToArrayOf<SubstitutionLookupRecord>& substLookupRecordArray,
le_uint16 substCount, le_uint16 substCount,
GlyphIterator *glyphIterator, GlyphIterator *glyphIterator,
const LEFontInstance *fontInstance, const LEFontInstance *fontInstance,
...@@ -79,7 +91,8 @@ struct ContextualSubstitutionBase : GlyphSubstitutionSubtable ...@@ -79,7 +91,8 @@ struct ContextualSubstitutionBase : GlyphSubstitutionSubtable
struct ContextualSubstitutionSubtable : ContextualSubstitutionBase struct ContextualSubstitutionSubtable : ContextualSubstitutionBase
{ {
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; le_uint32 process(const LETableReference &base, const LookupProcessor *lookupProcessor,
GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
}; };
struct ContextualSubstitutionFormat1Subtable : ContextualSubstitutionSubtable struct ContextualSubstitutionFormat1Subtable : ContextualSubstitutionSubtable
...@@ -87,7 +100,8 @@ struct ContextualSubstitutionFormat1Subtable : ContextualSubstitutionSubtable ...@@ -87,7 +100,8 @@ struct ContextualSubstitutionFormat1Subtable : ContextualSubstitutionSubtable
le_uint16 subRuleSetCount; le_uint16 subRuleSetCount;
Offset subRuleSetTableOffsetArray[ANY_NUMBER]; Offset subRuleSetTableOffsetArray[ANY_NUMBER];
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; le_uint32 process(const LETableReference &base, const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator,
const LEFontInstance *fontInstance, LEErrorCode& success) const;
}; };
LE_VAR_ARRAY(ContextualSubstitutionFormat1Subtable, subRuleSetTableOffsetArray) LE_VAR_ARRAY(ContextualSubstitutionFormat1Subtable, subRuleSetTableOffsetArray)
...@@ -116,7 +130,7 @@ struct ContextualSubstitutionFormat2Subtable : ContextualSubstitutionSubtable ...@@ -116,7 +130,7 @@ struct ContextualSubstitutionFormat2Subtable : ContextualSubstitutionSubtable
le_uint16 subClassSetCount; le_uint16 subClassSetCount;
Offset subClassSetTableOffsetArray[ANY_NUMBER]; Offset subClassSetTableOffsetArray[ANY_NUMBER];
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; le_uint32 process(const LETableReference &base, const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
}; };
LE_VAR_ARRAY(ContextualSubstitutionFormat2Subtable, subClassSetTableOffsetArray) LE_VAR_ARRAY(ContextualSubstitutionFormat2Subtable, subClassSetTableOffsetArray)
...@@ -152,13 +166,15 @@ struct ContextualSubstitutionFormat3Subtable ...@@ -152,13 +166,15 @@ struct ContextualSubstitutionFormat3Subtable
Offset coverageTableOffsetArray[ANY_NUMBER]; Offset coverageTableOffsetArray[ANY_NUMBER];
//SubstitutionLookupRecord substLookupRecord[ANY_NUMBER]; //SubstitutionLookupRecord substLookupRecord[ANY_NUMBER];
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; le_uint32 process(const LETableReference &base, const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator,
const LEFontInstance *fontInstance, LEErrorCode& success) const;
}; };
LE_VAR_ARRAY(ContextualSubstitutionFormat3Subtable, coverageTableOffsetArray) LE_VAR_ARRAY(ContextualSubstitutionFormat3Subtable, coverageTableOffsetArray)
struct ChainingContextualSubstitutionSubtable : ContextualSubstitutionBase struct ChainingContextualSubstitutionSubtable : ContextualSubstitutionBase
{ {
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; le_uint32 process(const LEReferenceTo<ChainingContextualSubstitutionSubtable> &base, const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator,
const LEFontInstance *fontInstance, LEErrorCode& success) const;
}; };
struct ChainingContextualSubstitutionFormat1Subtable : ChainingContextualSubstitutionSubtable struct ChainingContextualSubstitutionFormat1Subtable : ChainingContextualSubstitutionSubtable
...@@ -166,7 +182,8 @@ struct ChainingContextualSubstitutionFormat1Subtable : ChainingContextualSubstit ...@@ -166,7 +182,8 @@ struct ChainingContextualSubstitutionFormat1Subtable : ChainingContextualSubstit
le_uint16 chainSubRuleSetCount; le_uint16 chainSubRuleSetCount;
Offset chainSubRuleSetTableOffsetArray[ANY_NUMBER]; Offset chainSubRuleSetTableOffsetArray[ANY_NUMBER];
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; le_uint32 process(const LETableReference &base, const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator,
const LEFontInstance *fontInstance, LEErrorCode& success) const;
}; };
LE_VAR_ARRAY(ChainingContextualSubstitutionFormat1Subtable, chainSubRuleSetTableOffsetArray) LE_VAR_ARRAY(ChainingContextualSubstitutionFormat1Subtable, chainSubRuleSetTableOffsetArray)
...@@ -201,7 +218,8 @@ struct ChainingContextualSubstitutionFormat2Subtable : ChainingContextualSubstit ...@@ -201,7 +218,8 @@ struct ChainingContextualSubstitutionFormat2Subtable : ChainingContextualSubstit
le_uint16 chainSubClassSetCount; le_uint16 chainSubClassSetCount;
Offset chainSubClassSetTableOffsetArray[ANY_NUMBER]; Offset chainSubClassSetTableOffsetArray[ANY_NUMBER];
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; le_uint32 process(const LETableReference &base, const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator,
const LEFontInstance *fontInstance, LEErrorCode& success) const;
}; };
LE_VAR_ARRAY(ChainingContextualSubstitutionFormat2Subtable, chainSubClassSetTableOffsetArray) LE_VAR_ARRAY(ChainingContextualSubstitutionFormat2Subtable, chainSubClassSetTableOffsetArray)
...@@ -243,7 +261,8 @@ struct ChainingContextualSubstitutionFormat3Subtable ...@@ -243,7 +261,8 @@ struct ChainingContextualSubstitutionFormat3Subtable
//le_uint16 substCount; //le_uint16 substCount;
//SubstitutionLookupRecord substLookupRecord[ANY_NUMBER]; //SubstitutionLookupRecord substLookupRecord[ANY_NUMBER];
le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; le_uint32 process(const LETableReference &base, const LookupProcessor *lookupProcessor,
GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
}; };
LE_VAR_ARRAY(ChainingContextualSubstitutionFormat3Subtable, backtrackCoverageTableOffsetArray) LE_VAR_ARRAY(ChainingContextualSubstitutionFormat3Subtable, backtrackCoverageTableOffsetArray)
......
...@@ -37,8 +37,10 @@ ...@@ -37,8 +37,10 @@
U_NAMESPACE_BEGIN U_NAMESPACE_BEGIN
le_int32 CoverageTable::getGlyphCoverage(LEGlyphID glyphID) const le_int32 CoverageTable::getGlyphCoverage(const LETableReference &base, LEGlyphID glyphID, LEErrorCode &success) const
{ {
if(LE_FAILURE(success)) return -1;
switch(SWAPW(coverageFormat)) switch(SWAPW(coverageFormat))
{ {
case 0: case 0:
...@@ -46,16 +48,16 @@ le_int32 CoverageTable::getGlyphCoverage(LEGlyphID glyphID) const ...@@ -46,16 +48,16 @@ le_int32 CoverageTable::getGlyphCoverage(LEGlyphID glyphID) const
case 1: case 1:
{ {
const CoverageFormat1Table *f1Table = (const CoverageFormat1Table *) this; LEReferenceTo<CoverageFormat1Table> f1Table(base, success);
return f1Table->getGlyphCoverage(glyphID); return f1Table->getGlyphCoverage(f1Table, glyphID, success);
} }
case 2: case 2:
{ {
const CoverageFormat2Table *f2Table = (const CoverageFormat2Table *) this; LEReferenceTo<CoverageFormat2Table> f2Table(base, success);
return f2Table->getGlyphCoverage(glyphID); return f2Table->getGlyphCoverage(f2Table, glyphID, success);
} }
default: default:
...@@ -63,8 +65,10 @@ le_int32 CoverageTable::getGlyphCoverage(LEGlyphID glyphID) const ...@@ -63,8 +65,10 @@ le_int32 CoverageTable::getGlyphCoverage(LEGlyphID glyphID) const
} }
} }
le_int32 CoverageFormat1Table::getGlyphCoverage(LEGlyphID glyphID) const le_int32 CoverageFormat1Table::getGlyphCoverage(LEReferenceTo<CoverageFormat1Table> &base, LEGlyphID glyphID, LEErrorCode &success) const
{ {
if(LE_FAILURE(success)) return -1;
TTGlyphID ttGlyphID = (TTGlyphID) LE_GET_GLYPH(glyphID); TTGlyphID ttGlyphID = (TTGlyphID) LE_GET_GLYPH(glyphID);
le_uint16 count = SWAPW(glyphCount); le_uint16 count = SWAPW(glyphCount);
le_uint8 bit = OpenTypeUtilities::highBit(count); le_uint8 bit = OpenTypeUtilities::highBit(count);
...@@ -73,37 +77,45 @@ le_int32 CoverageFormat1Table::getGlyphCoverage(LEGlyphID glyphID) const ...@@ -73,37 +77,45 @@ le_int32 CoverageFormat1Table::getGlyphCoverage(LEGlyphID glyphID) const
le_uint16 probe = power; le_uint16 probe = power;
le_uint16 index = 0; le_uint16 index = 0;
if (count == 0) { if (count == 0) {
return -1; return -1;
} }
LEReferenceToArrayOf<TTGlyphID>(base, success, glyphArray, count);
if(LE_FAILURE(success)) return -1; // range checks array
if (SWAPW(glyphArray[extra]) <= ttGlyphID) { if (SWAPW(glyphArray[extra]) <= ttGlyphID) {
index = extra; index = extra;
} }
while (probe > (1 << 0)) { while (probe > (1 << 0)) {
probe >>= 1; probe >>= 1;
if (SWAPW(glyphArray[index + probe]) <= ttGlyphID) { if (SWAPW(glyphArray[index + probe]) <= ttGlyphID) {
index += probe; index += probe;
} }
} }
if (SWAPW(glyphArray[index]) == ttGlyphID) { if (SWAPW(glyphArray[index]) == ttGlyphID) {
return index; return index;
} }
return -1; return -1;
} }
le_int32 CoverageFormat2Table::getGlyphCoverage(LEGlyphID glyphID) const le_int32 CoverageFormat2Table::getGlyphCoverage(LEReferenceTo<CoverageFormat2Table> &base, LEGlyphID glyphID, LEErrorCode &success) const
{ {
if(LE_FAILURE(success)) return -1;
TTGlyphID ttGlyphID = (TTGlyphID) LE_GET_GLYPH(glyphID); TTGlyphID ttGlyphID = (TTGlyphID) LE_GET_GLYPH(glyphID);
le_uint16 count = SWAPW(rangeCount); le_uint16 count = SWAPW(rangeCount);
LEReferenceToArrayOf<GlyphRangeRecord> rangeRecordArrayRef(base, success, rangeRecordArray, count);
le_int32 rangeIndex = le_int32 rangeIndex =
OpenTypeUtilities::getGlyphRangeIndex(ttGlyphID, rangeRecordArray, count); OpenTypeUtilities::getGlyphRangeIndex(ttGlyphID, rangeRecordArrayRef, success);
if (rangeIndex < 0) { if (rangeIndex < 0 || LE_FAILURE(success)) { // could fail if array out of bounds
return -1; return -1;
} }
......
...@@ -46,7 +46,7 @@ struct CoverageTable ...@@ -46,7 +46,7 @@ struct CoverageTable
{ {
le_uint16 coverageFormat; le_uint16 coverageFormat;
le_int32 getGlyphCoverage(LEGlyphID glyphID) const; le_int32 getGlyphCoverage(const LETableReference &base, LEGlyphID glyphID, LEErrorCode &success) const;
}; };
struct CoverageFormat1Table : CoverageTable struct CoverageFormat1Table : CoverageTable
...@@ -54,7 +54,7 @@ struct CoverageFormat1Table : CoverageTable ...@@ -54,7 +54,7 @@ struct CoverageFormat1Table : CoverageTable
le_uint16 glyphCount; le_uint16 glyphCount;
TTGlyphID glyphArray[ANY_NUMBER]; TTGlyphID glyphArray[ANY_NUMBER];
le_int32 getGlyphCoverage(LEGlyphID glyphID) const; le_int32 getGlyphCoverage(LEReferenceTo<CoverageFormat1Table> &base, LEGlyphID glyphID, LEErrorCode &success) const;
}; };
LE_VAR_ARRAY(CoverageFormat1Table, glyphArray) LE_VAR_ARRAY(CoverageFormat1Table, glyphArray)
...@@ -64,7 +64,7 @@ struct CoverageFormat2Table : CoverageTable ...@@ -64,7 +64,7 @@ struct CoverageFormat2Table : CoverageTable
le_uint16 rangeCount; le_uint16 rangeCount;
GlyphRangeRecord rangeRecordArray[ANY_NUMBER]; GlyphRangeRecord rangeRecordArray[ANY_NUMBER];
le_int32 getGlyphCoverage(LEGlyphID glyphID) const; le_int32 getGlyphCoverage(LEReferenceTo<CoverageFormat2Table> &base, LEGlyphID glyphID, LEErrorCode &success) const;
}; };
LE_VAR_ARRAY(CoverageFormat2Table, rangeRecordArray) LE_VAR_ARRAY(CoverageFormat2Table, rangeRecordArray)
......
...@@ -51,23 +51,27 @@ le_uint32 CursiveAttachmentSubtable::process(const LEReferenceTo<CursiveAttachme ...@@ -51,23 +51,27 @@ le_uint32 CursiveAttachmentSubtable::process(const LEReferenceTo<CursiveAttachme
} }
LEPoint entryAnchor, exitAnchor; LEPoint entryAnchor, exitAnchor;
Offset entryOffset = SWAPW(entryExitRecords[coverageIndex].entryAnchor); // TODO Offset entryOffset = SWAPW(entryExitRecords[coverageIndex].entryAnchor);
Offset exitOffset = SWAPW(entryExitRecords[coverageIndex].exitAnchor); Offset exitOffset = SWAPW(entryExitRecords[coverageIndex].exitAnchor);
if (entryOffset != 0) { if (entryOffset != 0) {
const AnchorTable *entryAnchorTable = (const AnchorTable *) ((char *) this + entryOffset); LEReferenceTo<AnchorTable> entryAnchorTable(base, success, entryOffset);
entryAnchorTable->getAnchor(glyphID, fontInstance, entryAnchor); if( LE_SUCCESS(success) ) {
glyphIterator->setCursiveEntryPoint(entryAnchor); entryAnchorTable->getAnchor(entryAnchorTable, glyphID, fontInstance, entryAnchor, success);
glyphIterator->setCursiveEntryPoint(entryAnchor);
}
} else { } else {
//glyphIterator->clearCursiveEntryPoint(); //glyphIterator->clearCursiveEntryPoint();
} }
if (exitOffset != 0) { if (exitOffset != 0) {
const AnchorTable *exitAnchorTable = (const AnchorTable *) ((char *) this + exitOffset); LEReferenceTo<AnchorTable> exitAnchorTable(base, success, exitOffset);
exitAnchorTable->getAnchor(glyphID, fontInstance, exitAnchor); if( LE_SUCCESS(success) ) {
glyphIterator->setCursiveExitPoint(exitAnchor); exitAnchorTable->getAnchor(exitAnchorTable, glyphID, fontInstance, exitAnchor, success);
glyphIterator->setCursiveExitPoint(exitAnchor);
}
} else { } else {
//glyphIterator->clearCursiveExitPoint(); //glyphIterator->clearCursiveExitPoint();
} }
......
...@@ -43,7 +43,7 @@ const le_uint16 DeviceTable::fieldBits[] = { 2, 4, 8}; ...@@ -43,7 +43,7 @@ const le_uint16 DeviceTable::fieldBits[] = { 2, 4, 8};
#define FORMAT_COUNT LE_ARRAY_SIZE(fieldBits) #define FORMAT_COUNT LE_ARRAY_SIZE(fieldBits)
le_int16 DeviceTable::getAdjustment(le_uint16 ppem) const le_int16 DeviceTable::getAdjustment(const LEReferenceTo<DeviceTable>&base, le_uint16 ppem, LEErrorCode &success) const
{ {
le_uint16 start = SWAPW(startSize); le_uint16 start = SWAPW(startSize);
le_uint16 format = SWAPW(deltaFormat) - 1; le_uint16 format = SWAPW(deltaFormat) - 1;
...@@ -53,6 +53,13 @@ le_int16 DeviceTable::getAdjustment(le_uint16 ppem) const ...@@ -53,6 +53,13 @@ le_int16 DeviceTable::getAdjustment(le_uint16 ppem) const
le_uint16 sizeIndex = ppem - start; le_uint16 sizeIndex = ppem - start;
le_uint16 bits = fieldBits[format]; le_uint16 bits = fieldBits[format];
le_uint16 count = 16 / bits; le_uint16 count = 16 / bits;
LEReferenceToArrayOf<le_uint16> deltaValuesRef(base, success, deltaValues, (sizeIndex / count));
if(LE_FAILURE(success)) {
return result;
}
le_uint16 word = SWAPW(deltaValues[sizeIndex / count]); le_uint16 word = SWAPW(deltaValues[sizeIndex / count]);
le_uint16 fieldIndex = sizeIndex % count; le_uint16 fieldIndex = sizeIndex % count;
le_uint16 shift = 16 - (bits * (fieldIndex + 1)); le_uint16 shift = 16 - (bits * (fieldIndex + 1));
......
...@@ -50,7 +50,7 @@ struct DeviceTable ...@@ -50,7 +50,7 @@ struct DeviceTable
le_uint16 deltaFormat; le_uint16 deltaFormat;
le_uint16 deltaValues[ANY_NUMBER]; le_uint16 deltaValues[ANY_NUMBER];
le_int16 getAdjustment(le_uint16 ppem) const; le_int16 getAdjustment(const LEReferenceTo<DeviceTable> &base, le_uint16 ppem, LEErrorCode &success) const;
private: private:
static const le_uint16 fieldMasks[]; static const le_uint16 fieldMasks[];
......
...@@ -48,7 +48,6 @@ le_uint32 ExtensionSubtable::process(const LEReferenceTo<ExtensionSubtable> &thi ...@@ -48,7 +48,6 @@ le_uint32 ExtensionSubtable::process(const LEReferenceTo<ExtensionSubtable> &thi
const LookupProcessor *lookupProcessor, le_uint16 lookupType, const LookupProcessor *lookupProcessor, le_uint16 lookupType,
GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const
{ {
if (LE_FAILURE(success)) { if (LE_FAILURE(success)) {
return 0; return 0;
} }
......
...@@ -52,8 +52,7 @@ struct ExtensionSubtable //: GlyphSubstitutionSubtable ...@@ -52,8 +52,7 @@ struct ExtensionSubtable //: GlyphSubstitutionSubtable
le_uint16 extensionLookupType; le_uint16 extensionLookupType;
le_uint32 extensionOffset; le_uint32 extensionOffset;
le_uint32 process(const LEReferenceTo<ExtensionSubtable> &extRef, le_uint32 process(const LEReferenceTo<ExtensionSubtable> &base, const LookupProcessor *lookupProcessor, le_uint16 lookupType,
const LookupProcessor *lookupProcessor, le_uint16 lookupType,
GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const;
}; };
......
...@@ -49,11 +49,11 @@ GDEFMarkFilter::~GDEFMarkFilter() ...@@ -49,11 +49,11 @@ GDEFMarkFilter::~GDEFMarkFilter()
// nothing to do? // nothing to do?
} }
le_bool GDEFMarkFilter::accept(LEGlyphID glyph) const le_bool GDEFMarkFilter::accept(LEGlyphID glyph, LEErrorCode &success) const
{ {
le_int32 glyphClass = classDefTable->getGlyphClass(glyph); le_int32 glyphClass = classDefTable->getGlyphClass(classDefTable, glyph, success);
return glyphClass == gcdMarkGlyph; return glyphClass == gcdMarkGlyph;
} }
U_NAMESPACE_END U_NAMESPACE_END
...@@ -55,7 +55,7 @@ public: ...@@ -55,7 +55,7 @@ public:
GDEFMarkFilter(const LEReferenceTo<GlyphDefinitionTableHeader> &gdefTable, LEErrorCode &success); GDEFMarkFilter(const LEReferenceTo<GlyphDefinitionTableHeader> &gdefTable, LEErrorCode &success);
virtual ~GDEFMarkFilter(); virtual ~GDEFMarkFilter();
virtual le_bool accept(LEGlyphID glyph) const; virtual le_bool accept(LEGlyphID glyph, LEErrorCode &success) const;
}; };
U_NAMESPACE_END U_NAMESPACE_END
......
...@@ -41,14 +41,13 @@ ...@@ -41,14 +41,13 @@
U_NAMESPACE_BEGIN U_NAMESPACE_BEGIN
GlyphIterator::GlyphIterator(LEGlyphStorage &theGlyphStorage, GlyphPositionAdjustments *theGlyphPositionAdjustments, le_bool rightToLeft, le_uint16 theLookupFlags, GlyphIterator::GlyphIterator(LEGlyphStorage &theGlyphStorage, GlyphPositionAdjustments *theGlyphPositionAdjustments, le_bool rightToLeft, le_uint16 theLookupFlags,
FeatureMask theFeatureMask, const LEReferenceTo<GlyphDefinitionTableHeader> &theGlyphDefinitionTableHeader) FeatureMask theFeatureMask, const LEReferenceTo<GlyphDefinitionTableHeader> &theGlyphDefinitionTableHeader, LEErrorCode &success)
: direction(1), position(-1), nextLimit(-1), prevLimit(-1), : direction(1), position(-1), nextLimit(-1), prevLimit(-1),
glyphStorage(theGlyphStorage), glyphPositionAdjustments(theGlyphPositionAdjustments), glyphStorage(theGlyphStorage), glyphPositionAdjustments(theGlyphPositionAdjustments),
srcIndex(-1), destIndex(-1), lookupFlags(theLookupFlags), featureMask(theFeatureMask), glyphGroup(0), srcIndex(-1), destIndex(-1), lookupFlags(theLookupFlags), featureMask(theFeatureMask), glyphGroup(0),
glyphClassDefinitionTable(), markAttachClassDefinitionTable() glyphClassDefinitionTable(), markAttachClassDefinitionTable()
{ {
LEErrorCode success = LE_NO_ERROR; // TODO
le_int32 glyphCount = glyphStorage.getGlyphCount(); le_int32 glyphCount = glyphStorage.getGlyphCount();
if (theGlyphDefinitionTableHeader.isValid()) { if (theGlyphDefinitionTableHeader.isValid()) {
...@@ -388,7 +387,7 @@ void GlyphIterator::setCursiveGlyph() ...@@ -388,7 +387,7 @@ void GlyphIterator::setCursiveGlyph()
void GlyphIterator::filterResetCache(void) { void GlyphIterator::filterResetCache(void) {
filterCacheValid = FALSE; filterCacheValid = FALSE;
} }
le_bool GlyphIterator::filterGlyph(le_uint32 index) le_bool GlyphIterator::filterGlyph(le_uint32 index)
{ {
...@@ -399,53 +398,53 @@ le_bool GlyphIterator::filterGlyph(le_uint32 index) ...@@ -399,53 +398,53 @@ le_bool GlyphIterator::filterGlyph(le_uint32 index)
le_bool &filterResult = filterCache.result; // NB: Making this a reference to accept the updated value, in case le_bool &filterResult = filterCache.result; // NB: Making this a reference to accept the updated value, in case
// we want more fancy cacheing in the future. // we want more fancy cacheing in the future.
if (LE_GET_GLYPH(glyphID) >= 0xFFFE) { if (LE_GET_GLYPH(glyphID) >= 0xFFFE) {
filterResult = TRUE; filterResult = TRUE;
} else { } else {
LEErrorCode success = LE_NO_ERROR; LEErrorCode success = LE_NO_ERROR;
le_int32 glyphClass = gcdNoGlyphClass; le_int32 glyphClass = gcdNoGlyphClass;
if (glyphClassDefinitionTable.isValid()) { if (glyphClassDefinitionTable.isValid()) {
glyphClass = glyphClassDefinitionTable->getGlyphClass(glyphClassDefinitionTable, glyphID, success); glyphClass = glyphClassDefinitionTable->getGlyphClass(glyphClassDefinitionTable, glyphID, success);
} }
switch (glyphClass) { switch (glyphClass) {
case gcdNoGlyphClass: case gcdNoGlyphClass:
filterResult = FALSE; filterResult = FALSE;
break; break;
case gcdSimpleGlyph: case gcdSimpleGlyph:
filterResult = (lookupFlags & lfIgnoreBaseGlyphs) != 0; filterResult = (lookupFlags & lfIgnoreBaseGlyphs) != 0;
break; break;
case gcdLigatureGlyph: case gcdLigatureGlyph:
filterResult = (lookupFlags & lfIgnoreLigatures) != 0; filterResult = (lookupFlags & lfIgnoreLigatures) != 0;
break; break;
case gcdMarkGlyph: case gcdMarkGlyph:
if ((lookupFlags & lfIgnoreMarks) != 0) { if ((lookupFlags & lfIgnoreMarks) != 0) {
filterResult = TRUE; filterResult = TRUE;
} else { } else {
le_uint16 markAttachType = (lookupFlags & lfMarkAttachTypeMask) >> lfMarkAttachTypeShift; le_uint16 markAttachType = (lookupFlags & lfMarkAttachTypeMask) >> lfMarkAttachTypeShift;
if ((markAttachType != 0) && (markAttachClassDefinitionTable.isValid())) { if ((markAttachType != 0) && (markAttachClassDefinitionTable.isValid())) {
filterResult = (markAttachClassDefinitionTable filterResult = (markAttachClassDefinitionTable
-> getGlyphClass(markAttachClassDefinitionTable, glyphID, success) != markAttachType); -> getGlyphClass(markAttachClassDefinitionTable, glyphID, success) != markAttachType);
} else { } else {
filterResult = FALSE; filterResult = FALSE;
} }
} }
break; break;
case gcdComponentGlyph: case gcdComponentGlyph:
filterResult = ((lookupFlags & lfIgnoreBaseGlyphs) != 0); filterResult = ((lookupFlags & lfIgnoreBaseGlyphs) != 0);
break; break;
default: default:
filterResult = FALSE; filterResult = FALSE;
break; break;
} }
} }
filterCacheValid = TRUE; filterCacheValid = TRUE;
} }
return filterCache.result; return filterCache.result;
} }
......
...@@ -49,7 +49,7 @@ class GlyphPositionAdjustments; ...@@ -49,7 +49,7 @@ class GlyphPositionAdjustments;
class GlyphIterator : public UMemory { class GlyphIterator : public UMemory {
public: public:
GlyphIterator(LEGlyphStorage &theGlyphStorage, GlyphPositionAdjustments *theGlyphPositionAdjustments, le_bool rightToLeft, le_uint16 theLookupFlags, GlyphIterator(LEGlyphStorage &theGlyphStorage, GlyphPositionAdjustments *theGlyphPositionAdjustments, le_bool rightToLeft, le_uint16 theLookupFlags,
FeatureMask theFeatureMask, const LEReferenceTo<GlyphDefinitionTableHeader> &theGlyphDefinitionTableHeader); FeatureMask theFeatureMask, const LEReferenceTo<GlyphDefinitionTableHeader> &theGlyphDefinitionTableHeader, LEErrorCode &success);
GlyphIterator(GlyphIterator &that); GlyphIterator(GlyphIterator &that);
......
...@@ -95,6 +95,8 @@ le_uint32 GlyphPositioningLookupProcessor::applySubtable(const LEReferenceTo<Loo ...@@ -95,6 +95,8 @@ le_uint32 GlyphPositioningLookupProcessor::applySubtable(const LEReferenceTo<Loo
le_uint32 delta = 0; le_uint32 delta = 0;
//_LETRACE("attempting lookupType #%d", lookupType);
switch(lookupType) switch(lookupType)
{ {
case 0: case 0:
...@@ -152,21 +154,21 @@ le_uint32 GlyphPositioningLookupProcessor::applySubtable(const LEReferenceTo<Loo ...@@ -152,21 +154,21 @@ le_uint32 GlyphPositioningLookupProcessor::applySubtable(const LEReferenceTo<Loo
{ {
LEReferenceTo<ContextualPositioningSubtable> subtable(lookupSubtable, success); LEReferenceTo<ContextualPositioningSubtable> subtable(lookupSubtable, success);
delta = subtable->process(this, glyphIterator, fontInstance, success); delta = subtable->process(subtable, this , glyphIterator, fontInstance, success);
break; break;
} }
case gpstChainedContext: case gpstChainedContext:
{ {
LEReferenceTo<ChainingContextualPositioningSubtable> subtable(lookupSubtable, success); const LEReferenceTo<ChainingContextualPositioningSubtable> subtable(lookupSubtable, success);
delta = subtable->process(this, glyphIterator, fontInstance, success); delta = subtable->process(subtable, this, glyphIterator, fontInstance, success);
break; break;
} }
case gpstExtension: case gpstExtension:
{ {
LEReferenceTo<ExtensionSubtable> subtable(lookupSubtable, success); const LEReferenceTo<ExtensionSubtable> subtable(lookupSubtable, success);
delta = subtable->process(subtable, this, lookupType, glyphIterator, fontInstance, success); delta = subtable->process(subtable, this, lookupType, glyphIterator, fontInstance, success);
break; break;
...@@ -176,6 +178,12 @@ le_uint32 GlyphPositioningLookupProcessor::applySubtable(const LEReferenceTo<Loo ...@@ -176,6 +178,12 @@ le_uint32 GlyphPositioningLookupProcessor::applySubtable(const LEReferenceTo<Loo
break; break;
} }
#if LE_TRACE
if(delta != 0) {
_LETRACE("GlyphPositioningLookupProcessor applied #%d -> delta %d @ %d", lookupType, delta, glyphIterator->getCurrStreamPosition());
}
#endif
return delta; return delta;
} }
......
...@@ -123,7 +123,7 @@ le_uint32 GlyphSubstitutionLookupProcessor::applySubtable(const LEReferenceTo<Lo ...@@ -123,7 +123,7 @@ le_uint32 GlyphSubstitutionLookupProcessor::applySubtable(const LEReferenceTo<Lo
{ {
const LEReferenceTo<ContextualSubstitutionSubtable> subtable(lookupSubtable, success); const LEReferenceTo<ContextualSubstitutionSubtable> subtable(lookupSubtable, success);
delta = subtable->process(this, glyphIterator, fontInstance, success); delta = subtable->process(subtable, this, glyphIterator, fontInstance, success);
break; break;
} }
...@@ -131,7 +131,7 @@ le_uint32 GlyphSubstitutionLookupProcessor::applySubtable(const LEReferenceTo<Lo ...@@ -131,7 +131,7 @@ le_uint32 GlyphSubstitutionLookupProcessor::applySubtable(const LEReferenceTo<Lo
{ {
const LEReferenceTo<ChainingContextualSubstitutionSubtable> subtable(lookupSubtable, success); const LEReferenceTo<ChainingContextualSubstitutionSubtable> subtable(lookupSubtable, success);
delta = subtable->process(this, glyphIterator, fontInstance, success); delta = subtable->process(subtable, this, glyphIterator, fontInstance, success);
break; break;
} }
......
...@@ -44,7 +44,7 @@ ...@@ -44,7 +44,7 @@
#include "LEGlyphStorage.h" #include "LEGlyphStorage.h"
#include "IndicReordering.h" #include "IndicReordering.h"
#include <stdio.h>
U_NAMESPACE_BEGIN U_NAMESPACE_BEGIN
UOBJECT_DEFINE_RTTI_IMPLEMENTATION(IndicOpenTypeLayoutEngine) UOBJECT_DEFINE_RTTI_IMPLEMENTATION(IndicOpenTypeLayoutEngine)
...@@ -53,14 +53,14 @@ IndicOpenTypeLayoutEngine::IndicOpenTypeLayoutEngine(const LEFontInstance *fontI ...@@ -53,14 +53,14 @@ IndicOpenTypeLayoutEngine::IndicOpenTypeLayoutEngine(const LEFontInstance *fontI
le_int32 typoFlags, le_bool version2, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success) le_int32 typoFlags, le_bool version2, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success)
: OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success), fMPreFixups(NULL) : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success), fMPreFixups(NULL)
{ {
if ( version2 ) { if ( version2 ) {
fFeatureMap = IndicReordering::getv2FeatureMap(fFeatureMapCount); fFeatureMap = IndicReordering::getv2FeatureMap(fFeatureMapCount);
} else { } else {
fFeatureMap = IndicReordering::getFeatureMap(fFeatureMapCount); fFeatureMap = IndicReordering::getFeatureMap(fFeatureMapCount);
} }
fFeatureOrder = TRUE; fFeatureOrder = TRUE;
fVersion2 = version2; fVersion2 = version2;
fFilterZeroWidth = IndicReordering::getFilterZeroWidth(fScriptCode); fFilterZeroWidth = IndicReordering::getFilterZeroWidth(fScriptCode);
} }
IndicOpenTypeLayoutEngine::IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, LEErrorCode &success) IndicOpenTypeLayoutEngine::IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, LEErrorCode &success)
...@@ -68,7 +68,7 @@ IndicOpenTypeLayoutEngine::IndicOpenTypeLayoutEngine(const LEFontInstance *fontI ...@@ -68,7 +68,7 @@ IndicOpenTypeLayoutEngine::IndicOpenTypeLayoutEngine(const LEFontInstance *fontI
{ {
fFeatureMap = IndicReordering::getFeatureMap(fFeatureMapCount); fFeatureMap = IndicReordering::getFeatureMap(fFeatureMapCount);
fFeatureOrder = TRUE; fFeatureOrder = TRUE;
fVersion2 = FALSE; fVersion2 = FALSE;
} }
IndicOpenTypeLayoutEngine::~IndicOpenTypeLayoutEngine() IndicOpenTypeLayoutEngine::~IndicOpenTypeLayoutEngine()
...@@ -90,6 +90,7 @@ le_int32 IndicOpenTypeLayoutEngine::glyphProcessing(const LEUnicode chars[], le_ ...@@ -90,6 +90,7 @@ le_int32 IndicOpenTypeLayoutEngine::glyphProcessing(const LEUnicode chars[], le_
return 0; return 0;
} }
_LETRACE("IOTLE::gp, calling parent");
le_int32 retCount = OpenTypeLayoutEngine::glyphProcessing(chars, offset, count, max, rightToLeft, glyphStorage, success); le_int32 retCount = OpenTypeLayoutEngine::glyphProcessing(chars, offset, count, max, rightToLeft, glyphStorage, success);
if (LE_FAILURE(success)) { if (LE_FAILURE(success)) {
...@@ -97,11 +98,15 @@ le_int32 IndicOpenTypeLayoutEngine::glyphProcessing(const LEUnicode chars[], le_ ...@@ -97,11 +98,15 @@ le_int32 IndicOpenTypeLayoutEngine::glyphProcessing(const LEUnicode chars[], le_
} }
if (fVersion2) { if (fVersion2) {
IndicReordering::finalReordering(glyphStorage,retCount); _LETRACE("IOTLE::gp, v2 final,");
IndicReordering::applyPresentationForms(glyphStorage,retCount); IndicReordering::finalReordering(glyphStorage,retCount);
OpenTypeLayoutEngine::glyphSubstitution(count,max, rightToLeft, glyphStorage, success); _LETRACE("IOTLE::gp, v2 pres");
IndicReordering::applyPresentationForms(glyphStorage,retCount);
_LETRACE("IOTLE::gp, parent gsub");
OpenTypeLayoutEngine::glyphSubstitution(count,max, rightToLeft, glyphStorage, success);
} else { } else {
IndicReordering::adjustMPres(fMPreFixups, glyphStorage, success); _LETRACE("IOTLE::gp, adjust mpres");
IndicReordering::adjustMPres(fMPreFixups, glyphStorage, success);
} }
return retCount; return retCount;
} }
...@@ -116,6 +121,8 @@ le_int32 IndicOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], ...@@ -116,6 +121,8 @@ le_int32 IndicOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[],
return 0; return 0;
} }
_LETRACE("IOTLE: charProc");
if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) {
success = LE_ILLEGAL_ARGUMENT_ERROR; success = LE_ILLEGAL_ARGUMENT_ERROR;
return 0; return 0;
...@@ -143,8 +150,10 @@ le_int32 IndicOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], ...@@ -143,8 +150,10 @@ le_int32 IndicOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[],
le_int32 outCharCount; le_int32 outCharCount;
if (fVersion2) { if (fVersion2) {
_LETRACE("v2process");
outCharCount = IndicReordering::v2process(&chars[offset], count, fScriptCode, outChars, glyphStorage); outCharCount = IndicReordering::v2process(&chars[offset], count, fScriptCode, outChars, glyphStorage);
} else { } else {
_LETRACE("reorder");
outCharCount = IndicReordering::reorder(&chars[offset], count, fScriptCode, outChars, glyphStorage, &fMPreFixups, success); outCharCount = IndicReordering::reorder(&chars[offset], count, fScriptCode, outChars, glyphStorage, &fMPreFixups, success);
} }
......
...@@ -254,8 +254,8 @@ public: ...@@ -254,8 +254,8 @@ public:
return fGlyphStorage.getAuxData(charIndex,success); return fGlyphStorage.getAuxData(charIndex,success);
} }
void decomposeReorderMatras ( const IndicClassTable *classTable, le_int32 beginSyllable, le_int32 nextSyllable, le_int32 inv_count ) { void decomposeReorderMatras ( const IndicClassTable *classTable, le_int32 beginSyllable, le_int32 nextSyllable, le_int32 inv_count ) {
le_int32 i; le_int32 i;
LEErrorCode success = LE_NO_ERROR; LEErrorCode success = LE_NO_ERROR;
for ( i = beginSyllable ; i < nextSyllable ; i++ ) { for ( i = beginSyllable ; i < nextSyllable ; i++ ) {
......
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
#include <stdio.h> #include <stdio.h>
#define DEBUG 0 #define DEBUG_KERN_TABLE 0
U_NAMESPACE_BEGIN U_NAMESPACE_BEGIN
...@@ -99,14 +99,14 @@ KernTable::KernTable(const LETableReference& base, LEErrorCode &success) ...@@ -99,14 +99,14 @@ KernTable::KernTable(const LETableReference& base, LEErrorCode &success)
: pairsSwapped(NULL), fTable(base) : pairsSwapped(NULL), fTable(base)
{ {
if(LE_FAILURE(success) || (fTable.isEmpty())) { if(LE_FAILURE(success) || (fTable.isEmpty())) {
#if DEBUG #if DEBUG_KERN_TABLE
fprintf(stderr, "no kern data\n"); fprintf(stderr, "no kern data\n");
#endif #endif
return; return;
} }
LEReferenceTo<KernTableHeader> header(fTable, success); LEReferenceTo<KernTableHeader> header(fTable, success);
#if DEBUG #if DEBUG_KERN_TABLE
// dump first 32 bytes of header // dump first 32 bytes of header
for (int i = 0; i < 64; ++i) { for (int i = 0; i < 64; ++i) {
fprintf(stderr, "%0.2x ", ((const char*)header.getAlias())[i]&0xff); fprintf(stderr, "%0.2x ", ((const char*)header.getAlias())[i]&0xff);
...@@ -171,13 +171,13 @@ KernTable::KernTable(const LETableReference& base, LEErrorCode &success) ...@@ -171,13 +171,13 @@ KernTable::KernTable(const LETableReference& base, LEErrorCode &success)
fprintf(stderr, " searchRange: %d entrySelector: %d rangeShift: %d\n", searchRange, entrySelector, rangeShift); fprintf(stderr, " searchRange: %d entrySelector: %d rangeShift: %d\n", searchRange, entrySelector, rangeShift);
fprintf(stderr, "[[ ignored font table entries: range %d selector %d shift %d ]]\n", SWAPW(table->searchRange), SWAPW(table->entrySelector), SWAPW(table->rangeShift)); fprintf(stderr, "[[ ignored font table entries: range %d selector %d shift %d ]]\n", SWAPW(table->searchRange), SWAPW(table->entrySelector), SWAPW(table->rangeShift));
#endif #endif
#if DEBUG #if DEBUG_KERN_TABLE
fprintf(stderr, "coverage: %0.4x nPairs: %d pairs 0x%x\n", coverage, nPairs, pairsSwapped); fprintf(stderr, "coverage: %0.4x nPairs: %d pairs 0x%x\n", coverage, nPairs, pairsSwapped);
fprintf(stderr, fprintf(stderr,
" searchRange(pairs): %d entrySelector: %d rangeShift(pairs): %d\n", " searchRange(pairs): %d entrySelector: %d rangeShift(pairs): %d\n",
searchRange, entrySelector, rangeShift); searchRange, entrySelector, rangeShift);
{ if (LE_SUCCESS(success)) {
// dump part of the pair list // dump part of the pair list
char ids[256]; char ids[256];
for (int i = 256; --i >= 0;) { for (int i = 256; --i >= 0;) {
...@@ -242,7 +242,7 @@ void KernTable::process(LEGlyphStorage& storage, LEErrorCode &success) ...@@ -242,7 +242,7 @@ void KernTable::process(LEGlyphStorage& storage, LEErrorCode &success)
p = tp; p = tp;
} }
#if DEBUG #if DEBUG_KERN_TABLE
fprintf(stderr, "binary search for %0.8x\n", key); fprintf(stderr, "binary search for %0.8x\n", key);
#endif #endif
...@@ -251,13 +251,13 @@ void KernTable::process(LEGlyphStorage& storage, LEErrorCode &success) ...@@ -251,13 +251,13 @@ void KernTable::process(LEGlyphStorage& storage, LEErrorCode &success)
probe >>= 1; probe >>= 1;
tp = (const PairInfo*)(p + (probe/KERN_PAIRINFO_SIZE)); tp = (const PairInfo*)(p + (probe/KERN_PAIRINFO_SIZE));
le_uint32 tkey = tp->key; le_uint32 tkey = tp->key;
#if DEBUG #if DEBUG_KERN_TABLE
fprintf(stdout, " %.3d (%0.8x)\n", (tp - pairsSwapped), tkey); fprintf(stdout, " %.3d (%0.8x)\n", (tp - pairsSwapped), tkey);
#endif #endif
if (tkey <= key) { if (tkey <= key) {
if (tkey == key) { if (tkey == key) {
le_int16 value = SWAPW(tp->value); le_int16 value = SWAPW(tp->value);
#if DEBUG #if DEBUG_KERN_TABLE
fprintf(stdout, "binary found kerning pair %x:%x at %d, value: 0x%x (%g)\n", fprintf(stdout, "binary found kerning pair %x:%x at %d, value: 0x%x (%g)\n",
storage[i-1], storage[i], i, value & 0xffff, font->xUnitsToPoints(value)); storage[i-1], storage[i], i, value & 0xffff, font->xUnitsToPoints(value));
fflush(stdout); fflush(stdout);
......
...@@ -181,6 +181,10 @@ public: ...@@ -181,6 +181,10 @@ public:
* *
* Subclasses which represent composite fonts should always return <code>NULL</code>. * Subclasses which represent composite fonts should always return <code>NULL</code>.
* *
* Note that implementing this function does not allow for range checking.
* Subclasses that desire the safety of range checking must implement the
* variation which has a length parameter.
*
* @param tableTag - the four byte table tag. (e.g. 'cmap') * @param tableTag - the four byte table tag. (e.g. 'cmap')
* *
* @return the address of the table in memory, or <code>NULL</code> * @return the address of the table in memory, or <code>NULL</code>
...@@ -200,6 +204,8 @@ public: ...@@ -200,6 +204,8 @@ public:
* Subclasses which represent composite fonts should always return <code>NULL</code>. * Subclasses which represent composite fonts should always return <code>NULL</code>.
* *
* This version sets a length, for range checking. * This version sets a length, for range checking.
* Note that range checking can only be accomplished if this function is
* implemented in subclasses.
* *
* @param tableTag - the four byte table tag. (e.g. 'cmap') * @param tableTag - the four byte table tag. (e.g. 'cmap')
* @param length - ignored on entry, on exit will be the length of the table if known, or -1 if unknown. * @param length - ignored on entry, on exit will be the length of the table if known, or -1 if unknown.
...@@ -572,5 +578,3 @@ inline le_int32 LEFontInstance::floatToFixed(float theFloat) ...@@ -572,5 +578,3 @@ inline le_int32 LEFontInstance::floatToFixed(float theFloat)
U_NAMESPACE_END U_NAMESPACE_END
#endif #endif
...@@ -62,7 +62,7 @@ public: ...@@ -62,7 +62,7 @@ public:
* *
* @internal * @internal
*/ */
virtual le_bool accept(LEGlyphID glyph) const = 0; virtual le_bool accept(LEGlyphID glyph, LEErrorCode &success) const = 0;
}; };
#endif /* U_HIDE_INTERNAL_API */ #endif /* U_HIDE_INTERNAL_API */
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册