[comp.windows.x] Ambiguity or errors in protocol specification

skk@sparc.COM (Stuart Kreitman) (01/29/91)

Greetings, wizards.


I am enhancing the T7 protocol test suite to reproduce all
error conditions as defined in the protocol specification.  There
is unexpected behaviour in some of these.  The MIT staff recommended
posting these questions on the net, so please no flames about
xtest@lcs.mit.edu.  Admittedly, there is a small number of people
interested in these issues.
This is a long message. Please skip over if disinterested. 

The running environment is: Sun SLC, Sun IPC, Solbourne 5000, all running
the MIT sample server X.V11R4 with patches 1-14.

Quoted phrases starting with the symbol QUOTE are taken from the 
protocol spec.


-------------------------------------------------------------------------------



REQUEST: GrabKeyboard
PROBLEM: Reply with status GrabFrozen cannot be induced.
SCENARIO:
A test program opens two client connections to the X server.
The first client performs GrabKeyboard, GrabModeSync, expecting to
freeze the keyboard.
The second client performs GrabKeyboard, GrabModeAsync, 
expecting to see a reply with status GrabFrozen
Instead, a reply with status AlreadyGrabbed results.


QUOTE:	"This request actively grabs control of the keyboard.
		...If keyboard-mode is Synchronous, the state of the keyboard 
		(as seen by means of the protocol) appears to freeze."
	(This relates to the first client's GrabKeyboard request)


QUOTE:	"The request fails with status Frozen if the keyboard is frozen 
	 by an active grab of another client."
	(This relates to the second client's GrabKeyboard request)


What is the relationship between GrabKeyboard and the keyboard 
state called "Frozen"?  Perhaps GrabKey is the only way to truly
freeze the keyboard.
I assume the solution will apply to pointer-mode mode as well.




REQUEST: UngrabKey
PROBLEM: No error is generated when an invalid KEYCODE is specified.
SCENARIO:
A client makes an UngrabKey, specifying a KEYCODE that is outside
the range [min-keycode .. max-keycode].  

QUOTE:	"...the key must be in the range specified by min-keycode 
		and max-keycode in the connection setup (or a Value error results"
		(This is in the definition of GrabKey.  The definition of
		UngrabKey doesn't mention this at all, which may be an
		intended omission)




REQUEST: ChangeWindowAttributes
PROBLEM:  Defined cases of BadAccess doesn't cause an error
SCENARIO:
Before running the test, xdpyinfo says:
current input event mask:    0xd0001d
    KeyPressMask             ButtonPressMask          ButtonReleaseMask
    EnterWindowMask          SubstructureRedirectMask PropertyChangeMask
    ColormapChangeMask
My test program makes liberal use of GetWindowAttributes, and it confirms that
one can set these three event masks simultaneously for two clients.

QUOTE:	"...only one client at a time can select for SubstructureRedirect,
	only one client at a time can select for ResizeRedirect,
	and only one client at a time can select for ButtonPress.
	An attempt to violate these restrictions results in an Access error."




REQUEST:  CopyGC
PROBLEM:  Expected BadValue, Got Nothing
SCENARIO: A client makes a CopyGC request with an undefined bit in the ValueMask




REQUEST:  ClearArea, CopyArea, CopyPlane, PutImage
PROBLEM:   Expected BadValue, Got Nothing
SCENARIO:  These requests are made with rectangles containing negative
values or very large values for x,y


QUOTE:	RECTANGLE:	[x,y: INT16, width,height: CARD16]

Are arbitrary rectangles permitted for the above requests? Couldn't one
specify a large positive or way negative coordinate and crash the server?
Perhaps ClearArea is clipped to the window's borders.
Perhaps CopyArea, CopyPlane, PutImage are clipped to the dimensions of 
the drawable.




REQUEST: SetFontPath
PROBLEM:  Request to set a path of multiple strings generates BadValue

This is about the only request in the book that uses LISTofSTR.
I am not bright enough to figure out how to correctly specify
multiple strings from the protocol spec. alone.  I will compare my 
test with Xlib, but in the meantime, could someone explain LISTofSTR
to me?




REQUEST:  SetScreenSaver
PROBLEM:  Expected BadValue, Got Nothing
SCENARIO: Various disallowed values do not generate BadValue:
timeout = -5, interval = -5, prefer-blanking = 666, allow-exposures = 666

QUOTE:	"...setting a value to -1 restores the default. Other negative
		values generate a Value error."

QUOTE:	"prefer-blanking: { Yes, No, Default}
		allow-exposures: { Yes, No, Default}"




REQUEST:  AllocColorCells
PROBLEM:  Expected BadValue, Got Nothing
SCENARIO: Various disallowed values do not generate BadValue:
colors=0, planes=-1

QUOTE:	"The number of colors must be positive, and number of planes
		must be nonnegative (or a Value error results)."



REQUEST:  AllocColorPlanes
PROBLEM:  Expected BadValue, Got Nothing
SCENARIO: Various disallowed values do not generate BadValue:
colors=0 red=-1 green=-1 blue=-1

QUOTE:	"The number of colors must be positive, and the reds, greens, 
		and blues must be nonnegative (or a Value error results)."


REQUEST:  FreeColors
PROBLEM:  Expected BadAccess, Got Nothing
SCENARIO: Attempt to free a color on a Static VisualType


-------------------------------------------------------------------------------
All constructive comments will be very much appreciated.

	Stuart Kreitman			(415) 493-6912
	767 Loma Verde Ave, Suite D
	Palo Alto, CA 94303

rws@expo.lcs.mit.EDU (Bob Scheifler) (01/29/91)

Not obvious why you point the finger at the protocol spec for most of these.

    The second client performs GrabKeyboard, GrabModeAsync, 
    expecting to see a reply with status GrabFrozen
    Instead, a reply with status AlreadyGrabbed results.

Correct.

    "The request fails with status Frozen if the keyboard is frozen 
    by an active grab of another client."

The sentence just before this one takes precedence (that's why it comes first).

    The definition of
    UngrabKey doesn't mention this at all, which may be an
    intended omission

Since it is not mentioned, it should be viewed as an intended omission,
so no error should be expected.

    My test program makes liberal use of GetWindowAttributes, and it confirms
    that one can set these three event masks simultaneously for two clients.

Perhaps you are confused by the wording, perhaps your server has a bug.
All three can be simultaneously set; the restriction is that two distinct
clients cannot simultaneously select for the same bit.  If you think there
is a bug in the MIT R4 server, please submit a bug report along with a small
test program.

    CopyGC
    Expected BadValue, Got Nothing
    A client makes a CopyGC request with an undefined bit in the ValueMask

A server bug, not a protocol bug.

    ClearArea, CopyArea, CopyPlane, PutImage
    Expected BadValue, Got Nothing
    These requests are made with rectangles containing negative
    values or very large values for x,y

No bug here.  All values passed at the protocol level are legal for rectangles.
The server should clip.

    SetScreenSaver
    Expected BadValue, Got Nothing
    Various disallowed values do not generate BadValue

Then your server has a bug.  (The R4 server generates BadMatch, which is
also wrong.)

    AllocColorCells
    Expected BadValue, Got Nothing
    Various disallowed values do not generate BadValue:
    colors=0, planes=-1

Server bug for colors=0.  Planes at the protocol level is CARD16, so
negative numbers are not possible (hence the nonnegative restriction
given in the protocol is redundant).

    AllocColorPlanes
    Expected BadValue, Got Nothing
    Various disallowed values do not generate BadValue:
    colors=0 red=-1 green=-1 blue=-1

Server bug for colors=0.  Red/green/blue at the protocol level are CARD16, so
negative numbers are not possible (hence the nonnegative restriction given in
the protocol is redundant).

    FreeColors
    Expected BadAccess, Got Nothing
    Attempt to free a color on a Static VisualType

It is not an error to free a cell that you have actually allocated.  If
you attempted to free a cell that you had not allocated, then your server
has a bug.  If you believe this is the case with an MIT R4 server, please
submit a bug report with a small test program.