[comp.windows.x] sun cfb: XClearArea

luik@einstein.isa.de (Andreas Luik) (10/26/90)

			  X Window System Bug Report
			    xbugs@expo.lcs.mit.edu


VERSION:
    R4, Patches 1-14

CLIENT MACHINE and OPERATING SYSTEM:
    Sun 386i running SunOS 4.0.1

DISPLAY TYPE:
    Sun CG3 (maybe all mi/cfb servers)

WINDOW MANAGER:
    twm (all)

AREA:
    server (mi/cfb)

SYNOPSIS:
    Call to XClearArea with height == -1 crashes server

DESCRIPTION:
    A call to XClearArea with a height value of -1 (or 65535) crashes
    the Sun server. The traceback is as follows:
    
    core file = core -- program ``Xsun''
    SIGSEGV	11: segmentation violation
    cfbFillBoxSolid() + 152
    cfbPaintWindow() + 14d
    miSpritePaintWindowBackground(0xc9380,0xc8a04,0x0) + 61
    miClearToBackground() +	150
    miSpriteClearToBackground() + 10a
    ProcClearToBackground(0xc8a94) + 85
    Dispatch() + 103
    main(0x4,0xfbfffd64,0xfbfffd78)	+ 39b
    
    The values are as follows:
    
    1.) Call XClearArea(dpy, w, x=5, y=5, width=65535, height=65535)
    2.) shipped X request: req->x=5, req->y=5, 
			   req->width=65535, req->height=65535
    3.) ProcClearToBackground: stuff->x=5, stuff->y=5,
			       stuff->width=65535, stuf->height=65535
    4.) miSpriteClearToBackground calls miClearToBackground
    5.) miClearToBackground: x=5, y=5, w=65535, h=65535
	computes box (suppose window has origin (0,0), width = height = 100):
	box.x1 = 0+5 = 5, box.y1 = 0+5 = 5,
	box.x2 = box.x1 + w = (short) (5 + 65535) = 4 
	box.y2 = box.y1 + h = (short) (5 + 65535) = 4
	pReg = miRegionCreate(&box,1) ---> pReg->extents == box
	miIntersect(pReg,pReg,&pWin->clipList) ---> pReg->extends unchanged
    6.) miSpritePaintWindowBackground and cfbPaintWindow do not change
	pReg
    7.) cfbFillBoxSolid is called with nBox=1, pBox=pReg->extends:
	pBox.x1 = 5, pBox.y1 = 5, pBox.x2 = 4, pBox.y2 = 4
	computations:
	h = pBox->y2 - pBox->y1 = 4 - 5 = -1
	w = pBox->x2 - pBox->x1 = 4 - 5 = -1
	loop: while (h--) { /* fill box */ }
	---> crash
	
    This seems to be a signed/unsigned problem, but I don't really
    know where to correct this (Xlib, region code in mi, cfb code). I also
    don't know in which other functions this problem exists.

REPEAT BY:
    Start the following program on a color Sun (using cfb code) and
    click into the window it creates:

#include <X11/Xlib.h>

#define BLACK       (BlackPixel (dpy, DefaultScreen (dpy)))
#define WHITE       (WhitePixel (dpy, DefaultScreen (dpy)))

main ()
{
    Display *dpy;
    Window w1;
    GC gc;

    dpy = XOpenDisplay (0);

    w1 = XCreateSimpleWindow (dpy, DefaultRootWindow (dpy),
	100, 100, 400, 500, 0, BLACK, WHITE);

    XSelectInput (dpy, w1, ButtonPressMask | ExposureMask);
    XMapWindow (dpy, w1);

    while (1) {
	XEvent event;

	XNextEvent (dpy, &event);

	switch (event.type) {
	    case ButtonPress:
		XClearArea (dpy, w1, 5, 5, 65535, 65535, False);
		break;
	}
    }
}


SAMPLE FIX:
    None. But would you please mail me one, if you have repaired the
    bug. Would you please send me at least some suggestions in which area
    this bug should be fixed.

Thanks,

Andreas Luik                Domain: luik@isa.de
(postmaster@isa.de)         BITNET: luik%isa.de@unido.bitnet
			    Bang:   ...!{uunet!unido,pyramid}!isaak!luik