mouse@LARRY.MCRCIM.MCGILL.EDU (09/15/90)
X Window System Bug Report xbugs@expo.lcs.mit.edu VERSION: R4 CLIENT MACHINE and OPERATING SYSTEM: N/A DISPLAY TYPE: Any whose root window's default visual is a StaticGray, StaticColor, or TrueColor visual. WINDOW MANAGER: N/A AREA: Server SYNOPSIS: The sample server bounces attempts to free colors allocated out of the default map, when that map is for an immutable visual type, and the screen is using cfb rather than mfb (mfb works fine). DESCRIPTION: When the root window's default visual is an immutable type, ie, StaticGray, StaticColor, or TrueColor, XFreeColors cannot be used to free cells allocated with XAllocColor from the default colormap. The server generates a BadAccess error for such attempts. This does not occur with one-bit StaticGray screens using mfb; it happens only when the display uses cfb. The problem is that the FreeColors code bounces any attempt to free colors in a colormap which was entirely allocated at creation (ie, which has the AllAllocated bit set). However, when cfb creates its default colormap, if the visual is immutable, AllocAll is used rather than AllocNone. The reason mfb doesn't have the same problem is that it uses AllocNone. REPEAT BY: Run this on any server such as described above. Then run it again on a normal color server or an mfb-based server. #include <stdio.h> #include <X11/X.h> #include <X11/Xlib.h> Display *disp; Screen *defscreen; Colormap defcmap; XColor color; main() { disp = XOpenDisplay((char *)0); if (disp == 0) { fprintf(stderr,"Can't open display\n"); exit(1); } XSynchronize(disp,True); defscreen = XDefaultScreenOfDisplay(disp); defcmap = XDefaultColormapOfScreen(defscreen); color.red = 0; color.green = 0; color.blue = 0; if (XAllocColor(disp,defcmap,&color) == 0) { fprintf(stderr,"XAllocColor failed\n"); exit(1); } XFreeColors(disp,defcmap,&color.pixel,1,0L); XCloseDisplay(disp); printf("Completed successfully\n"); exit(0); } SAMPLE FIX: My inclination would be to have cfb use AllocNone when creating its colormaps: *** mit/ddx/cfb/cfbcmap.c.old Fri Sep 14 16:42:55 1990 --- mit/ddx/cfb/cfbcmap.c Fri Sep 14 16:43:14 1990 *************** *** 212,221 **** pVisual++) ; ! if (CreateColormap(pScreen->defColormap, pScreen, pVisual, &cmap, ! (pVisual->class & DynamicClass) ? AllocNone : AllocAll, ! 0) ! != Success) return FALSE; if ((AllocColor(cmap, &ones, &ones, &ones, &(pScreen->whitePixel), 0) != Success) || --- 212,218 ---- pVisual++) ; ! if (CreateColormap(pScreen->defColormap, pScreen, pVisual, &cmap, AllocNone, 0) != Success) return FALSE; if ((AllocColor(cmap, &ones, &ones, &ones, &(pScreen->whitePixel), 0) != Success) || but I am not sure I understand all the ramifications of this. It does not cause immediate and obvious problems, but that's about all I can say for it. (It clearly works for mfb, but then, mfb preallocates all the pixels explicitly with AllocColor().) der Mouse old: mcgill-vision!mouse new: mouse@larry.mcrcim.mcgill.edu