drisw: Avoid crashing when swrast_loader == NULL
authorDaniel van Vugt <daniel.van.vugt@canonical.com>
Fri, 4 Apr 2025 09:41:37 +0000 (17:41 +0800)
committerTimo Aaltonen <tjaalton@debian.org>
Tue, 22 Apr 2025 10:10:18 +0000 (13:10 +0300)
This is a blanket fix for all the segfaults in `drisw_init_screen()`
when `swrast_loader` is NULL, since 1de7c86bc1. A similar more targeted
fix for vmwgfx can be found in f3b8d7da46 ("egl: never select swrast
for vmwgfx"). We can safely return NULL because the caller
`driCreateNewScreen3` handles NULL, as does its own callers.

As this is currently the top crasher of gnome-shell since Ubuntu
upgraded to Mesa 25 and it seems to be coming from multiple different
drivers still, we want a universal fix to at least stop the crash
reports. People can figure out which drivers still need tweaking in
`dri2_load_driver` or elsewhere later.

Fixes: 1de7c86bc1 ("dri: pass through a type enum for creating screen instead of driver_extensions")
Related: https://gitlab.freedesktop.org/mesa/mesa/-/issues/12678 (radeon)
Related: https://gitlab.freedesktop.org/mesa/mesa/-/issues/12859 (radeon)
Related: https://gitlab.freedesktop.org/mesa/mesa/-/issues/12300 (nvidia-drm)
Related: https://gitlab.freedesktop.org/mesa/mesa/-/issues/12462 (nvidia-drm)
Bug-Ubuntu: https://bugs.launchpad.net/bugs/2101817

Gbp-Pq: Name drisw-Avoid-crashing-when-swrast_loader-NULL.patch

src/gallium/frontends/dri/drisw.c

index 4590b57e62669413aef7370b0e3a3db2f7125870..9bb3088386082e3367d4d3632a0cddb6f7a5ccbf 100644 (file)
@@ -32,6 +32,7 @@
 #include "util/u_memory.h"
 #include "util/u_inlines.h"
 #include "util/box.h"
+#include "util/log.h"
 #include "pipe/p_context.h"
 #include "pipe-loader/pipe_loader.h"
 #include "frontend/drisw_api.h"
@@ -620,6 +621,13 @@ drisw_init_screen(struct dri_screen *screen, bool driver_name_is_inferred)
 
    screen->swrast_no_present = debug_get_option_swrast_no_present();
 
+   if (loader == NULL) {
+      /* If you are reading this then dri2_load_driver may need tweaking */
+      mesa_logw("swrast was requested but driver is missing %s",
+                __DRI_SWRAST_LOADER);
+      return NULL;
+   }
+
    if (loader->base.version >= 4) {
       if (loader->putImageShm)
          lf = &drisw_shm_lf;