** No longer affects: mutter (Ubuntu) ** No longer affects: mutter (Ubuntu Focal)
** Changed in: glib2.0 (Ubuntu) Status: New => Fix Released ** Changed in: glib2.0 (Ubuntu Focal) Status: New => In Progress ** Changed in: glib2.0 (Ubuntu Focal) Importance: Undecided => High ** Summary changed: - gdm fails to start in a VMware Horizon VDI environment with latest mutter 3.36.9-0ubuntu0.20.04.1 in focal-updates + glib2.0: Uninitialised memory is written to gschema.compiled, failure to parse this file leads to gdm, gnome-shell failing to start ** Description changed: [Impact] - gdm fails to start in a VMware Horizon VDI environment, with Nvidia GRID - gpus passed into the VDIs. + A recent SRU of mutter 3.36.9-0ubuntu0.20.04.1 caused an outage for a + user with 300 VDIs running Focal, where GNOME applications would fail to + start, and if you reboot, gdm and gnome-shell both fail to start, and + you are left with a black screen and a blinking cursor. - Downgrading mutter from 3.36.9-0ubuntu0.20.04.1 to 3.36.1-3ubuntu3 in - -release fixes the issue, and the issue does not occur with - 3.36.7+git20201123-0.20.04.1. + After much investigation, mutter was not at fault. Instead, mutter- + common calls the libglib2.0-0 hook on upgrade: - Currently looking into what landed in bug 1919143 and bug 1905825. + Processing triggers for libglib2.0-0:amd64 (2.64.6-1~ubuntu20.04.3) ... + + This in turn calls glib-compile-schemas to recompile the gsettings + gschema cache, from the files in /usr/share/glib-2.0/schemas/. The + result is a binary gschemas.compiled file, which is loaded by libglib2.0 + on every invocation of a GNOME application, or gdm or gnome-shell to + fetch application default settings. + + Now, glib2.0 2.64.6-1~ubuntu20.04.3 in Focal has some non-deterministic + behaviour when calling glib-compile-schemas, causing generated + gschemas.compiled files to have differing contents on each run: + + # glib-compile-schemas /usr/share/glib-2.0/schemas + # cmp -l /home/ubuntu/schemas/gschemas.compiled /usr/share/glib-2.0/schemas/gschemas.compiled | gawk '{printf "%08X %02X %02X\n", $1, strtonum(0$2), strtonum(0$3)}' + 0000376F E3 D0 + 00003771 A4 DB + + # glib-compile-schemas /usr/share/glib-2.0/schemas + # cmp -l /home/ubuntu/schemas/gschemas.compiled /usr/share/glib-2.0/schemas/gschemas.compiled | gawk '{printf "%08X %02X %02X\n", $1, strtonum(0$2), strtonum(0$3)}' + 0000376F E3 C3 + 00003771 A4 98 + + # glib-compile-schemas /usr/share/glib-2.0/schemas + # cmp -l /home/ubuntu/schemas/gschemas.compiled /usr/share/glib-2.0/schemas/gschemas.compiled | gawk '{printf "%08X %02X %02X\n", $1, strtonum(0$2), strtonum(0$3)}' + 0000376F E3 68 + 00003771 A4 30 + 00003772 55 56 + + The bytes on the left are from a corrupted gschemas.compiled provided by + an affected user. The changing bytes on the right are non-deterministic. + + I ran valgrind over glib-compile-schemas, and found that we are writing + to uninitialised memory. + + https://paste.ubuntu.com/p/hvZccwdzxz/ + + What is happening is that a submodule of glib, gvdb, contains the logic + for serialising the gschema data structures, and when it allocates a + buffer to store the eventual gschemas.compiled file, it does not + initialise it. + + When we populate the fields in the buffer, some bytes are never + overwritten, and these junk bytes find themselves written to + gschemas.compiled. + + On boot, when gdm and gnome-shell attempt to parse and load this + corrupted gschemas.compiled file, it can't parse the junk bytes, and + raises and error, which propagates up to a breakpoint in glib logging, + but no debugger is present, so the kernel traps the breakpoint, and + terminates the library, and the calling application, e.g. gdm. + + The result is that the user is left starting at a black screen with a + blinking pointer. [Testcase] + On a Focal system, simply run valgrind over glib-compile-schemas: + + # valgrind glib-compile-schemas /usr/share/glib-2.0/schemas + + You will get output like this, with the warning "Syscall param + write(buf) points to uninitialised byte(s)": + + https://paste.ubuntu.com/p/hvZccwdzxz/ + + If you happen to have a large amount of gschema overrides present on + your system, like my affected user does, you can save a copy of a + generated gschema.compiled to your home directory and bindiff it against + recompiles: + + # glib-compile-schemas /usr/share/glib-2.0/schemas + # cp /usr/share/glib-2.0/schemas/gschema.compiled /home/ubuntu/schemas/gschemas.compiled + # glib-compile-schemas /usr/share/glib-2.0/schemas + # cmp -l /home/ubuntu/schemas/gschemas.compiled /usr/share/glib-2.0/schemas/gschemas.compiled | gawk '{printf "%08X %02X %02X\n", $1, strtonum(0$2), strtonum(0$3)}' + 0000376F E3 C3 + 00003771 A4 98 + + If you install the test package from the following ppa: + + https://launchpad.net/~mruffell/+archive/ubuntu/sf311791-test + + When you run valgrind, it will report a clean run with no writing to + uninitialised buffers, and all invocations of glib-compile-schemas will + be deterministic, and generate the file same with the same sha256 hash + every time. The unwritten bytes if you do a bindiff from before and + after will be all set to zero. + [Where problems can occur] + + I am doubtful that any programs are relying on buggy non-deterministic + behaviour from random bytes found in uninitialised memory, so this + should be a relatively safe change. + + Since we are updating glib, which all GNOME applications, gdm and gnome- + shell link to, if we introduce an error, it could cause these + applications to stop working, and at a worse case, see the symptoms this + bug is trying to fix, which is a blinking cursor on a blank screen. + + Installing any updates to glib also causes the gsettings gschema cache + to be re-generated, and from this bug, we know that libglib seems to + trust the gschema.compiled file and doesn't perform much validation, if + the user has bad data in their gschema files, it could lead to their + systems having issues on next boot. + + If a regression occurs, users should first attempt to re-generate their + schemas like so: + + glib-compile-schemas /usr/share/glib-2.0/schemas + + and if that fails, then they should downgrade their libglib2.0-0 + libglib2.0-bin libglib2.0-data packages. + + [Other info] + + This was fixed by the commit: + + commit ea64c739239faea463f3cb9154a12cc4532ba525 + Author: Philip Withnall <withn...@endlessm.com> + Date: Wed Mar 18 09:15:59 2020 +0000 + Subject: gvdb-builder: Initialise some memory to zero in the bloom filter + Link: https://github.com/GNOME/glib/commit/ea64c739239faea463f3cb9154a12cc4532ba525 + + Only Focal needs this patch, Groovy and up are unaffected. -- You received this bug notification because you are a member of Ubuntu Desktop Bugs, which is subscribed to mutter in Ubuntu. https://bugs.launchpad.net/bugs/1930359 Title: glib2.0: Uninitialised memory is written to gschema.compiled, failure to parse this file leads to gdm, gnome-shell failing to start To manage notifications about this bug go to: https://bugs.launchpad.net/ubuntu/+source/glib2.0/+bug/1930359/+subscriptions -- desktop-bugs mailing list desktop-bugs@lists.ubuntu.com https://lists.ubuntu.com/mailman/listinfo/desktop-bugs