Bug 278496 - x11/xdg-desktop-portal-hyprland crashes on startup
Summary: x11/xdg-desktop-portal-hyprland crashes on startup
Status: Closed FIXED
Alias: None
Product: Ports & Packages
Classification: Unclassified
Component: Individual Port(s) (show other bugs)
Version: Latest
Hardware: amd64 Any
: --- Affects Only Me
Assignee: Jan Beich
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2024-04-21 05:21 UTC by Stephen Hurd
Modified: 2024-04-22 05:25 UTC (History)
0 users

See Also:
jbeich: maintainer-feedback+
jbeich: merge-quarterly+


Attachments
Quick hack to prevent crash (414 bytes, text/plain)
2024-04-21 05:21 UTC, Stephen Hurd
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Stephen Hurd freebsd_committer freebsd_triage 2024-04-21 05:21:35 UTC
Created attachment 250124 [details]
Quick hack to prevent crash

The crash appears to be due to unlocking a std::mutex that is not locked... as a quick hack, just locking before entering the loop that unlocks it appears to work (patch attached)

Reported upstream: https://github.com/hyprwm/xdg-desktop-portal-hyprland/issues/207
Comment 1 Stephen Hurd freebsd_committer freebsd_triage 2024-04-21 05:23:23 UTC
Oh, forgot to mention, the crash is on -CURRENT
Comment 2 Jan Beich freebsd_committer freebsd_triage 2024-04-21 06:38:27 UTC
Regressed by ports b66e01035302.

I can reproduce on old -CURRENT (libc++ 17) but not on FreeBSD 13.2 (libc++ 14 with bundled libc++ 16). Didn't test FreeBSD 13.3 (libc++ 17) or FreeBSD 14.0 (libc++ 16).
Comment 3 Stephen Hurd freebsd_committer freebsd_triage 2024-04-21 17:06:31 UTC
Yeah unlocking a std::mutex is undefined behaviour, so no surprise it behaves differently under different test conditions.
Comment 4 Jan Beich freebsd_committer freebsd_triage 2024-04-21 19:30:55 UTC
Hmm, the crash I'm seeing on old -CURRENT isn't fixed by either your or upstream patch. Can you confirm the upstream patch fixed your crash?

diff --git a/x11/xdg-desktop-portal-hyprland/Makefile b/x11/xdg-desktop-portal-hyprland/Makefile
index 64854424f856..9aa2749d2efd 100644
--- a/x11/xdg-desktop-portal-hyprland/Makefile
+++ b/x11/xdg-desktop-portal-hyprland/Makefile
@@ -7,6 +7,7 @@
 PATCH_SITES=	https://github.com/${GH_ACCOUNT}/${GH_PROJECT}/commit/
 PATCHFILES+=	65fb44ae4960.patch:-p1 # https://github.com/hyprwm/xdg-desktop-portal-hyprland/issues/190
 PATCHFILES+=	9c370fd55d6e.patch:-p1 # https://github.com/hyprwm/xdg-desktop-portal-hyprland/pull/193
+PATCHFILES+=	9ace6f969ce4.patch:-p1 # https://github.com/hyprwm/xdg-desktop-portal-hyprland/issues/207
 
 MAINTAINER=	jbeich@FreeBSD.org
 COMMENT=	xdg-desktop-portal backend for hyprland
Comment 5 Stephen Hurd freebsd_committer freebsd_triage 2024-04-22 01:40:47 UTC
Confirmed, the upstream patch fixes my crash.
Comment 6 commit-hook freebsd_committer freebsd_triage 2024-04-22 05:24:34 UTC
A commit in branch main references this bug:

URL: https://cgit.FreeBSD.org/ports/commit/?id=78fbf8e19f6fcb3abee5c67ad107c4fd3846a694

