Windows Version
10.0.26300.8772
WSL Version
2.9.4.0
Are you using WSL 1 or WSL 2?
Kernel Version
6.18.35.2
Distro Version
Ubuntu 26.04
Other Software
No response
Repro Steps
Save the following shell script to C:\Temp:
#!/bin/bash
shopt -s extglob
export WSL_UTF8=1
version=$( wsl.exe --version | head -n1 | cut -d' ' -f3)
version="${version%%*([[:space:]])}"
folder="/mnt/c/Temp/$version"
mkdir "$folder"
wayland-info 2>&1 >"$folder/wl.txt"
cp /mnt/wslg/*.log "$folder"
dmesg | grep -i segfault > "$folder/dmesg.txt"
cat /proc/cmdline > "$folder/cmdline.txt"
(That script runs wayland-info, which is not preinstalled by default. Make sure to have it installed before proceeding. On Ubuntu and Debian that command is available in the apt package wayland-utils)
On an elevated powershell, run psexec to launch wsl.exe on session 0 with your regular interactive user credentials (DOMAIN most likely will be just . for the local computer domain):
psexec -i 0 -u <DOMAIN\USER> -p <PASSWORD> powershell -Command "wsl.exe -u <DISTRO> -- bash /mnt/c/Temp/script.sh.
(psexec comes from Sysinternals, installable via winget).
Expected Behavior
For any recent version of WSL, the outputs of the wayland-info command (C:\Temp\<WSL_VERSION>\wl.txt) should be populated with details about the session, seat and available protocols while the filtered dmesg output (C:\Temp\<WSL_VERSION>\dmesg.txt) should not contain any crash related to WSLg.
Actual Behavior
True for WSL up to 2.7.10. On 2.9.4 the wayland-info output is empty and dmesg.txt shows a crash similar to the following line:
[ 107.040670] weston[160]: segfault at 218 ip 000078565b825ffb sp 00007fff1bd92330 error 4 in rdp-backend.so[1cffb,78565b80f000+18000] likely on CPU 2 (core 1, socket 0)
(it looks like an attempt to read an offset from the null pointer - segfault at 0x218, error 4).
Diagnostic Logs
I came across this problem after seeing a Flutter app test crash in CI running on GitHub Actions with no other changes but the WSL version. This particular CI workflow runs the app tests inside WSL. On a faulty run I noticed the following trace coming from the GTK3 layer:
(com.example.sample_app:570): Gdk-CRITICAL **: 07:57:47.797: gdk_seat_get_keyboard: assertion 'GDK_IS_SEAT (seat)' failed
That means we didn't have a seat, pointing to some fundamental issue around the graphical session.
The minimal reproducer I could come up with is running wayland-info. It shows empty on an affected instance.
AFAICT The GitHub actions runner runs as a service (thus session 0) with a user (interactive) account, thus fully capable of running WSL. Hence why using psexec to reproduce the crash: we need the user account but running in session 0. A regular interactive session doesn't experience that crash.
The less scientific but still important part: installing just the four binaries below from WSL 2.7.10 on a system running WSL 2.9.4 fixes the problem, everything else (WSLg image, kernel, distro) left at 2.9.4:
msrdc.exe
rdclientax.dll
rdpnanoTransport.dll
RdpWinStlHelper.dll
A/B/C result: interactive session → wayland-info populated, no segfault on WSL 2.9.4;
session 0 → wayland-info empty, rdp-backend.so SIGSEGV at ~107 s on 2.9.4;
session 0 → wayland-info populated, no segfault on 2.9.4 with swapped MSRDC binaries.
Inspecting the diff between WSL 2.7.10 and 2.9.3, the most noticeable and untraceable from outside is the upgrade in MSRDC.SessionHost in packages.config ( commit #2a7269e8 / PR #40882 ).
weston.log from a faulty instance:
Date: 2026-07-17 -03
[15:45:15.538] weston 9.0.0
https://wayland.freedesktop.org
Bug reports to: https://gitlab.freedesktop.org/wayland/weston/issues/
Build: 9.0.0-215-ga7e35fda
[15:45:15.538] Command line: /usr/bin/weston --backend=rdp-backend.so --modules=wslgd-notify.so --xwayland --socket=wayland-0 --shell=rdprail-shell.so --log=/mnt/wslg/weston.log --logger-scopes=log,rdp-backend,rdprail-shell
[15:45:15.538] OS: Linux, 6.18.35.2-microsoft-standard-WSL2, #1 SMP PREEMPT_DYNAMIC Wed Jun 17 23:14:00 UTC 2026, x86_64
[15:45:15.538] warning: XDG_RUNTIME_DIR "/mnt/wslg/runtime-dir" is not configured
correctly. Unix access mode must be 0700 (current mode is 777),
and must be owned by the user (current owner is UID 1000).
Refer to your distribution on how to get it, or
http://www.freedesktop.org/wiki/Specifications/basedir-spec
on how to implement it.
[15:45:15.539] Using config file '/home/wslg/.config/weston.ini'
[15:45:15.540] Output repaint window is 7 ms maximum.
[15:45:15.541] Loading module '/usr/lib/libweston-9/rdp-backend.so'
[15:45:15.548] using FreeRDP version 2.4.0
Date: 2026-07-17 -03
[15:45:15.548] RDP backend: WESTON_RDP_DEBUG_LEVEL: 3
[15:45:15.548] RDP backend: rdp_monitor_refresh_rate: 60000
[15:45:15.548] RDP backend: timer resolution tv_sec:0 tv_nsec:1
[15:45:15.548] RDP backend: Environment dump - start
[15:45:15.548] WSL2_DEFAULT_APP_ICON=/usr/share/icons/wsl/linux.png
[15:45:15.548] SHELL=/bin/bash
[15:45:15.548] WSL2_GUI_APPS_ENABLED=1
[15:45:15.548] WSL_DISTRO_NAME=
[15:45:15.548] XCURSOR_PATH=/mnt/wslg/distro/usr/share/icons:/usr/share/icons
[15:45:15.548] XCURSOR_SIZE=16
[15:45:15.548] WLOG_APPENDER=file
[15:45:15.548] NAME=DESKTOP-551PQ9O
[15:45:15.548] PWD=/home/wslg
[15:45:15.548] LOGNAME=wslg
[15:45:15.548] WSL_FEATURE_FLAGS=34
[15:45:15.548] WSL2_USER_PROFILE=C:\Users\User
[15:45:15.548] WSL2_DISTRO_NAME=Ubuntu-26.04
[15:45:15.548] _=/usr/bin/weston
[15:45:15.548] PULSE_AUDIO_RDP_SINK=/mnt/wslg/PulseAudioRDPSink
[15:45:15.548] HOME=/home/wslg
[15:45:15.548] WSLG_SERVICE_ID=00000001-FACB-11E6-BD58-64006A7986D3
[15:45:15.548] WAYLAND_DISPLAY=wayland-0
[15:45:15.548] USE_VSOCK=3
[15:45:15.548] WSL2_DEFAULT_APP_OVERLAY_ICON=/usr/share/icons/wsl/linux.png
[15:45:15.548] USER=wslg
[15:45:15.548] DISPLAY=:0
[15:45:15.548] SHLVL=0
[15:45:15.548] WSLGD_NOTIFY_SOCKET=/mnt/wslg/weston-notify.sock
[15:45:15.548] WLOG_FILEAPPENDER_OUTPUT_FILE_PATH=/mnt/wslg
[15:45:15.548] XDG_RUNTIME_DIR=/mnt/wslg/runtime-dir
[15:45:15.548] XCURSOR_THEME=whiteglass
[15:45:15.548] PATH=/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
[15:45:15.548] WESTON_DISABLE_ABSTRACT_FD=1
[15:45:15.548] WLOG_FILEAPPENDER_OUTPUT_FILE_NAME=wlog.log
[15:45:15.548] PULSE_AUDIO_RDP_SOURCE=/mnt/wslg/PulseAudioRDPSource
[15:45:15.548] PULSE_SERVER=unix:/mnt/wslg/PulseServer
[15:45:15.548] WSL2_INSTALL_PATH=C:\Program Files\WSL
[15:45:15.548] WESTON_CONFIG_FILE=/home/wslg/.config/weston.ini
[15:45:15.548] RDP backend: Environment dump - end
[15:45:15.548] RDP backend: FreeRDP version: 2.4.0
[15:45:15.548] Using external fd for incoming connections: 3
[15:45:15.548] Default head is being added
[15:45:15.548] Registered plugin API 'weston_rdprail_api_v1' of size 72
[15:45:15.548] RDPAPPLIST_MODULEDIR is set to /usr/lib/rdpapplist
[15:45:15.549] RDP backend: use_rdpapplist = 1
[15:45:15.549] WSL2_SHARED_MEMORY_MOUNT_POINT is not set.
[15:45:15.549] RDP backend: use_gfxredir = 0
[15:45:15.549] RDP backend: enable_hi_dpi_support = 1
[15:45:15.549] RDP backend: enable_fractional_hi_dpi_support = 0
[15:45:15.549] RDP backend: enable_fractional_hi_dpi_roundup = 0
[15:45:15.549] RDP backend: debug_desktop_scaling_factor = 0
[15:45:15.549] RDP backend: enable_window_zorder_sync = 1
[15:45:15.549] RDP backend: enable_window_snap_arrange = 1
[15:45:15.549] RDP backend: enable_window_shadow_remoting = 1
[15:45:15.549] RDP backend: enable_display_power_by_screenupdate = 0
[15:45:15.549] RDP backend: enable_distro_name_title = 1
[15:45:15.549] RDP backend: enable_copy_warning_title = 1
[15:45:15.549] Using VSOCK for incoming connections: 3
[15:45:15.549] Registered plugin API 'weston_rdp_output_api_v1' of size 24
[15:45:15.549] Head attaching: rdp-0, index:0, is_primary: 1
[15:45:15.549] Client desktop upper left coordinate (0,0)
[15:45:15.549] disp_monitor_validate_and_compute_layout:---OUTPUT---
[15:45:15.549] rdpMonitor[0]: x:0, y:0, width:0, height:0, is_primary:1
[15:45:15.549] rdpMonitor[0]: weston x:0, y:0, width:0, height:0
[15:45:15.549] rdpMonitor[0]: physicalWidth:0, physicalHeight:0, orientation:0
[15:45:15.549] rdpMonitor[0]: desktopScaleFactor:0, deviceScaleFactor:0
[15:45:15.549] rdpMonitor[0]: scale:1, clientScale:1.00
[15:45:15.549] Head mode change:rdp-0 NEW width:0, height:0, scale:1, clientScale:1.000000
[15:45:15.549] move head/output rdp-0 (0,0) -> (0,0)
[15:45:15.549] client origin (0,0) is (0,0) in Weston space
[15:45:15.549] Output 'rdp-0' enabled with head(s) rdp-0
[15:45:15.549] Compositor capabilities:
arbitrary surface rotation: yes
screen capture uses y-flip: no
presentation clock: CLOCK_MONOTONIC_RAW, id 4
presentation clock resolution: 0.000000001 s
[15:45:15.550] Loading module '/usr/lib/weston/rdprail-shell.so'
[15:45:15.554] RDPRAIL-shell: WESTON_RDPRAIL_SHELL_DEBUG_LEVEL: 3.
Date: 2026-07-17 -03
[15:45:15.554] RDPRAIL-shell: allow-zap:0
[15:45:15.554] RDPRAIL-shell: allow-alt-f4-to-close-app:1
[15:45:15.554] RDPRAIL-shell: binding-modifier:none
[15:45:15.554] RDPRAIL-shell: local-move:0
[15:45:15.554] RDPRAIL-shell: distro name:Ubuntu-26.04 (len:12)
[15:45:15.557] RDPRAIL-shell: WSL2_DEFAULT_APP_ICON:/usr/share/icons/wsl/linux.png (loaded:yes)
[15:45:15.557] RDPRAIL-shell: WSL2_DEFAULT_APP_OVERLAY_ICON:/usr/share/icons/wsl/linux.png (loaded:yes)
[15:45:15.557] RDPRAIL-shell: WESTON_RDPRAIL_SHELL_APPEND_DISTRONAME_STARTMEN:1
[15:45:15.557] RDPRAIL-shell: WESTON_RDPRAIL_SHELL_BLEND_OVERLAY_ICON_APPLIST:1
[15:45:15.557] RDPRAIL-shell: WESTON_RDPRAIL_SHELL_BLEND_OVERLAY_ICON_TASKBAR:1
[15:45:15.557] RDPRAIL-shell: WESTON_RDPRAIL_SHELL_USE_WSLPATH:0
[15:45:15.557] rdp_rail_shell_initialize_notify: shell: distro name: Ubuntu-26.04
[15:45:15.558] app_list_monitor_thread: running in user-distro: Ubuntu-26.04
[15:45:15.559] Loading module '/usr/lib/libweston-9/xwayland.so'
[15:45:15.559] app_list_monitor_thread: inotify_add_watch(/usr/share/applications)
[15:45:15.559] app_list_monitor_thread: monitor /usr/share/applications
[15:45:15.559] app_list_monitor_thread: /usr/local/share/applications doesn't exist, skipping.
[15:45:15.559] app_list_monitor_thread: /var/lib/snapd/desktop/applications doesn't exist, skipping.
[15:45:15.559] app_list_monitor_thread: /var/lib/flatpak/exports/share/applications doesn't exist, skipping.
[15:45:15.559] app list folder[0]: /usr/share/applications
[15:45:15.560] Registered plugin API 'weston_xwayland_v1' of size 32
[15:45:15.560] Registered plugin API 'weston_xwayland_surface_v1' of size 48
[15:45:15.560] Not using abstract fd for Xwayland
[15:45:15.560] xserver listening on display :0
[15:45:15.560] Loading module '/usr/lib/weston/wslgd-notify.so'
[15:45:15.560] desktop file: /usr/share/applications/org.freedesktop.Xwayland.desktop has NoDisplay specified
[15:45:15.560] app list entry failed to update: Key:Xwayland
[15:45:15.560] free_app_entry(): (null): /usr/share/applications/org.freedesktop.Xwayland.desktop
[15:45:15.560] app list folder[1]: /usr/local/share/applications
[15:45:15.560] app list folder[2]: /var/lib/snapd/desktop/applications
[15:45:15.560] app list folder[3]: /var/lib/flatpak/exports/share/applications
[15:45:15.560] ../compositor/wslgd-notify.c: socket connected
[15:45:15.640] Spawned Xwayland server, pid 28
[15:45:15.746] xfixes version: 6.0
[15:45:15.761] created wm, root 912
[15:47:00.294] unable to checkDescriptor for 0x625ac1c6f890
Date: 2026-07-17 -03
[15:47:00.324] weston 9.0.0
https://wayland.freedesktop.org
Bug reports to: https://gitlab.freedesktop.org/wayland/weston/issues/
Build: 9.0.0-215-ga7e35fda
[15:47:00.324] Command line: /usr/bin/weston --backend=rdp-backend.so --modules=wslgd-notify.so --xwayland --socket=wayland-0 --shell=rdprail-shell.so --log=/mnt/wslg/weston.log --logger-scopes=log,rdp-backend,rdprail-shell
[15:47:00.324] OS: Linux, 6.18.35.2-microsoft-standard-WSL2, #1 SMP PREEMPT_DYNAMIC Wed Jun 17 23:14:00 UTC 2026, x86_64
[15:47:00.324] warning: XDG_RUNTIME_DIR "/mnt/wslg/runtime-dir" is not configured
correctly. Unix access mode must be 0700 (current mode is 777),
and must be owned by the user (current owner is UID 1000).
Refer to your distribution on how to get it, or
http://www.freedesktop.org/wiki/Specifications/basedir-spec
on how to implement it.
[15:47:00.324] Using config file '/home/wslg/.config/weston.ini'
[15:47:00.324] Output repaint window is 7 ms maximum.
[15:47:00.324] Loading module '/usr/lib/libweston-9/rdp-backend.so'
[15:47:00.327] using FreeRDP version 2.4.0
Date: 2026-07-17 -03
[15:47:00.327] RDP backend: WESTON_RDP_DEBUG_LEVEL: 3
[15:47:00.327] RDP backend: rdp_monitor_refresh_rate: 60000
[15:47:00.327] RDP backend: timer resolution tv_sec:0 tv_nsec:1
[15:47:00.327] RDP backend: Environment dump - start
[15:47:00.327] WSL2_DEFAULT_APP_ICON=/usr/share/icons/wsl/linux.png
[15:47:00.327] SHELL=/bin/bash
[15:47:00.327] WSL2_GUI_APPS_ENABLED=1
[15:47:00.327] WSL_DISTRO_NAME=
[15:47:00.327] XCURSOR_PATH=/mnt/wslg/distro/usr/share/icons:/usr/share/icons
[15:47:00.327] XCURSOR_SIZE=16
[15:47:00.327] WLOG_APPENDER=file
[15:47:00.327] NAME=DESKTOP-551PQ9O
[15:47:00.327] PWD=/home/wslg
[15:47:00.327] LOGNAME=wslg
[15:47:00.327] WSL_FEATURE_FLAGS=34
[15:47:00.327] WSL2_USER_PROFILE=C:\Users\User
[15:47:00.327] WSL2_DISTRO_NAME=Ubuntu-26.04
[15:47:00.327] _=/usr/bin/weston
[15:47:00.327] PULSE_AUDIO_RDP_SINK=/mnt/wslg/PulseAudioRDPSink
[15:47:00.327] HOME=/home/wslg
[15:47:00.327] WSLG_SERVICE_ID=00000001-FACB-11E6-BD58-64006A7986D3
[15:47:00.327] WAYLAND_DISPLAY=wayland-0
[15:47:00.327] USE_VSOCK=3
[15:47:00.327] WSL2_DEFAULT_APP_OVERLAY_ICON=/usr/share/icons/wsl/linux.png
[15:47:00.327] USER=wslg
[15:47:00.327] DISPLAY=:0
[15:47:00.327] SHLVL=0
[15:47:00.327] WSLGD_NOTIFY_SOCKET=/mnt/wslg/weston-notify.sock
[15:47:00.327] WLOG_FILEAPPENDER_OUTPUT_FILE_PATH=/mnt/wslg
[15:47:00.327] XDG_RUNTIME_DIR=/mnt/wslg/runtime-dir
[15:47:00.327] XCURSOR_THEME=whiteglass
[15:47:00.327] PATH=/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
[15:47:00.327] WESTON_DISABLE_ABSTRACT_FD=1
[15:47:00.327] WLOG_FILEAPPENDER_OUTPUT_FILE_NAME=wlog.log
[15:47:00.327] PULSE_AUDIO_RDP_SOURCE=/mnt/wslg/PulseAudioRDPSource
[15:47:00.327] PULSE_SERVER=unix:/mnt/wslg/PulseServer
[15:47:00.327] WSL2_INSTALL_PATH=C:\Program Files\WSL
[15:47:00.327] WESTON_CONFIG_FILE=/home/wslg/.config/weston.ini
[15:47:00.327] RDP backend: Environment dump - end
[15:47:00.327] RDP backend: FreeRDP version: 2.4.0
[15:47:00.327] Using external fd for incoming connections: 3
[15:47:00.327] Default head is being added
[15:47:00.327] Registered plugin API 'weston_rdprail_api_v1' of size 72
[15:47:00.327] RDPAPPLIST_MODULEDIR is set to /usr/lib/rdpapplist
[15:47:00.327] RDP backend: use_rdpapplist = 1
[15:47:00.327] WSL2_SHARED_MEMORY_MOUNT_POINT is not set.
[15:47:00.327] RDP backend: use_gfxredir = 0
[15:47:00.327] RDP backend: enable_hi_dpi_support = 1
[15:47:00.327] RDP backend: enable_fractional_hi_dpi_support = 0
[15:47:00.327] RDP backend: enable_fractional_hi_dpi_roundup = 0
[15:47:00.327] RDP backend: debug_desktop_scaling_factor = 0
[15:47:00.327] RDP backend: enable_window_zorder_sync = 1
[15:47:00.327] RDP backend: enable_window_snap_arrange = 1
[15:47:00.327] RDP backend: enable_window_shadow_remoting = 1
[15:47:00.327] RDP backend: enable_display_power_by_screenupdate = 0
[15:47:00.327] RDP backend: enable_distro_name_title = 1
[15:47:00.327] RDP backend: enable_copy_warning_title = 1
[15:47:00.327] Using VSOCK for incoming connections: 3
[15:47:00.327] Registered plugin API 'weston_rdp_output_api_v1' of size 24
[15:47:00.327] Head attaching: rdp-0, index:0, is_primary: 1
[15:47:00.327] Client desktop upper left coordinate (0,0)
[15:47:00.327] disp_monitor_validate_and_compute_layout:---OUTPUT---
[15:47:00.327] rdpMonitor[0]: x:0, y:0, width:0, height:0, is_primary:1
[15:47:00.327] rdpMonitor[0]: weston x:0, y:0, width:0, height:0
[15:47:00.327] rdpMonitor[0]: physicalWidth:0, physicalHeight:0, orientation:0
[15:47:00.327] rdpMonitor[0]: desktopScaleFactor:0, deviceScaleFactor:0
[15:47:00.327] rdpMonitor[0]: scale:1, clientScale:1.00
[15:47:00.327] Head mode change:rdp-0 NEW width:0, height:0, scale:1, clientScale:1.000000
[15:47:00.327] move head/output rdp-0 (0,0) -> (0,0)
[15:47:00.327] client origin (0,0) is (0,0) in Weston space
[15:47:00.327] Output 'rdp-0' enabled with head(s) rdp-0
[15:47:00.327] Compositor capabilities:
arbitrary surface rotation: yes
screen capture uses y-flip: no
presentation clock: CLOCK_MONOTONIC_RAW, id 4
presentation clock resolution: 0.000000001 s
[15:47:00.327] Loading module '/usr/lib/weston/rdprail-shell.so'
[15:47:00.333] RDPRAIL-shell: WESTON_RDPRAIL_SHELL_DEBUG_LEVEL: 3.
Date: 2026-07-17 -03
[15:47:00.333] RDPRAIL-shell: allow-zap:0
[15:47:00.333] RDPRAIL-shell: allow-alt-f4-to-close-app:1
[15:47:00.333] RDPRAIL-shell: binding-modifier:none
[15:47:00.333] RDPRAIL-shell: local-move:0
[15:47:00.333] RDPRAIL-shell: distro name:Ubuntu-26.04 (len:12)
[15:47:00.334] RDPRAIL-shell: WSL2_DEFAULT_APP_ICON:/usr/share/icons/wsl/linux.png (loaded:yes)
[15:47:00.334] RDPRAIL-shell: WSL2_DEFAULT_APP_OVERLAY_ICON:/usr/share/icons/wsl/linux.png (loaded:yes)
[15:47:00.334] RDPRAIL-shell: WESTON_RDPRAIL_SHELL_APPEND_DISTRONAME_STARTMEN:1
[15:47:00.334] RDPRAIL-shell: WESTON_RDPRAIL_SHELL_BLEND_OVERLAY_ICON_APPLIST:1
[15:47:00.334] RDPRAIL-shell: WESTON_RDPRAIL_SHELL_BLEND_OVERLAY_ICON_TASKBAR:1
[15:47:00.334] RDPRAIL-shell: WESTON_RDPRAIL_SHELL_USE_WSLPATH:0
[15:47:00.334] rdp_rail_shell_initialize_notify: shell: distro name: Ubuntu-26.04
[15:47:00.335] app_list_monitor_thread: running in user-distro: Ubuntu-26.04
[15:47:00.336] app_list_monitor_thread: inotify_add_watch(/usr/share/applications)
[15:47:00.335] Loading module '/usr/lib/libweston-9/xwayland.so'
[15:47:00.336] app_list_monitor_thread: monitor /usr/share/applications
[15:47:00.336] app_list_monitor_thread: /usr/local/share/applications doesn't exist, skipping.
[15:47:00.336] app_list_monitor_thread: /var/lib/snapd/desktop/applications doesn't exist, skipping.
[15:47:00.336] app_list_monitor_thread: /var/lib/flatpak/exports/share/applications doesn't exist, skipping.
[15:47:00.336] app list folder[0]: /usr/share/applications
[15:47:00.336] desktop file: /usr/share/applications/org.freedesktop.Xwayland.desktop has NoDisplay specified
[15:47:00.336] app list entry failed to update: Key:Xwayland
[15:47:00.336] free_app_entry(): (null): /usr/share/applications/org.freedesktop.Xwayland.desktop
[15:47:00.336] app list folder[1]: /usr/local/share/applications
[15:47:00.336] app list folder[2]: /var/lib/snapd/desktop/applications
[15:47:00.336] app list folder[3]: /var/lib/flatpak/exports/share/applications
[15:47:00.336] Registered plugin API 'weston_xwayland_v1' of size 32
[15:47:00.336] Registered plugin API 'weston_xwayland_surface_v1' of size 48
[15:47:00.336] unlinking stale lock file /tmp/.X0-lock
[15:47:00.336] Not using abstract fd for Xwayland
[15:47:00.336] xserver listening on display :0
[15:47:00.336] Loading module '/usr/lib/weston/wslgd-notify.so'
[15:47:00.337] wet_module_init: connect(/mnt/wslg/weston-notify.sock) failed No such file or directory
Details
Why this use case matter?
Running graphical apps inside WSL in GitHub Actions is a good way to smoke test the platform and how well we (the distributions) are integrating with it in an automated fashion.
Secondary observations from logs (not the root cause)
weston.log: XDG_RUNTIME_DIR "/mnt/wslg/runtime-dir" is not configured correctly. Unix access mode must be 0700 (current mode is 777) — the runtime
dir is world-writable; also causes dbus to refuse its transient service
directory. Worth reporting but not the crash trigger.
dbus: Unknown username "pulse" — the pulse user is absent in the system
distro; cosmetic.
wet_module_init: connect(/mnt/wslg/weston-notify.sock) failed appears in the
post-crash restart (the notify socket from the previous instance is gone).
Windows Version
10.0.26300.8772
WSL Version
2.9.4.0
Are you using WSL 1 or WSL 2?
Kernel Version
6.18.35.2
Distro Version
Ubuntu 26.04
Other Software
No response
Repro Steps
Save the following shell script to
C:\Temp:(That script runs
wayland-info, which is not preinstalled by default. Make sure to have it installed before proceeding. On Ubuntu and Debian that command is available in the apt packagewayland-utils)On an elevated powershell, run psexec to launch wsl.exe on session 0 with your regular interactive user credentials (
DOMAINmost likely will be just.for the local computer domain):psexec -i 0 -u <DOMAIN\USER> -p <PASSWORD> powershell -Command "wsl.exe -u <DISTRO> -- bash /mnt/c/Temp/script.sh.(
psexeccomes from Sysinternals, installable viawinget).Expected Behavior
For any recent version of WSL, the outputs of the
wayland-infocommand (C:\Temp\<WSL_VERSION>\wl.txt) should be populated with details about the session, seat and available protocols while the filtereddmesgoutput (C:\Temp\<WSL_VERSION>\dmesg.txt) should not contain any crash related to WSLg.Actual Behavior
True for WSL up to 2.7.10. On 2.9.4 the
wayland-infooutput is empty anddmesg.txtshows a crash similar to the following line:(it looks like an attempt to read an offset from the null pointer -
segfault at 0x218,error 4).Diagnostic Logs
I came across this problem after seeing a Flutter app test crash in CI running on GitHub Actions with no other changes but the WSL version. This particular CI workflow runs the app tests inside WSL. On a faulty run I noticed the following trace coming from the GTK3 layer:
That means we didn't have a seat, pointing to some fundamental issue around the graphical session.
The minimal reproducer I could come up with is running
wayland-info. It shows empty on an affected instance.AFAICT The GitHub actions runner runs as a service (thus session 0) with a user (interactive) account, thus fully capable of running WSL. Hence why using
psexecto reproduce the crash: we need the user account but running in session 0. A regular interactive session doesn't experience that crash.The less scientific but still important part: installing just the four binaries below from WSL 2.7.10 on a system running WSL 2.9.4 fixes the problem, everything else (WSLg image, kernel, distro) left at 2.9.4:
msrdc.exerdclientax.dllrdpnanoTransport.dllRdpWinStlHelper.dllA/B/C result: interactive session →
wayland-infopopulated, no segfault on WSL 2.9.4;session 0 →
wayland-infoempty,rdp-backend.soSIGSEGV at ~107 s on 2.9.4;session 0 →
wayland-infopopulated, no segfault on 2.9.4 with swapped MSRDC binaries.Inspecting the diff between WSL 2.7.10 and 2.9.3, the most noticeable and untraceable from outside is the upgrade in
MSRDC.SessionHostinpackages.config( commit #2a7269e8 / PR #40882 ).weston.log from a faulty instance:
Details
Why this use case matter?
Running graphical apps inside WSL in GitHub Actions is a good way to smoke test the platform and how well we (the distributions) are integrating with it in an automated fashion.
Secondary observations from logs (not the root cause)
weston.log:XDG_RUNTIME_DIR "/mnt/wslg/runtime-dir" is not configured correctly. Unix access mode must be 0700 (current mode is 777)— the runtimedir is world-writable; also causes dbus to refuse its transient service
directory. Worth reporting but not the crash trigger.
dbus: Unknown username "pulse"— thepulseuser is absent in the systemdistro; cosmetic.
wet_module_init: connect(/mnt/wslg/weston-notify.sock) failedappears in thepost-crash restart (the notify socket from the previous instance is gone).