8017580: Crash in font loading code on Linux (due to use of reflection)
authorprr
Mon, 19 Aug 2013 03:58:47 -0700
changeset 19356 6f8b216b81bd
parent 19355 84011dfd634b
child 19357 7780d9ec205c
8017580: Crash in font loading code on Linux (due to use of reflection) Reviewed-by: bae, vadim
jdk/src/share/native/sun/font/sunFont.c
jdk/src/share/native/sun/font/sunfontids.h
--- a/jdk/src/share/native/sun/font/sunFont.c	Fri Aug 16 15:57:28 2013 +0400
+++ b/jdk/src/share/native/sun/font/sunFont.c	Mon Aug 19 03:58:47 2013 -0700
@@ -71,13 +71,17 @@
 void initLCDGammaTables();
 
 /* placeholder for extern variable */
+static int initialisedFontIDs = 0;
 FontManagerNativeIDs sunFontIDs;
 
-JNIEXPORT void JNICALL
-Java_sun_font_SunFontManager_initIDs
-    (JNIEnv *env, jclass cls) {
+static void initFontIDs(JNIEnv *env) {
+
+     jclass tmpClass;
 
-     jclass tmpClass = (*env)->FindClass(env, "sun/font/TrueTypeFont");
+     if (initialisedFontIDs) {
+        return;
+     }
+     tmpClass = (*env)->FindClass(env, "sun/font/TrueTypeFont");
      sunFontIDs.ttReadBlockMID =
          (*env)->GetMethodID(env, tmpClass, "readBlock",
                              "(Ljava/nio/ByteBuffer;II)I");
@@ -173,9 +177,20 @@
          (*env)->GetFieldID(env, tmpClass, "lcdSubPixPos", "Z");
 
      initLCDGammaTables();
+
+     initialisedFontIDs = 1;
 }
 
-JNIEXPORT FontManagerNativeIDs getSunFontIDs() {
+JNIEXPORT void JNICALL
+Java_sun_font_SunFontManager_initIDs
+    (JNIEnv *env, jclass cls) {
+
+    initFontIDs(env);
+}
+
+JNIEXPORT FontManagerNativeIDs getSunFontIDs(JNIEnv *env) {
+
+    initFontIDs(env);
     return sunFontIDs;
 }
 
--- a/jdk/src/share/native/sun/font/sunfontids.h	Fri Aug 16 15:57:28 2013 +0400
+++ b/jdk/src/share/native/sun/font/sunfontids.h	Mon Aug 19 03:58:47 2013 -0700
@@ -84,7 +84,7 @@
 /* Note: we share variable in the context of fontmanager lib
    but we need access method to use it from separate rasterizer lib */
 extern FontManagerNativeIDs sunFontIDs;
-JNIEXPORT FontManagerNativeIDs getSunFontIDs();
+JNIEXPORT FontManagerNativeIDs getSunFontIDs(JNIEnv* env);
 
 #ifdef  __cplusplus
 }