commit 78fbf8e19f6fcb3abee5c67ad107c4fd3846a694
Author:     Jan Beich <jbeich@FreeBSD.org>
AuthorDate: 2024-04-22 05:18:18 +0000
Commit:     Jan Beich <jbeich@FreeBSD.org>
CommitDate: 2024-04-22 05:22:50 +0000

    x11/xdg-desktop-portal-hyprland: backport crashfixes for -CURRENT

    * thread #1, name = 'xdg-desktop-port', stop reason = signal SIGSEGV: address not mapped to object (fault address: 0x0)
        frame #0: 0x000000000026acf0 xdg-desktop-portal-hyprland`dmabufFeedbackMainDevice(data=0x0000000000000000, feedback=0x0000182398a105c0, device_arr=0x0000182398a891d0) at PortalManager.cpp:90:5
       87   static void dmabufFeedbackMainDevice(void* data, zwp_linux_dmabuf_feedback_v1* feedback, wl_array* device_arr) {
       88       Debug::log(LOG, "[core] dmabufFeedbackMainDevice");
       89
    -> 90       RASSERT(!g_pPortalManager->m_sWaylandConnection.gbm, "double dmabuf feedback");
       91
       92       dev_t device;
       93       assert(device_arr->size == sizeof(device));
    (lldb) bt
    * thread #1, name = 'xdg-desktop-port', stop reason = signal SIGSEGV: address not mapped to object (fault address: 0x0)
      * frame #0: 0x000000000026acf0 xdg-desktop-portal-hyprland`dmabufFeedbackMainDevice(data=0x0000000000000000, feedback=0x0000182398a105c0, device_arr=0x0000182398a891d0) at PortalManager.cpp:90:5
        frame #1: 0x000000082c61067a libffi.so.8`ffi_call_unix64 at unix64.S:104
        frame #2: 0x000000082c60f8f9 libffi.so.8`ffi_call_int(cif=0x0000000820fbba80, fn=(xdg-desktop-portal-hyprland`dmabufFeedbackMainDevice(void*, zwp_linux_dmabuf_feedback_v1*, wl_array*) at PortalManager.cpp:87), rvalue=0x0000000000000000, avalue=0x0000000820fbbab0, closure=0x0000000000000000) at ffi64.c:673:3
        frame #3: 0x000000082c60f452 libffi.so.8`ffi_call(cif=0x0000000820fbba80, fn=(xdg-desktop-portal-hyprland`dmabufFeedbackMainDevice(void*, zwp_linux_dmabuf_feedback_v1*, wl_array*) at PortalManager.cpp:87), rvalue=0x0000000000000000, avalue=0x0000000820fbbab0) at ffi64.c:710:3
        frame #4: 0x00000008242fac28 libwayland-client.so.0`wl_closure_invoke(closure=0x0000182398a89100, flags=1, target=0x0000182398a105c0, opcode=2, data=0x0000000000000000) at connection.c:1025:2
        frame #5: 0x00000008242f84cf libwayland-client.so.0`dispatch_event(display=0x0000182398a1b140, queue=0x0000182398a1b230) at wayland-client.c:1631:3
        frame #6: 0x00000008242f72f4 libwayland-client.so.0`dispatch_queue(display=0x0000182398a1b140, queue=0x0000182398a1b230) at wayland-client.c:1777:3
        frame #7: 0x00000008242f70bd libwayland-client.so.0`wl_display_dispatch_queue_pending(display=0x0000182398a1b140, queue=0x0000182398a1b230) at wayland-client.c:2019:8
        frame #8: 0x00000008242f6c8e libwayland-client.so.0`wl_display_dispatch_queue(display=0x0000182398a1b140, queue=0x0000182398a1b230) at wayland-client.c:1995:9
        frame #9: 0x00000008242f6814 libwayland-client.so.0`wl_display_roundtrip_queue(display=0x0000182398a1b140, queue=0x0000182398a1b230) at wayland-client.c:1403:9
        frame #10: 0x00000008242f6ce0 libwayland-client.so.0`wl_display_roundtrip(display=0x0000182398a1b140) at wayland-client.c:1432:9
        frame #11: 0x0000000000326718 xdg-desktop-portal-hyprland`CToplevelManager::activate(this=0x0000182398a19240) at ToplevelManager.cpp:109:5
        frame #12: 0x0000000000267b72 xdg-desktop-portal-hyprland`CPortalManager::onGlobal(this=0x0000182398a1b000, data=0x0000000000000000, registry=0x0000182398a10440, name=24, interface="zwlr_foreign_toplevel_manager_v1", version=3) at PortalManager.cpp:261:34
        frame #13: 0x00000000002675e5 xdg-desktop-portal-hyprland`handleGlobal(data=0x0000000000000000, registry=0x0000182398a10440, name=24, interface="zwlr_foreign_toplevel_manager_v1", version=3) at PortalManager.cpp:20:23
        frame #14: 0x000000082c61067a libffi.so.8`ffi_call_unix64 at unix64.S:104
        frame #15: 0x000000082c60f8f9 libffi.so.8`ffi_call_int(cif=0x0000000820fbc140, fn=(xdg-desktop-portal-hyprland`handleGlobal(void*, wl_registry*, unsigned int, char const*, unsigned int) at PortalManager.cpp:19), rvalue=0x0000000000000000, avalue=0x0000000820fbc170, closure=0x0000000000000000) at ffi64.c:673:3
        frame #16: 0x000000082c60f452 libffi.so.8`ffi_call(cif=0x0000000820fbc140, fn=(xdg-desktop-portal-hyprland`handleGlobal(void*, wl_registry*, unsigned int, char const*, unsigned int) at PortalManager.cpp:19), rvalue=0x0000000000000000, avalue=0x0000000820fbc170) at ffi64.c:710:3
        frame #17: 0x00000008242fac28 libwayland-client.so.0`wl_closure_invoke(closure=0x0000182398a1b8c0, flags=1, target=0x0000182398a10440, opcode=0, data=0x0000000000000000) at connection.c:1025:2
        frame #18: 0x00000008242f84cf libwayland-client.so.0`dispatch_event(display=0x0000182398a1b140, queue=0x0000182398a1b230) at wayland-client.c:1631:3
        frame #19: 0x00000008242f72f4 libwayland-client.so.0`dispatch_queue(display=0x0000182398a1b140, queue=0x0000182398a1b230) at wayland-client.c:1777:3
        frame #20: 0x00000008242f70bd libwayland-client.so.0`wl_display_dispatch_queue_pending(display=0x0000182398a1b140, queue=0x0000182398a1b230) at wayland-client.c:2019:8
        frame #21: 0x00000008242f6c8e libwayland-client.so.0`wl_display_dispatch_queue(display=0x0000182398a1b140, queue=0x0000182398a1b230) at wayland-client.c:1995:9
        frame #22: 0x00000008242f6814 libwayland-client.so.0`wl_display_roundtrip_queue(display=0x0000182398a1b140, queue=0x0000182398a1b230) at wayland-client.c:1403:9
        frame #23: 0x00000008242f6ce0 libwayland-client.so.0`wl_display_roundtrip(display=0x0000182398a1b140) at wayland-client.c:1432:9
        frame #24: 0x00000000002689a4 xdg-desktop-portal-hyprland`CPortalManager::init(this=0x0000182398a1b000) at PortalManager.cpp:312:5
        frame #25: 0x00000000002a3f76 xdg-desktop-portal-hyprland`main(argc=1, argv=0x0000000820fbc870, envp=0x0000000820fbc880) at main.cpp:38:23
        frame #26: 0x000000082a0172aa libc.so.7`__libc_start1(argc=1, argv=0x0000000820fbc870, env=0x0000000820fbc880, cleanup=<unavailable>, mainX=(xdg-desktop-portal-hyprland`main at main.cpp:15)) at libc_start1.c:157:7
        frame #27: 0x0000000000267520 xdg-desktop-portal-hyprland`_start at crt1_s.S:83

    * thread #1, name = 'xdg-desktop-port', stop reason = signal SIGILL: privileged opcode
        frame #0: 0x0000000824c5f7cf libc++.so.1`std::__1::mutex::unlock(this=<unavailable>) at mutex.cpp:39:3
       36   void mutex::unlock() noexcept {
       37     int ec = __libcpp_mutex_unlock(&__m_);
       38     (void)ec;
    -> 39     _LIBCPP_ASSERT_VALID_EXTERNAL_API_CALL(
       40         ec == 0, "call to mutex::unlock failed. A possible reason is that the mutex wasn't locked");
       41   }
       42
    (lldb) bt
    * thread #1, name = 'xdg-desktop-port', stop reason = signal SIGILL: privileged opcode
      * frame #0: 0x0000000824c5f7cf libc++.so.1`std::__1::mutex::unlock(this=<unavailable>) at mutex.cpp:39:3
        frame #1: 0x00000000002691d3 xdg-desktop-portal-hyprland`CPortalManager::startEventLoop(this=0x000021aa1001b000) at PortalManager.cpp:424:48
        frame #2: 0x0000000000268f06 xdg-desktop-portal-hyprland`CPortalManager::init(this=0x000021aa1001b000) at PortalManager.cpp:335:5
        frame #3: 0x00000000002a3f56 xdg-desktop-portal-hyprland`main(argc=1, argv=0x0000000820d386c8, envp=0x0000000820d386d8) at main.cpp:38:23
        frame #4: 0x00000008274222aa libc.so.7`__libc_start1(argc=1, argv=0x0000000820d386c8, env=0x0000000820d386d8, cleanup=<unavailable>, mainX=(xdg-desktop-portal-hyprland`main at main.cpp:15)) at libc_start1.c:157:7
        frame #5: 0x0000000000267520 xdg-desktop-portal-hyprland`_start at crt1_s.S:83
    (lldb) f 1
    frame #1: 0x00000000002691d3 xdg-desktop-portal-hyprland`CPortalManager::startEventLoop(this=0x000021aa1001b000) at PortalManager.cpp:424:48
       421
       422      while (1) { // dbus events
       423          // wait for being awakened
    -> 424          m_sEventLoopInternals.loopRequestMutex.unlock(); // unlock, we are ready to take events
       425
       426          std::unique_lock lk(m_sEventLoopInternals.loopMutex);
       427          if (m_sEventLoopInternals.shouldProcess == false) // avoid a lock if a thread managed to request something already since we .unlock()ed

    PR:             278496
    Reported by:    shurd

 x11/xdg-desktop-portal-hyprland/Makefile | 4 +++-
 x11/xdg-desktop-portal-hyprland/distinfo | 4 ++++
 2 files changed, 7 insertions(+), 1 deletion(-)
Comment 7 commit-hook freebsd_committer freebsd_triage 2024-04-22 05:24:35 UTC
A commit in branch 2024Q2 references this bug:

URL: https://cgit.FreeBSD.org/ports/commit/?id=f2661569dd0a371d5e799562aad578b54450850e

commit f2661569dd0a371d5e799562aad578b54450850e
Author:     Jan Beich <jbeich@FreeBSD.org>
AuthorDate: 2024-04-22 05:18:18 +0000
Commit:     Jan Beich <jbeich@FreeBSD.org>
CommitDate: 2024-04-22 05:23:46 +0000

    x11/xdg-desktop-portal-hyprland: backport crashfixes for -CURRENT

    * thread #1, name = 'xdg-desktop-port', stop reason = signal SIGSEGV: address not mapped to object (fault address: 0x0)
        frame #0: 0x000000000026acf0 xdg-desktop-portal-hyprland`dmabufFeedbackMainDevice(data=0x0000000000000000, feedback=0x0000182398a105c0, device_arr=0x0000182398a891d0) at PortalManager.cpp:90:5
       87   static void dmabufFeedbackMainDevice(void* data, zwp_linux_dmabuf_feedback_v1* feedback, wl_array* device_arr) {
       88       Debug::log(LOG, "[core] dmabufFeedbackMainDevice");
       89
    -> 90       RASSERT(!g_pPortalManager->m_sWaylandConnection.gbm, "double dmabuf feedback");
       91
       92       dev_t device;
       93       assert(device_arr->size == sizeof(device));
    (lldb) bt
    * thread #1, name = 'xdg-desktop-port', stop reason = signal SIGSEGV: address not mapped to object (fault address: 0x0)
      * frame #0: 0x000000000026acf0 xdg-desktop-portal-hyprland`dmabufFeedbackMainDevice(data=0x0000000000000000, feedback=0x0000182398a105c0, device_arr=0x0000182398a891d0) at PortalManager.cpp:90:5
        frame #1: 0x000000082c61067a libffi.so.8`ffi_call_unix64 at unix64.S:104
        frame #2: 0x000000082c60f8f9 libffi.so.8`ffi_call_int(cif=0x0000000820fbba80, fn=(xdg-desktop-portal-hyprland`dmabufFeedbackMainDevice(void*, zwp_linux_dmabuf_feedback_v1*, wl_array*) at PortalManager.cpp:87), rvalue=0x0000000000000000, avalue=0x0000000820fbbab0, closure=0x0000000000000000) at ffi64.c:673:3
        frame #3: 0x000000082c60f452 libffi.so.8`ffi_call(cif=0x0000000820fbba80, fn=(xdg-desktop-portal-hyprland`dmabufFeedbackMainDevice(void*, zwp_linux_dmabuf_feedback_v1*, wl_array*) at PortalManager.cpp:87), rvalue=0x0000000000000000, avalue=0x0000000820fbbab0) at ffi64.c:710:3
        frame #4: 0x00000008242fac28 libwayland-client.so.0`wl_closure_invoke(closure=0x0000182398a89100, flags=1, target=0x0000182398a105c0, opcode=2, data=0x0000000000000000) at connection.c:1025:2
        frame #5: 0x00000008242f84cf libwayland-client.so.0`dispatch_event(display=0x0000182398a1b140, queue=0x0000182398a1b230) at wayland-client.c:1631:3
        frame #6: 0x00000008242f72f4 libwayland-client.so.0`dispatch_queue(display=0x0000182398a1b140, queue=0x0000182398a1b230) at wayland-client.c:1777:3
        frame #7: 0x00000008242f70bd libwayland-client.so.0`wl_display_dispatch_queue_pending(display=0x0000182398a1b140, queue=0x0000182398a1b230) at wayland-client.c:2019:8
        frame #8: 0x00000008242f6c8e libwayland-client.so.0`wl_display_dispatch_queue(display=0x0000182398a1b140, queue=0x0000182398a1b230) at wayland-client.c:1995:9
        frame #9: 0x00000008242f6814 libwayland-client.so.0`wl_display_roundtrip_queue(display=0x0000182398a1b140, queue=0x0000182398a1b230) at wayland-client.c:1403:9
        frame #10: 0x00000008242f6ce0 libwayland-client.so.0`wl_display_roundtrip(display=0x0000182398a1b140) at wayland-client.c:1432:9
        frame #11: 0x0000000000326718 xdg-desktop-portal-hyprland`CToplevelManager::activate(this=0x0000182398a19240) at ToplevelManager.cpp:109:5
        frame #12: 0x0000000000267b72 xdg-desktop-portal-hyprland`CPortalManager::onGlobal(this=0x0000182398a1b000, data=0x0000000000000000, registry=0x0000182398a10440, name=24, interface="zwlr_foreign_toplevel_manager_v1", version=3) at PortalManager.cpp:261:34
        frame #13: 0x00000000002675e5 xdg-desktop-portal-hyprland`handleGlobal(data=0x0000000000000000, registry=0x0000182398a10440, name=24, interface="zwlr_foreign_toplevel_manager_v1", version=3) at PortalManager.cpp:20:23
        frame #14: 0x000000082c61067a libffi.so.8`ffi_call_unix64 at unix64.S:104
        frame #15: 0x000000082c60f8f9 libffi.so.8`ffi_call_int(cif=0x0000000820fbc140, fn=(xdg-desktop-portal-hyprland`handleGlobal(void*, wl_registry*, unsigned int, char const*, unsigned int) at PortalManager.cpp:19), rvalue=0x0000000000000000, avalue=0x0000000820fbc170, closure=0x0000000000000000) at ffi64.c:673:3
        frame #16: 0x000000082c60f452 libffi.so.8`ffi_call(cif=0x0000000820fbc140, fn=(xdg-desktop-portal-hyprland`handleGlobal(void*, wl_registry*, unsigned int, char const*, unsigned int) at PortalManager.cpp:19), rvalue=0x0000000000000000, avalue=0x0000000820fbc170) at ffi64.c:710:3
        frame #17: 0x00000008242fac28 libwayland-client.so.0`wl_closure_invoke(closure=0x0000182398a1b8c0, flags=1, target=0x0000182398a10440, opcode=0, data=0x0000000000000000) at connection.c:1025:2
        frame #18: 0x00000008242f84cf libwayland-client.so.0`dispatch_event(display=0x0000182398a1b140, queue=0x0000182398a1b230) at wayland-client.c:1631:3
        frame #19: 0x00000008242f72f4 libwayland-client.so.0`dispatch_queue(display=0x0000182398a1b140, queue=0x0000182398a1b230) at wayland-client.c:1777:3
        frame #20: 0x00000008242f70bd libwayland-client.so.0`wl_display_dispatch_queue_pending(display=0x0000182398a1b140, queue=0x0000182398a1b230) at wayland-client.c:2019:8
        frame #21: 0x00000008242f6c8e libwayland-client.so.0`wl_display_dispatch_queue(display=0x0000182398a1b140, queue=0x0000182398a1b230) at wayland-client.c:1995:9
        frame #22: 0x00000008242f6814 libwayland-client.so.0`wl_display_roundtrip_queue(display=0x0000182398a1b140, queue=0x0000182398a1b230) at wayland-client.c:1403:9
        frame #23: 0x00000008242f6ce0 libwayland-client.so.0`wl_display_roundtrip(display=0x0000182398a1b140) at wayland-client.c:1432:9
        frame #24: 0x00000000002689a4 xdg-desktop-portal-hyprland`CPortalManager::init(this=0x0000182398a1b000) at PortalManager.cpp:312:5
        frame #25: 0x00000000002a3f76 xdg-desktop-portal-hyprland`main(argc=1, argv=0x0000000820fbc870, envp=0x0000000820fbc880) at main.cpp:38:23
        frame #26: 0x000000082a0172aa libc.so.7`__libc_start1(argc=1, argv=0x0000000820fbc870, env=0x0000000820fbc880, cleanup=<unavailable>, mainX=(xdg-desktop-portal-hyprland`main at main.cpp:15)) at libc_start1.c:157:7
        frame #27: 0x0000000000267520 xdg-desktop-portal-hyprland`_start at crt1_s.S:83

    * thread #1, name = 'xdg-desktop-port', stop reason = signal SIGILL: privileged opcode
        frame #0: 0x0000000824c5f7cf libc++.so.1`std::__1::mutex::unlock(this=<unavailable>) at mutex.cpp:39:3
       36   void mutex::unlock() noexcept {
       37     int ec = __libcpp_mutex_unlock(&__m_);
       38     (void)ec;
    -> 39     _LIBCPP_ASSERT_VALID_EXTERNAL_API_CALL(
       40         ec == 0, "call to mutex::unlock failed. A possible reason is that the mutex wasn't locked");
       41   }
       42
    (lldb) bt
    * thread #1, name = 'xdg-desktop-port', stop reason = signal SIGILL: privileged opcode
      * frame #0: 0x0000000824c5f7cf libc++.so.1`std::__1::mutex::unlock(this=<unavailable>) at mutex.cpp:39:3
        frame #1: 0x00000000002691d3 xdg-desktop-portal-hyprland`CPortalManager::startEventLoop(this=0x000021aa1001b000) at PortalManager.cpp:424:48
        frame #2: 0x0000000000268f06 xdg-desktop-portal-hyprland`CPortalManager::init(this=0x000021aa1001b000) at PortalManager.cpp:335:5
        frame #3: 0x00000000002a3f56 xdg-desktop-portal-hyprland`main(argc=1, argv=0x0000000820d386c8, envp=0x0000000820d386d8) at main.cpp:38:23
        frame #4: 0x00000008274222aa libc.so.7`__libc_start1(argc=1, argv=0x0000000820d386c8, env=0x0000000820d386d8, cleanup=<unavailable>, mainX=(xdg-desktop-portal-hyprland`main at main.cpp:15)) at libc_start1.c:157:7
        frame #5: 0x0000000000267520 xdg-desktop-portal-hyprland`_start at crt1_s.S:83
    (lldb) f 1
    frame #1: 0x00000000002691d3 xdg-desktop-portal-hyprland`CPortalManager::startEventLoop(this=0x000021aa1001b000) at PortalManager.cpp:424:48
       421
       422      while (1) { // dbus events
       423          // wait for being awakened
    -> 424          m_sEventLoopInternals.loopRequestMutex.unlock(); // unlock, we are ready to take events
       425
       426          std::unique_lock lk(m_sEventLoopInternals.loopMutex);
       427          if (m_sEventLoopInternals.shouldProcess == false) // avoid a lock if a thread managed to request something already since we .unlock()ed

    PR:             278496
    Reported by:    shurd

    (cherry picked from commit 78fbf8e19f6fcb3abee5c67ad107c4fd3846a694)

 x11/xdg-desktop-portal-hyprland/Makefile | 4 +++-
 x11/xdg-desktop-portal-hyprland/distinfo | 4 ++++
 2 files changed, 7 insertions(+), 1 deletion(-)