xserver/test
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Octavia Togami bb59d6895f Fix use-after-free caused by duplicate glyphs in one glyphset
We make two glyphsets, GS1 and GS2, both with the same format depth.
GS1 contains any glyph different from the others, let's call it U
(unique). GS2 contains two glyphs with the same content, or at least
sha1 hash. Let's call them A and B.

We first register GS1 and GS2. GS1 has no problems, but before the
fix, registering GS2 breaks accounting in `globalGlyphs`. Since there
is no check for duplicate glyphs within a single set, we make two
`GlyphNew` entries for A and B. Now in the loop at the end, we go over
each entry and call `AddGlyph` and `FreeGlyph`:
1. AddGlyph(GS2, A, idA) inserts A into `globalGlyphs`
2. FreeGlyph(A) drops A's refcnt by one, but as it's being held in
   `globalGlyphs` it's kept alive.
3. AddGlyph(GS2, B, idB) finds A in `globalGlyphs` and reuses it
   instead of inserting B
4. FreeGlyph(B) drops B's refcnt by one (to zero), and B is freed.
   Before the fix, the lookup in `globalGlyphs` finds A's entry, and
   since it isn't a DeletedGlyph, it erroneously removes the
   `gr->glyph` pointing to `A` and decrements `tableEntries`. This
   results in `tableEntries` being off-by-one as `A` is still alive.

Now, we free the glyphsets in a particular order. Freeing GS1 results
in calling FreeGlyph(U), which will decrement U's refcnt to zero, and
free U. This clears out the entry in `globalGlyphs` for U and
decrements `tableEntries`, which due to the earlier error is now zero.
When `FreeGlyphSet` sees this, it clears the `globalGlyphs` for that
format depth. Now freeing A or GS2 (which transitively frees A) will
try to check the `globalGlyphs` at that format depth, but because it
was cleared out this crashes.

The fix here is to change FreeGlyph to only free a glyph from
`globalGlyphs` that is exactly the glyph being freed, so that
FreeGlyph(B) doesn't touch `globalGlyphs` at all. This keeps a proper
count in `tableEntries` and prevents `globalGlyphs[fdepth]` from being
freed before A is freed.

Closes: #1881
Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/2264>
(cherry picked from commit 81edc9caf557f7a44c5b308742814457de0eb6c0)
(cherry picked from commit 716d876142280cd66bdcf000f81428dadd5d3937)
Signed-off-by: Octavia Togami <octy@octyl.net>
2026-10-12 15:37:47 +02:00
..
bigreq test/bigreq: check write() return in request-length 2026-07-01 11:40:27 +02:00
bugs
damage tests: plug leak of results in compute_expected_damage() 2026-04-21 12:19:39 +02:00
info ci: add explicit test stage to cygwin build 2026-06-25 19:23:33 +02:00
pyxtest Fix use-after-free caused by duplicate glyphs in one glyphset 2026-10-12 15:37:47 +02:00
scripts .github: use go-x11proto test suite in the CI 2026-06-25 20:16:15 +02:00
sync test: fix <assert.h> includes 2026-06-18 10:13:25 +02:00
xi1 [PR #3162] os: split WriteToClient() into exported frontend and internal dixWriteToClient() 2026-06-26 23:17:09 +02:00
xi2 Xi: test XIQueryDevice values for relative scroll valuators 2026-10-05 20:27:19 +02:00
.gitignore
ddc-tests.c xfree86: ddc: parse CTA-861-G HDR static metadata + colorimetry data blocks 2026-08-24 13:50:42 +02:00
fixes.c test: fix <assert.h> includes 2026-06-18 10:13:25 +02:00
hashtabletest.c test: fix <assert.h> includes 2026-06-18 10:13:25 +02:00
input.c test: parentheses around macro argument symbols 2026-06-24 14:13:52 +02:00
list.c
list_zeroinit.c license: add X11 OR MIT OR AGPL-3.0-or-later to Enrico Weigelt's source files 2026-07-29 10:02:59 +02:00
meson.build xfree86: ddc: parse CTA-861-G HDR static metadata + colorimetry data blocks 2026-08-24 13:50:42 +02:00
misc.c test: parentheses around macro argument symbols 2026-06-24 14:13:52 +02:00
README
sha1.c test: add unit tests for x_sha1_* functions in os/xsha1. 2025-12-12 14:28:18 +01:00
signal-logging.c test: Fix locale-dependent assertion in signal-logging test 2026-10-04 15:04:46 +02:00
simple-xinit.c test: simple-xinit: fix warning on unused result of write() 2025-12-09 20:01:44 +01:00
string.c test: silence -Wanalyzer-null-argument warnings in strndup tests 2026-09-30 11:51:09 +02:00
test_xkb.c treewide: clean up includes of misc.h 2026-06-19 19:24:57 +02:00
tests-common.c Revert "test: fail when a child terminates abnormally" 2026-10-05 14:15:20 +02:00
tests-common.h
tests.c xfree86: ddc: parse CTA-861-G HDR static metadata + colorimetry data blocks 2026-08-24 13:50:42 +02:00
tests.h xfree86: ddc: parse CTA-861-G HDR static metadata + colorimetry data blocks 2026-08-24 13:50:42 +02:00
touch.c test: fix <assert.h> includes 2026-06-18 10:13:25 +02:00
xfree86.c
xtest.c test: xtest.c: fix missing include of <assert.h> 2026-06-18 15:54:22 +02:00

                        X server test suite

This suite contains a set of tests to verify the behaviour of functions used
internally to the server.

= How it works =
Through some automake abuse, we link the test programs with the same static
libraries as the Xorg binary. The test suites can then call various functions
and verify their behaviour - without the need to start the server or connect
clients.

This testing only works for functions that do not rely on a particular state
of the X server. Unless the test suite replicates the expected state, which
may be difficult.

= How to run the tests =
Run "make check" in the test directory. This will compile the tests and execute
them in the order specified in the TESTS variable in test/Makefile.am.

Each set of tests related to a subsystem are available as a binary that can be
executed directly. For example, run "xkb" to perform some xkb-related tests.

== Adding a new test ==
When adding a new test, ensure that you add a short description of what the
test does and what the expected outcome is.