xenocara/xserver/test/misc.c
matthieu 797ed93386 Protocol handling issues in X Window System servers
One year after Ilja van Sprundel, discovered and reported a large number
of issues in the way the X server code base handles requests from X clients,
they have been fixed.
2014-12-09 17:58:52 +00:00

203 lines
5.2 KiB
C

/**
* Copyright © 2011 Red Hat, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif
#include <stdint.h>
#include "misc.h"
#include "scrnintstr.h"
#include "dix.h"
#include "dixstruct.h"
ScreenInfo screenInfo;
static void
dix_version_compare(void)
{
int rc;
rc = version_compare(0, 0, 1, 0);
assert(rc < 0);
rc = version_compare(1, 0, 0, 0);
assert(rc > 0);
rc = version_compare(0, 0, 0, 0);
assert(rc == 0);
rc = version_compare(1, 0, 1, 0);
assert(rc == 0);
rc = version_compare(1, 0, 0, 9);
assert(rc > 0);
rc = version_compare(0, 9, 1, 0);
assert(rc < 0);
rc = version_compare(1, 0, 1, 9);
assert(rc < 0);
rc = version_compare(1, 9, 1, 0);
assert(rc > 0);
rc = version_compare(2, 0, 1, 9);
assert(rc > 0);
rc = version_compare(1, 9, 2, 0);
assert(rc < 0);
}
static void
dix_update_desktop_dimensions(void)
{
int i;
int x, y, w, h;
int w2, h2;
ScreenRec screens[MAXSCREENS];
for (i = 0; i < MAXSCREENS; i++)
screenInfo.screens[i] = &screens[i];
x = 0;
y = 0;
w = 10;
h = 5;
w2 = 35;
h2 = 25;
#define assert_dimensions(_x, _y, _w, _h) \
update_desktop_dimensions(); \
assert(screenInfo.x == _x); \
assert(screenInfo.y == _y); \
assert(screenInfo.width == _w); \
assert(screenInfo.height == _h);
#define set_screen(idx, _x, _y, _w, _h) \
screenInfo.screens[idx]->x = _x; \
screenInfo.screens[idx]->y = _y; \
screenInfo.screens[idx]->width = _w; \
screenInfo.screens[idx]->height = _h; \
/* single screen */
screenInfo.numScreens = 1;
set_screen(0, x, y, w, h);
assert_dimensions(x, y, w, h);
/* dualhead rightof */
screenInfo.numScreens = 2;
set_screen(1, w, 0, w2, h2);
assert_dimensions(x, y, w + w2, h2);
/* dualhead belowof */
screenInfo.numScreens = 2;
set_screen(1, 0, h, w2, h2);
assert_dimensions(x, y, w2, h + h2);
/* triplehead L shape */
screenInfo.numScreens = 3;
set_screen(1, 0, h, w2, h2);
set_screen(2, w2, h2, w, h);
assert_dimensions(x, y, w + w2, h + h2);
/* quadhead 2x2 */
screenInfo.numScreens = 4;
set_screen(1, 0, h, w, h);
set_screen(2, w, h, w, h2);
set_screen(3, w, 0, w2, h);
assert_dimensions(x, y, w + w2, h + h2);
/* quadhead horiz line */
screenInfo.numScreens = 4;
set_screen(1, w, 0, w, h);
set_screen(2, 2 * w, 0, w, h);
set_screen(3, 3 * w, 0, w, h);
assert_dimensions(x, y, 4 * w, h);
/* quadhead vert line */
screenInfo.numScreens = 4;
set_screen(1, 0, h, w, h);
set_screen(2, 0, 2 * h, w, h);
set_screen(3, 0, 3 * h, w, h);
assert_dimensions(x, y, w, 4 * h);
/* x overlap */
screenInfo.numScreens = 2;
set_screen(0, 0, 0, w2, h2);
set_screen(1, w, 0, w2, h2);
assert_dimensions(x, y, w2 + w, h2);
/* y overlap */
screenInfo.numScreens = 2;
set_screen(0, 0, 0, w2, h2);
set_screen(1, 0, h, w2, h2);
assert_dimensions(x, y, w2, h2 + h);
/* negative origin */
screenInfo.numScreens = 1;
set_screen(0, -w2, -h2, w, h);
assert_dimensions(-w2, -h2, w, h);
/* dualhead negative origin, overlap */
screenInfo.numScreens = 2;
set_screen(0, -w2, -h2, w2, h2);
set_screen(1, -w, -h, w, h);
assert_dimensions(-w2, -h2, w2, h2);
}
static int
dix_request_fixed_size_overflow(ClientRec *client)
{
xReq req = { 0 };
client->req_len = req.length = 1;
REQUEST_FIXED_SIZE(req, SIZE_MAX);
return Success;
}
static int
dix_request_fixed_size_match(ClientRec *client)
{
xReq req = { 0 };
client->req_len = req.length = 9;
REQUEST_FIXED_SIZE(req, 30);
return Success;
}
static void
dix_request_size_checks(void)
{
ClientRec client = { 0 };
int rc;
rc = dix_request_fixed_size_overflow(&client);
assert(rc == BadLength);
rc = dix_request_fixed_size_match(&client);
assert(rc == Success);
}
int
main(int argc, char **argv)
{
dix_version_compare();
dix_update_desktop_dimensions();
dix_request_size_checks();
return 0;
}