From 1dd31aff635cafece8b4c7686b4eeb5abb1f1b57 Mon Sep 17 00:00:00 2001 From: Phil Race Date: Mon, 19 Aug 2013 03:58:47 -0700 Subject: [PATCH] 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 | 25 +++++++++++++++++----- jdk/src/share/native/sun/font/sunfontids.h | 2 +- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/jdk/src/share/native/sun/font/sunFont.c b/jdk/src/share/native/sun/font/sunFont.c index 95927b003d7..70bfee8a102 100644 --- a/jdk/src/share/native/sun/font/sunFont.c +++ b/jdk/src/share/native/sun/font/sunFont.c @@ -71,13 +71,17 @@ JNIEXPORT jlong JNICALL Java_sun_font_NullFontScaler_getGlyphImage 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 = (*env)->FindClass(env, "sun/font/TrueTypeFont"); + jclass tmpClass; + + 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 @@ Java_sun_font_SunFontManager_initIDs (*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; } diff --git a/jdk/src/share/native/sun/font/sunfontids.h b/jdk/src/share/native/sun/font/sunfontids.h index 211ab7a4c72..a7e4290ad40 100644 --- a/jdk/src/share/native/sun/font/sunfontids.h +++ b/jdk/src/share/native/sun/font/sunfontids.h @@ -84,7 +84,7 @@ typedef struct FontManagerNativeIDs { /* 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 }