6603312: Segmentation fault running java -jar SwingSet2.jar in 256 color mode
Summary: Force hiding the splashscreen if the code cannot allocate a reasonable number of color cells on PseudoColor displays
Reviewed-by: son, art
--- a/jdk/src/solaris/native/sun/awt/splashscreen/splashscreen_sys.c Tue Mar 25 18:14:15 2008 +0300
+++ b/jdk/src/solaris/native/sun/awt/splashscreen/splashscreen_sys.c Thu Mar 27 11:08:37 2008 +0300
@@ -436,6 +436,7 @@
break;
}
case PseudoColor: {
+ int availableColors;
int numColors;
int numComponents[3];
unsigned long colorIndex[SPLASH_COLOR_MAP_SIZE];
@@ -444,9 +445,20 @@
int depth = XDefaultDepthOfScreen(splash->screen);
int scale = 65535 / MAX_COLOR_VALUE;
- numColors = GetNumAvailableColors(splash->display, splash->screen,
+ availableColors = GetNumAvailableColors(splash->display, splash->screen,
splash->visual->map_entries);
- numColors = quantizeColors(numColors, numComponents);
+ numColors = quantizeColors(availableColors, numComponents);
+ if (numColors > availableColors) {
+ // Could not allocate the color cells. Most probably
+ // the pool got exhausted. Disable the splash screen.
+ XCloseDisplay(splash->display);
+ splash->isVisible = -1;
+ splash->display = NULL;
+ splash->screen = NULL;
+ splash->visual = NULL;
+ fprintf(stderr, "Warning: unable to initialize the splashscreen. Not enough available color cells.\n");
+ return;
+ }
splash->cmap = AllocColors(splash->display, splash->screen,
numColors, colorIndex);
for (i = 0; i < numColors; i++) {