8160664: JVM crashed with font manager on Solaris 12
Reviewed-by: prr, aivanov
Contributed-by: Martin Walsh <martin.walsh@oracle.com>
--- a/jdk/src/java.desktop/unix/native/common/awt/fontpath.c Tue Jul 26 11:50:19 2016 -0700
+++ b/jdk/src/java.desktop/unix/native/common/awt/fontpath.c Wed Jul 27 15:32:25 2016 +0300
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -805,30 +805,36 @@
pattern = (*FcPatternBuild)(NULL, FC_OUTLINE, FcTypeBool, FcTrue, NULL);
objset = (*FcObjectSetBuild)(FC_FILE, NULL);
fontSet = (*FcFontList)(NULL, pattern, objset);
- fontdirs = (char**)calloc(fontSet->nfont+1, sizeof(char*));
- for (f=0; f < fontSet->nfont; f++) {
- FcChar8 *file;
- FcChar8 *dir;
- if ((*FcPatternGetString)(fontSet->fonts[f], FC_FILE, 0, &file) ==
- FcResultMatch) {
- dir = (*FcStrDirname)(file);
- found = 0;
- for (i=0;i<numdirs; i++) {
- if (strcmp(fontdirs[i], (char*)dir) == 0) {
- found = 1;
- break;
+ if (fontSet == NULL) {
+ /* FcFontList() may return NULL if fonts are not installed. */
+ fontdirs = NULL;
+ } else {
+ fontdirs = (char**)calloc(fontSet->nfont+1, sizeof(char*));
+ for (f=0; f < fontSet->nfont; f++) {
+ FcChar8 *file;
+ FcChar8 *dir;
+ if ((*FcPatternGetString)(fontSet->fonts[f], FC_FILE, 0, &file) ==
+ FcResultMatch) {
+ dir = (*FcStrDirname)(file);
+ found = 0;
+ for (i=0;i<numdirs; i++) {
+ if (strcmp(fontdirs[i], (char*)dir) == 0) {
+ found = 1;
+ break;
+ }
+ }
+ if (!found) {
+ fontdirs[numdirs++] = (char*)dir;
+ } else {
+ free((char*)dir);
}
}
- if (!found) {
- fontdirs[numdirs++] = (char*)dir;
- } else {
- free((char*)dir);
- }
}
+ /* Free fontset if one was returned */
+ (*FcFontSetDestroy)(fontSet);
}
/* Free memory and close the ".so" */
- (*FcFontSetDestroy)(fontSet);
(*FcPatternDestroy)(pattern);
closeFontConfig(libfontconfig, JNI_TRUE);
return fontdirs;