Skip to content
Snippets Groups Projects
  1. Feb 03, 2022
  2. Feb 02, 2022
    • Alexander Orzechowski's avatar
      xdg-foreign: Fix crash on destroy of degenerate surface · c4824b68
      Alexander Orzechowski authored and Simon Ser's avatar Simon Ser committed
      I am running a custom compiled version of chromium with a patch to get
      it up and running on sway git at the moment, and in that development
      build I compiled there is a bug where the browser will crash if you
      try to open a file select dialog. When this crash happens, chromium will
      not close, but instead will remain open and impossible to close unless
      you send a SIGKILL signal to the process. However, sway will crash to
      tty when you send the SIGKILL.
      
      I have a hunch that when chromium is opening the file select dialog
      it is creating some sort of a xdg toplevel surface. But it freezes
      before it fully initializes the surface. When the SIGKILL signal is
      given, sway/wlroots will try to free the xdg_toplevel surface but
      because it hasn't fully initialized due to the frozen window, it
      segfaults.
      
      Don't be fooled by the assert, the assert is not firing, the surface
      pointer is indeed NULL here.
      
      * thread #1, name = 'sway', stop reason = signal SIGSEGV: invalid address (fault address: 0x28)
          frame #0: 0x00007ffff78b9041 libwlroots.so.11`wlr_xdg_toplevel_set_parent(surface=0x0000000000000000, parent=0x0000000000000000) at wlr_xdg_toplevel.c:159:37
         156
         157 	void wlr_xdg_toplevel_set_parent(struct wlr_xdg_surface *surface,
         158 			struct wlr_xdg_surface *parent) {
      -> 159 		assert(surface->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL);
         160 		assert(!parent || parent->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL);
         161
         162 		if (surface->toplevel->parent) {
      (lldb) up
      error: sway {0x0003442a}: DIE has DW_AT_ranges(DW_FORM_sec_offset 0x67) attribute, but range extraction failed (invalid range list offset 0x67), please file a bug and attach the file at the start of this error message
      error: sway {0x0003442a}: DIE has DW_AT_ranges(DW_FORM_sec_offset 0x67) attribute, but range extraction failed (invalid range list offset 0x67), please file a bug and attach the file at the start of this error message
      frame #1: 0x00007ffff78e176e libwlroots.so.11`destroy_imported(imported=0x000055555626d570) at wlr_xdg_foreign_v1.c:154:3
         151 		wl_list_for_each_safe(child, child_tmp, &imported->children, link) {
         152 			struct wlr_xdg_surface *xdg_child =
         153 				wlr_xdg_surface_from_wlr_surface(child->surface);
      -> 154 			wlr_xdg_toplevel_set_parent(xdg_child, NULL);
         155 		}
         156
         157 		wl_list_remove(&imported->exported_destroyed.link);
      (lldb) up
      frame #2: 0x00007ffff78e1b9d libwlroots.so.11`xdg_imported_handle_resource_destroy(resource=0x00005555562555a0) at wlr_xdg_foreign_v1.c:280:2
         277 			struct wl_resource *resource) {
         278 		struct wlr_xdg_imported_v1 *imported = xdg_imported_from_resource(resource);
         279 		if (!imported) {
      -> 280 			return;
         281 		}
         282
         283 		destroy_imported(imported);
      (lldb) up
      frame #3: 0x00007ffff794989a libwayland-server.so.0`___lldb_unnamed_symbol211 + 154
      libwayland-server.so.0`___lldb_unnamed_symbol211:
      ->  0x7ffff794989a <+154>: andl   $0x1, %r13d
          0x7ffff794989e <+158>: je     0x7ffff79498b0            ; <+176>
          0x7ffff79498a0 <+160>: addq   $0x8, %rsp
          0x7ffff79498a4 <+164>: movl   $0x1, %eax
      (lldb) up
      frame #4: 0x00007ffff794fec0 libwayland-server.so.0`___lldb_unnamed_symbol290 + 64
      libwayland-server.so.0`___lldb_unnamed_symbol290:
      ->  0x7ffff794fec0 <+64>: cmpl   $0x1, %eax
          0x7ffff794fec3 <+67>: jne    0x7ffff794fed3            ; <+83>
          0x7ffff794fec5 <+69>: addq   $0x8, %rbx
          0x7ffff794fec9 <+73>: cmpq   %rbx, %r13
      (lldb) up
      frame #5: 0x00007ffff79503e0 libwayland-server.so.0`___lldb_unnamed_symbol300 + 32
      libwayland-server.so.0`___lldb_unnamed_symbol300:
      ->  0x7ffff79503e0 <+32>: cmpl   $0x1, %eax
          0x7ffff79503e3 <+35>: je     0x7ffff79503f0            ; <+48>
          0x7ffff79503e5 <+37>: popq   %rbx
          0x7ffff79503e6 <+38>: popq   %r12
      (lldb) up
      frame #6: 0x00007ffff794a30e libwayland-server.so.0`wl_client_destroy + 126
      libwayland-server.so.0`wl_client_destroy:
      ->  0x7ffff794a30e <+126>: movq   %r12, %rdi
          0x7ffff794a311 <+129>: callq  0x7ffff7950150            ; ___lldb_unnamed_symbol293
          0x7ffff794a317 <+135>: movq   0x8(%rbp), %rdi
          0x7ffff794a31b <+139>: callq  *0xdc77(%rip)
      (lldb) up
      frame #7: 0x00007ffff794a3f7 libwayland-server.so.0`___lldb_unnamed_symbol214 + 119
      libwayland-server.so.0`___lldb_unnamed_symbol214:
      ->  0x7ffff794a3f7 <+119>: movq   0x28(%rsp), %rax
          0x7ffff794a3fc <+124>: subq   %fs:0x28, %rax
          0x7ffff794a405 <+133>: jne    0x7ffff794a727            ; <+935>
          0x7ffff794a40b <+139>: addq   $0x38, %rsp
      (lldb) up
      frame #8: 0x00007ffff794d1ca libwayland-server.so.0`wl_event_loop_dispatch + 202
      libwayland-server.so.0`wl_event_loop_dispatch:
      ->  0x7ffff794d1ca <+202>: addq   $0xc, %r15
          0x7ffff794d1ce <+206>: cmpq   %r15, %rbp
          0x7ffff794d1d1 <+209>: jne    0x7ffff794d1b8            ; <+184>
          0x7ffff794d1d3 <+211>: movq   0x8(%rsp), %rcx
      (lldb) up
      frame #9: 0x00007ffff794ad37 libwayland-server.so.0`wl_display_run + 39
      libwayland-server.so.0`wl_display_run:
      ->  0x7ffff794ad37 <+39>: movl   0x8(%rbx), %eax
          0x7ffff794ad3a <+42>: testl  %eax, %eax
          0x7ffff794ad3c <+44>: jne    0x7ffff794ad20            ; <+16>
          0x7ffff794ad3e <+46>: popq   %rbx
      (lldb) up
      frame #10: 0x000055555557689a sway`server_run(server=0x00005555555f26c0) at server.c:307:2
         304 			wlr_backend_destroy(server->backend);
         305 			return false;
         306 		}
      -> 307
         308 		return true;
         309 	}
         310
      (lldb) up
      frame #11: 0x0000555555575a93 sway`main(argc=3, argv=0x00007fffffffe978) at main.c:431:2
         428 			swaynag_show(&config->swaynag_config_errors);
         429 		}
         430
      -> 431 		server_run(&server);
         432
         433 	shutdown:
         434 		sway_log(SWAY_INFO, "Shutting down sway");
      
      (cherry picked from commit cddc1c1bd9f796709c50f4bbb300788edd42fd4f)
      c4824b68
    • Simon Ser's avatar
      scene: try to import buffers as textures before rendering · ec3780e6
      Simon Ser authored
      The wlroots APIs currently don't allow importing/uploading a buffer
      during rendering operations. Scene-graph buffer nodes need to turn
      their wlr_buffer into a wlr_texture at some point. It's not always
      possible to do so at wlr_scene_buffer creation time because the
      scene-graph may have zero outputs at this point, thus no way to
      grab a wlr_renderer.
      
      Instead, add scene-graph buffers to a pending list and try to import
      them in wlr_scene_output_commit.
      
      References: wlroots/wlroots#3354
      (cherry picked from commit 3db1bcbe641b407b9f5c9e5d0a012b45aa2c6cb7)
      ec3780e6
    • Kirill Primak's avatar
      subsurface: unlock cached state on commit if desynced · 68c5fa34
      Kirill Primak authored and Simon Ser's avatar Simon Ser committed
      wl_subsurface::set_desync description states: "If cached state exists when
      wl_surface.commit is called in desynchronized mode, the pending state is
      added to the cached state, and applied as a whole."
      
      This commit reintroduces an implementation of said behavior, previously
      removed in 7daf6da9.
      
      Strictly speaking, this logic isn't fully correct, as the cached state
      and the pending state are applied individually instead, if the cached
      state isn't locked by anything else. However, the end result is still
      the same.
      
      This commit fixes the issue with Firefox permission popups.
      
      (cherry picked from commit 77951968)
      68c5fa34
    • Kirill Primak's avatar
      compositor: damage the whole buffer on viewport src change · 304c6130
      Kirill Primak authored and Simon Ser's avatar Simon Ser committed
      wp_viewporter protocol doesn't seem to say anything about damage, but
      Firefox assumes that wp_viewport::set_source alone is enough to damage
      the whole surface, and that assumption kinda makes sense, so let's do
      that.
      
      (cherry picked from commit da2491d4)
      304c6130
    • Tadeo Kondrak's avatar
      input_method_v2: improve mapping detection · b0fee569
      Tadeo Kondrak authored and Simon Ser's avatar Simon Ser committed
      Detect NULL commits before the surface is actually committed, allowing
      the surface to be properly damaged on unmap.
      
      (cherry picked from commit 5091118bed82394de5a151d658e895bb44059b61)
      b0fee569
    • Kirill Primak's avatar
      scene/subsurface_tree: fix handling subsurface destruction · 7dde2b66
      Kirill Primak authored and Simon Ser's avatar Simon Ser committed
      This commit renames map/unmap listeners to clarify that they handle
      subsurface events, and ensures the node is always destroyed before
      the subsurface.
      
      Without this patch, wl_list_remove() would operate on listener links in
      already freed memory. glibc is usually lenient to bugs like this, but
      musl isn't.
      
      (cherry picked from commit 83ab5055)
      7dde2b66
    • Tom Hebb's avatar
      render/gles2: don't constrain shm formats to ones that support reading · ea77cc5c
      Tom Hebb authored and Simon Ser's avatar Simon Ser committed
      commit 44e8451c ("render/gles2: hide shm formats without GL
      support") added the is_gles2_pixel_format_supported() function to
      render/gles2/pixel_format.c, whose stated purpose is to "check whether
      the renderer has the needed GL extensions to read a given pixel format."
      It then used that function to filter the pixel formats returned by
      get_gles2_shm_formats().
      
      The result of this change is that RGB formats are no longer reported for
      GL drivers that don't implement EXT_read_format_bgra, even when those
      formats are supported for rendering (which they have to be for
      wlr_gles2_renderer_create() to succeed). This is a pretty clear
      regression, since wlr_renderer_init_wl_shm() fails when either of
      WL_SHM_FORMAT_ARGB8888 or WL_SHM_FORMAT_XRGB8888 are missing.
      
      To fix the regression, change is_gles2_pixel_format_supported() to
      accept all pixel formats that support rendering, regardless of whether
      we can read them or not, and move the check for EXT_read_format_bgra
      back into gles2_read_pixels(). (There's already a check for this
      extension in gles2_preferred_read_format(), so we're not breaking any
      abstraction that wasn't already broken.)
      
      Tested on the NVIDIA 495.46 proprietary driver, which doesn't support
      EXT_read_format_bgra.
      
      Fixes: 44e8451c ("render/gles2: hide shm formats without GL support")
      (cherry picked from commit 59b9518f)
      ea77cc5c
    • Jan Kelling's avatar
      vulkan: Fix imported image layout · a59a957f
      Jan Kelling authored and Simon Ser's avatar Simon Ser committed
      (cherry picked from commit 9988eb33)
      a59a957f
    • Simon Ser's avatar
      scene: schedule an output frame on wl_surface.frame · df945b66
      Simon Ser authored
      Some clients (e.g. mpv, Firefox) request a new wl_surface.frame
      callback without damaging their surface. When this happens,
      schedule a new output frame.
      
      Closes: wlroots/wlroots#3350
      (cherry picked from commit 812951f5)
      df945b66
    • Isaac Freund's avatar
      wlr_texture: remove wlr_texture_from_wl_drm() from header · 4b358c2f
      Isaac Freund authored and Simon Ser's avatar Simon Ser committed
      This function was already removed in e5b5592a but it was forgotten to
      remove it from the header.
      
      (cherry picked from commit 823476e7)
      4b358c2f
    • Simon Ser's avatar
      backend: error out in autocreate without libinput support · 7864f26d
      Simon Ser authored
      The libinput backend is now optional. However, this means that a
      user building wlroots without the correct libinput dependencies
      will end up with a compositor which doesn't respond to input events.
      
      wlr_backend_autocreate is supposed to return a sensible setup, so in
      this case let's just error out and explain what happened. Users can
      suppress the check by setting WLR_LIBINPUT_NO_DEVICES=1 (already used
      to suppress the zero input device case inside the libinput backend).
      
      Compositors which really want to create a bare DRM backend can easily
      create it manually instead of using wlr_backend_autocreate.
      
      (cherry picked from commit ec2845750862cc0b175bef59de4305f6da91960a)
      7864f26d
  3. Dec 15, 2021
  4. Dec 14, 2021
  5. Dec 13, 2021
  6. Dec 09, 2021
  7. Dec 07, 2021
Loading