Accepting request 880961 from GNOME:Next

GNOME 40 - here we come

OBS-URL: https://build.opensuse.org/request/show/880961
OBS-URL: https://build.opensuse.org/package/show/GNOME:Factory/gnome-remote-desktop?expand=0&rev=5
This commit is contained in:
Dominique Leuenberger 2021-03-24 16:35:23 +00:00 committed by Git OBS Bridge
parent 99bcbcd865
commit f03222b601
9 changed files with 34 additions and 1658 deletions

View File

@ -1,71 +0,0 @@
From 81172effba7c70d3b2932c67be79a2924eae9d73 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Mon, 12 Oct 2020 17:34:30 +0200
Subject: [PATCH] vnc: Copy pixels using the right destination stride
We're copying the pixels in a separate thread managed by PipeWire, and
in this thread, accessing the VNC framebuffer dimension and stride is
racy. Instead of fetching the dimension directly, pass the expected
width and get the stride it will eventually have.
Already before this patch, when the copied pixel end up on the main
thread and the dimension still doesn't match up, the frame will be
dropped.
---
src/grd-session-vnc.c | 5 +++--
src/grd-session-vnc.h | 3 ++-
src/grd-vnc-pipewire-stream.c | 5 +++--
3 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/src/grd-session-vnc.c b/src/grd-session-vnc.c
index 69fb33d..f4835aa 100644
--- a/src/grd-session-vnc.c
+++ b/src/grd-session-vnc.c
@@ -535,9 +535,10 @@ grd_session_vnc_get_fd (GrdSessionVnc *session_vnc)
}
int
-grd_session_vnc_get_framebuffer_stride (GrdSessionVnc *session_vnc)
+grd_session_vnc_get_stride_for_width (GrdSessionVnc *session_vnc,
+ int width)
{
- return session_vnc->rfb_screen->paddedWidthInBytes;
+ return width * BGRX_BYTES_PER_PIXEL;
}
rfbClientPtr
diff --git a/src/grd-session-vnc.h b/src/grd-session-vnc.h
index 0d01ad3..ccd046c 100644
--- a/src/grd-session-vnc.h
+++ b/src/grd-session-vnc.h
@@ -60,7 +60,8 @@ void grd_session_vnc_move_cursor (GrdSessionVnc *session_vnc,
int grd_session_vnc_get_fd (GrdSessionVnc *session_vnc);
-int grd_session_vnc_get_framebuffer_stride (GrdSessionVnc *session_vnc);
+int grd_session_vnc_get_stride_for_width (GrdSessionVnc *session_vnc,
+ int width);
gboolean grd_session_vnc_is_client_gone (GrdSessionVnc *session_vnc);
diff --git a/src/grd-vnc-pipewire-stream.c b/src/grd-vnc-pipewire-stream.c
index 96dd7c9..82ceb9b 100644
--- a/src/grd-vnc-pipewire-stream.c
+++ b/src/grd-vnc-pipewire-stream.c
@@ -326,10 +326,11 @@ process_buffer (GrdVncPipeWireStream *stream,
int height;
int y;
- src_stride = buffer->datas[0].chunk->stride;
- dst_stride = grd_session_vnc_get_framebuffer_stride (stream->session);
height = stream->spa_format.size.height;
width = stream->spa_format.size.width;
+ src_stride = buffer->datas[0].chunk->stride;
+ dst_stride = grd_session_vnc_get_stride_for_width (stream->session,
+ width);
frame->data = g_malloc (height * dst_stride);
for (y = 0; y < height; y++)
--
2.28.0

View File

@ -1,80 +0,0 @@
From ab97841629f5f3f4fab9993b6255b6ae04828b9c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Wed, 9 Sep 2020 10:14:20 +0200
Subject: [PATCH] vnc: Drop frames if client is gone
Frames from PipeWire are posted asynchronously from a I/O thread to the
main thread where they are turned into VNC frame updates and cursor
movements. On the other hand, sessions are closed asynchronously when
the VNC client disappears. If a frame ended up on the main thread after
a client disappeared but before the session and stream was closed, we'd
try to turn the new frames into VNC updates without a client being
available, causing use after free.
Fix this by dropping frames that happens during this time frame.
Closes: https://gitlab.gnome.org/GNOME/gnome-remote-desktop/-/issues/43
---
src/grd-session-vnc.c | 7 +++++++
src/grd-session-vnc.h | 2 ++
src/grd-vnc-pipewire-stream.c | 8 ++++++++
3 files changed, 17 insertions(+)
diff --git a/src/grd-session-vnc.c b/src/grd-session-vnc.c
index 813838a..a06d34d 100644
--- a/src/grd-session-vnc.c
+++ b/src/grd-session-vnc.c
@@ -209,6 +209,12 @@ maybe_queue_close_session_idle (GrdSessionVnc *session_vnc)
g_idle_add (close_session_idle, session_vnc);
}
+gboolean
+grd_session_vnc_is_client_gone (GrdSessionVnc *session_vnc)
+{
+ return !session_vnc->rfb_client;
+}
+
static void
handle_client_gone (rfbClientPtr rfb_client)
{
@@ -218,6 +224,7 @@ handle_client_gone (rfbClientPtr rfb_client)
grd_session_vnc_detach_source (session_vnc);
maybe_queue_close_session_idle (session_vnc);
+ session_vnc->rfb_client = NULL;
}
static void
diff --git a/src/grd-session-vnc.h b/src/grd-session-vnc.h
index 579a12a..07678c8 100644
--- a/src/grd-session-vnc.h
+++ b/src/grd-session-vnc.h
@@ -57,4 +57,6 @@ void grd_session_vnc_move_cursor (GrdSessionVnc *session_vnc,
int grd_session_vnc_get_framebuffer_stride (GrdSessionVnc *session_vnc);
+gboolean grd_session_vnc_is_client_gone (GrdSessionVnc *session_vnc);
+
#endif /* GRD_SESSION_VNC_H */
diff --git a/src/grd-vnc-pipewire-stream.c b/src/grd-vnc-pipewire-stream.c
index 78793c4..96dd7c9 100644
--- a/src/grd-vnc-pipewire-stream.c
+++ b/src/grd-vnc-pipewire-stream.c
@@ -234,6 +234,14 @@ do_render (struct spa_loop *loop,
if (!frame)
return 0;
+ if (grd_session_vnc_is_client_gone (stream->session))
+ {
+ g_free (frame->data);
+ g_clear_pointer (&frame->rfb_cursor, rfbFreeCursor);
+ g_free (frame);
+ return 0;
+ }
+
if (frame->rfb_cursor)
grd_session_vnc_set_cursor (stream->session, frame->rfb_cursor);
--
2.26.2

View File

@ -2,7 +2,7 @@
<service name="obs_scm" mode="disabled">
<param name="url">https://gitlab.gnome.org/GNOME/gnome-remote-desktop.git</param>
<param name="scm">git</param>
<param name="revision">refs/tags/0.1.9</param>
<param name="revision">refs/tags/40.0</param>
<param name="versionformat">@PARENT_TAG@</param>
</service>
<service mode="buildtime" name="tar" />

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ea37680ad05a3d8f3dcad54d628c205cbf6cca5ec0e9bdaecaa1fe260ab4df68
size 264203

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c92e08564776cb80ffe1acce80a58864a4a05ff51bb76996cc76db2fa4150fe2
size 442379

View File

@ -1,3 +1,21 @@
-------------------------------------------------------------------
Sun Mar 21 16:31:51 UTC 2021 - Dominique Leuenberger <dimstar@opensuse.org>
- Update to version 40.0:
+ rdp: Add support for FreeRDP 2.3, support 2.3, requires at
least 2.2.
+ Manu bugfixes.
- Add pkgconfig(freerdp-client2), pkgconfig(freerdp-server2),
pkgconfig(fuse3), pkgconfig(libvncclient),
pkgconfig(libvncserver), and pkgconfig(xkbcommon) BuildRequires:
better align with what meson looks for.
- Change _service file to point to the proper upstream git repo
(gitlab.gnome.org/GNOME/gnome-remote-desktop).
- Drop gnutls-anontls.patch,
0001-vnc-Copy-pixels-using-the-right-destination-stride.patch
0001-vnc-Drop-frames-if-client-is-gone.patch: fixed upstream:
fixed upstream.
-------------------------------------------------------------------
Fri Jan 8 15:37:47 UTC 2021 - Frederic Crozat <fcrozat@suse.com>
@ -8,7 +26,7 @@ Fri Jan 8 15:37:47 UTC 2021 - Frederic Crozat <fcrozat@suse.com>
BuildRequires.
- Bump pipewire minimum version to 0.3.0.
- Update url to GNOME main project.
- Add0001-vnc-Drop-frames-if-client-is-gone.patch
- Add0001-vnc-Drop-frames-if-client-is-gone.patch
Avoid race condition on disconnect (glgo#GNOME/gnome-remote-desktop#43)
- Add gnutls-anontls.patch (Fedora), requires patched libVNCServer.
- Add 0001-vnc-Copy-pixels-using-the-right-destination-stride.patch:

View File

@ -1,5 +1,5 @@
name: gnome-remote-desktop
version: 0.1.9
mtime: 1599590329
commit: ba216dc82c7cdfcd2b99066b8be480e6a76cc60b
version: 40.0
mtime: 1616332342
commit: b64efe3e52cc334ac911f3ac967cd68afb907ae1

View File

@ -21,25 +21,22 @@
%define freerdp_version 2.2.0
Name: gnome-remote-desktop
Version: 0.1.9
Version: 40.0
Release: 0
Summary: GNOME Remote Desktop screen sharing service
License: GPL-2.0-or-later
Group: System/Management
URL: https://gitlab.gnome.org/GNOME/gnome-remote-desktop
Source0: %{name}-%{version}.tar.xz
# PATCH-FIX-UPSTREAM Avoid race condition on disconnect glgo#GNOME/gnome-remote-desktop#43
Patch0: 0001-vnc-Drop-frames-if-client-is-gone.patch
# PATCH-FEATURE-UPSTREAM Adds encryption support (requires patched LibVNCServer)
Patch1: gnutls-anontls.patch
# PATCH-FIX-UPSTREAM Copy using the right destination stride glgo#GNOME/gnome-remote-desktop!21
Patch2: 0001-vnc-Copy-pixels-using-the-right-destination-stride.patch
BuildRequires: meson >= 0.36.0
BuildRequires: pkgconfig
BuildRequires: systemd-rpm-macros
BuildRequires: pkgconfig(cairo)
BuildRequires: pkgconfig(freerdp-client2) >= %{freerdp_version}
BuildRequires: pkgconfig(freerdp-server2) >= %{freerdp_version}
BuildRequires: pkgconfig(freerdp2) >= %{freerdp_version}
BuildRequires: pkgconfig(fuse3) >= 3.9.1
BuildRequires: pkgconfig(gio-unix-2.0) >= 2.32
BuildRequires: pkgconfig(glib-2.0) >= 2.32
BuildRequires: pkgconfig(gstreamer-1.0) >= 1.10.0
@ -47,10 +44,13 @@ BuildRequires: pkgconfig(gstreamer-video-1.0) >= 1.10.0
BuildRequires: pkgconfig(libnotify)
BuildRequires: pkgconfig(libpipewire-0.3) >= 0.3.0
BuildRequires: pkgconfig(libsecret-1)
BuildRequires: pkgconfig(libvncclient)
BuildRequires: pkgconfig(libvncserver)
BuildRequires: pkgconfig(libvncserver) >= 0.9.10
BuildRequires: pkgconfig(systemd)
BuildRequires: pkgconfig(winpr2) >= %{freerdp_version}
%{?systemd_requires}
BuildRequires: pkgconfig(xkbcommon) >= 1.0.0
%{?systemd_ordering}
Requires: pipewire >= 0.3.0

File diff suppressed because it is too large Load Diff