Skip to content

ext_background_effect_surface_v1 destroy sequence causes fatal Wayland protocol error (Dolphin crash) #1972

@Aaxper

Description

@Aaxper

Some apps (notably the Dolphin file manager) crash when performing certain actions, particularly closing dialogue menus. This error was found on the Niri WIP branch, but I was directed by YaLTeR (the creator of Niri) to repost it here.

Error output:

[destroyed object]: error 0: wl_surface was destroyed
The Wayland connection experienced a fatal error: Protocol error

WAYLAND_DEBUG=1 trace:

Relevant section:

-> ext_background_effect_surface_v1#55.destroy()
-> wl_compositor#4.create_surface(new id wl_surface#54)
...
wl_display#1.delete_id(36)                                               <- surface deleted by server
wl_display#1.error(nil, 0, "wl_surface was destroyed")                   <- nil reference
Last 50 lines
[1108851.450] {Default Queue} wl_pointer#22.motion(352486620, 202.50000000, 526.50000000)
[1108851.488] {Default Queue} wl_pointer#22.frame()
[1108858.603] {Default Queue} wl_pointer#22.motion(352486627, 199.50000000, 528.00000000)
[1108858.665] {Default Queue} wl_pointer#22.frame()
[1108866.582] {Default Queue} wl_pointer#22.motion(352486635, 198.00000000, 529.50000000)
[1108866.639] {Default Queue} wl_pointer#22.frame()
[1108873.714] {Default Queue} wl_pointer#22.motion(352486642, 195.00000000, 531.00000000)
[1108873.776] {Default Queue} wl_pointer#22.frame()
[1108882.543] {Default Queue} wl_pointer#22.motion(352486650, 193.50000000, 532.50000000)
[1108882.601] {Default Queue} wl_pointer#22.frame()
[1108888.391] {Default Queue} wl_pointer#22.motion(352486657, 192.00000000, 532.50000000)
[1108888.450] {Default Queue} wl_pointer#22.frame()
[1108896.601] {Default Queue} wl_pointer#22.motion(352486665, 190.50000000, 532.50000000)
[1108896.659] {Default Queue} wl_pointer#22.frame()
[1108903.481] {Default Queue} wl_pointer#22.motion(352486672, 190.50000000, 534.00000000)
[1108903.535] {Default Queue} wl_pointer#22.frame()
[1108911.704] {Default Queue} wl_pointer#22.motion(352486680, 189.00000000, 534.00000000)
[1108911.764] {Default Queue} wl_pointer#22.frame()
[1108957.395] {Default Queue} wl_pointer#22.motion(352486725, 187.50000000, 535.50000000)
[1108957.453] {Default Queue} wl_pointer#22.frame()
[1108962.947] {Default Queue} wl_pointer#22.motion(352486732, 186.00000000, 537.00000000)
[1108962.972] {Default Queue} wl_pointer#22.frame()
[1108977.894] {Default Queue} wl_pointer#22.motion(352486747, 184.50000000, 538.50000000)
[1108977.920] {Default Queue} wl_pointer#22.frame()
[1108992.993] {Default Queue} wl_pointer#22.motion(352486762, 184.50000000, 540.00000000)
[1108993.022] {Default Queue} wl_pointer#22.frame()
[1109000.907] {Default Queue} wl_pointer#22.motion(352486770, 183.00000000, 540.00000000)
[1109000.933] {Default Queue} wl_pointer#22.frame()
[1109022.993] {Default Queue} wl_pointer#22.motion(352486792, 183.00000000, 541.50000000)
[1109023.037] {Default Queue} wl_pointer#22.frame()
[1109189.314] {Default Queue} wl_pointer#22.button(7422838, 352486957, 272, 1)
[1109189.375] {Default Queue} wl_pointer#22.frame()
[1109189.620] {Default Queue}  -> xdg_popup#47.destroy()
[1109189.641] {Default Queue}  -> xdg_surface#39.destroy()
[1109189.654] {Default Queue}  -> wl_surface#36.attach(nil, 0, 0)
[1109189.665] {Default Queue}  -> wl_surface#36.commit()
[1109189.760] {Default Queue}  -> wl_surface#36.destroy()
[1109189.779] {Default Queue}  -> wp_viewport#37.destroy()
[1109189.787] {Default Queue}  -> wp_fractional_scale_v1#38.destroy()
[1109189.800] {Default Queue}  -> ext_background_effect_surface_v1#55.destroy()
[1109190.151] wl_buffer#45.release()
[1109190.166] wl_buffer#43.release()
[1109190.347] {Display Queue} wl_display#1.delete_id(47)
[1109190.364] {Display Queue} wl_display#1.delete_id(39)
[1109190.376] {Display Queue} wl_display#1.delete_id(36)
[1109190.383] {Display Queue} wl_display#1.delete_id(37)
[1109190.392] {Display Queue} wl_display#1.delete_id(38)
[1109190.398] {Display Queue} wl_display#1.error(nil, 0, "wl_surface was destroyed")
[destroyed object]: error 0: wl_surface was destroyed
The Wayland connection experienced a fatal error: Protocol error

Dolphin destroys a popup and its associated ext_background_effect_surface_v1 object, then creates a new surface for a dialog. Niri then sends a wl_display.error referencing a nil object, which kills the connection. The nil in the error suggests Niri holds a dangling reference to the destroyed surface.

System Information

  • niri version: niri 25.11 (v25.11-129-g734d86ec)
  • Distro: Arch Linux
  • GPU: AMD Radeon 780M
  • CPU: AMD Ryzen 7 8845HS

DISCLAIMER: This report was partially written with the assistance of AI because I don't fully understand the bug. However, it was a real issue I encountered independently, and all information appears correct to me.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions