# HG changeset patch # User okutsu # Date 1459489842 -32400 # Node ID 5977ba282e9b17a785baa918305e2f258003175a # Parent 30f8e8079271155545787474e39d20e26caf284c 8152817: Locale data loading fails silently when running with a security manager Reviewed-by: mchung, alanb diff -r 30f8e8079271 -r 5977ba282e9b jdk/src/java.base/share/classes/sun/util/resources/LocaleData.java --- a/jdk/src/java.base/share/classes/sun/util/resources/LocaleData.java Fri Apr 01 09:14:05 2016 +0800 +++ b/jdk/src/java.base/share/classes/sun/util/resources/LocaleData.java Fri Apr 01 14:50:42 2016 +0900 @@ -197,8 +197,6 @@ private static abstract class LocaleDataResourceBundleProvider implements ResourceBundleProvider { - abstract protected boolean isSupportedInModule(String baseName, Locale locale); - /** * Changes baseName to its module dependent package name and * calls the super class implementation. For example, @@ -217,10 +215,6 @@ * resource bundles except for the java.time supplementary data. */ public static abstract class CommonResourceBundleProvider extends LocaleDataResourceBundleProvider { - @Override - protected boolean isSupportedInModule(String baseName, Locale locale) { - return LocaleDataStrategy.INSTANCE.inJavaBaseModule(baseName, locale); - } } /** @@ -228,10 +222,6 @@ * resource bundles for java.time. */ public static abstract class SupplementaryResourceBundleProvider extends LocaleDataResourceBundleProvider { - @Override - protected boolean isSupportedInModule(String baseName, Locale locale) { - return SupplementaryStrategy.INSTANCE.inJavaBaseModule(baseName, locale); - } } // Bundles.Strategy implementations diff -r 30f8e8079271 -r 5977ba282e9b jdk/src/jdk.localedata/share/classes/sun/util/resources/provider/LocaleDataProvider.java --- a/jdk/src/jdk.localedata/share/classes/sun/util/resources/provider/LocaleDataProvider.java Fri Apr 01 09:14:05 2016 +0800 +++ b/jdk/src/jdk.localedata/share/classes/sun/util/resources/provider/LocaleDataProvider.java Fri Apr 01 14:50:42 2016 +0900 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,34 +25,33 @@ package sun.util.resources.provider; -import java.lang.reflect.Module; import java.util.Locale; import java.util.ResourceBundle; -import sun.util.locale.provider.ResourceBundleProviderSupport; import sun.util.resources.LocaleData; /** - * {@code LocaleDataProvider} in module jdk.localedata implements - * {@code LocaleDataBundleProvider} in module java.base. This class works as a - * service agent between {@code ResourceBundle.getBundle} callers in java.base - * and resource bundles in jdk.localedata. + * Service Provider for loading locale data resource bundles in jdk.localedata + * except for JavaTimeSupplementary resource bundles. */ public class LocaleDataProvider extends LocaleData.CommonResourceBundleProvider { @Override - protected boolean isSupportedInModule(String baseName, Locale locale) { - // The assumption here is that there are two modules containing - // resource bundles for locale support. If resource bundles are split - // into more modules, this method will need to be changed to determine - // what locales are exactly supported. - return !super.isSupportedInModule(baseName, locale); + public ResourceBundle getBundle(String baseName, Locale locale) { + return loadResourceBundle(toBundleName(baseName, locale)); } - @Override - public ResourceBundle getBundle(String baseName, Locale locale) { - if (isSupportedInModule(baseName, locale)) { - Module module = LocaleDataProvider.class.getModule(); - String bundleName = toBundleName(baseName, locale); - return ResourceBundleProviderSupport.loadResourceBundle(module, bundleName); + /** + * Utility method for loading a resource bundle in jdk.localedata. + */ + static ResourceBundle loadResourceBundle(String bundleName) { + Class c = Class.forName(LocaleDataProvider.class.getModule(), bundleName); + if (c != null && ResourceBundle.class.isAssignableFrom(c)) { + try { + @SuppressWarnings("unchecked") + ResourceBundle rb = ((Class) c).newInstance(); + return rb; + } catch (InstantiationException | IllegalAccessException e) { + throw new InternalError(e); + } } return null; } diff -r 30f8e8079271 -r 5977ba282e9b jdk/src/jdk.localedata/share/classes/sun/util/resources/provider/SupplementaryLocaleDataProvider.java --- a/jdk/src/jdk.localedata/share/classes/sun/util/resources/provider/SupplementaryLocaleDataProvider.java Fri Apr 01 09:14:05 2016 +0800 +++ b/jdk/src/jdk.localedata/share/classes/sun/util/resources/provider/SupplementaryLocaleDataProvider.java Fri Apr 01 14:50:42 2016 +0900 @@ -25,33 +25,16 @@ package sun.util.resources.provider; -import java.lang.reflect.Module; import java.util.Locale; import java.util.ResourceBundle; - -import sun.util.locale.provider.ResourceBundleProviderSupport; import sun.util.resources.LocaleData; /** - * {@code SupplementaryLocaleDataProvider} in module jdk.localedata implements - * {@code JavaTimeSupplementaryProvider} in module java.base. This class works as a - * service agent between {@code ResourceBundle.getBundle} callers in java.base - * and resource bundles in jdk.localedata. + * Service Provider for loading JavaTimeSupplementary resource bundles in jdk.localedata. */ public class SupplementaryLocaleDataProvider extends LocaleData.SupplementaryResourceBundleProvider { @Override - protected boolean isSupportedInModule(String baseName, Locale locale) { - // The assumption here is that there are two modules containing - // resource bundles for locale support. If resource bundles are split - // into more modules, this method will need to be changed to determine - // what locales are exactly supported. - return !super.isSupportedInModule(baseName, locale); - } - - @Override public ResourceBundle getBundle(String baseName, Locale locale) { - Module module = LocaleDataProvider.class.getModule(); - String bundleName = toBundleName(baseName, locale); - return ResourceBundleProviderSupport.loadResourceBundle(module, bundleName); + return LocaleDataProvider.loadResourceBundle(toBundleName(baseName, locale)); } } diff -r 30f8e8079271 -r 5977ba282e9b jdk/test/sun/util/locale/provider/Bug8152817.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/util/locale/provider/Bug8152817.java Fri Apr 01 14:50:42 2016 +0900 @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8152817 + * @summary Make sure that resource bundles in the jdk.localedata module are + * loaded under a security manager. + * @run main/othervm -Djava.locale.providers=COMPAT + * -Djava.security.debug=access,failure,codebase=jrt:/jdk.localedata Bug8152817 + */ + +import java.text.DateFormatSymbols; +import java.time.chrono.HijrahChronology; +import java.time.format.TextStyle; +import java.util.Calendar; +import java.util.Locale; + +public class Bug8152817 { + public static void main(String[] args) throws Exception { + System.setSecurityManager(new SecurityManager()); + + DateFormatSymbols syms = DateFormatSymbols.getInstance(Locale.GERMAN); + if (!"Oktober".equals(syms.getMonths()[Calendar.OCTOBER])) { + throw new RuntimeException("Test failed (FormatData)"); + } + + String s = HijrahChronology.INSTANCE.getDisplayName(TextStyle.FULL, Locale.GERMAN); + if (!s.contains("Islamischer Kalender")) { + throw new RuntimeException("Test failed (JavaTimeSupplementary)"); + } + } +}