patch qtbase wayland client to fix screen use-after-free crash

This commit is contained in:
Damocles 2026-04-18 22:42:39 +02:00
parent d821500db7
commit 8ad32c631a
2 changed files with 141 additions and 2 deletions

View file

@ -36,12 +36,26 @@
programs.taplo.enable = true;
programs.keep-sorted.enable = true;
};
# Patch qtbase wayland client to fix use-after-free in QWaylandSurface::oldestEnteredScreen.
# Waiting screens deleted via registry_global_remove leave dangling pointers in surface
# m_screens lists, crashing on the next screensChanged signal. Track surfaces in the
# display and scrub references before any screen deletion.
# TODO: remove once fixed upstream in Qt
qtbaseOverlay = final: prev: {
qt6 = prev.qt6.overrideScope (
qtFinal: qtPrev: {
qtbase = qtPrev.qtbase.overrideAttrs (old: {
patches = (old.patches or [ ]) ++ [ ./nix/patches/qtbase-wayland-screen-uaf.patch ];
});
}
);
};
forAllSystems =
fn:
nixpkgs.lib.genAttrs systems (
system:
fn rec {
pkgs = nixpkgs.legacyPackages.${system};
pkgs = (nixpkgs.legacyPackages.${system}).extend qtbaseOverlay;
treefmt-eval = treefmt-nix.lib.evalModule pkgs treefmt-config;
}
);
@ -52,7 +66,8 @@
packages = forAllSystems (
{ pkgs, ... }:
let
qs = quickshell.packages.${pkgs.stdenv.hostPlatform.system}.default.override {
# Rebuild quickshell against patched Qt via its overlay
qs = (pkgs.extend quickshell.overlays.default).quickshell.override {
withX11 = false;
withI3 = false;
};