From: chrysos349 <chrysos349@users.noreply.github.com>
To: ml@inbox.vuxu.org
Subject: Re: [PR PATCH] [Updated] gnome-connections: update to 45.0
Date: Wed, 06 Mar 2024 08:32:34 +0100 [thread overview]
Message-ID: <20240306073234.1D27C26A29@inbox.vuxu.org> (raw)
In-Reply-To: <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-49111@inbox.vuxu.org>
[-- Attachment #1: Type: text/plain, Size: 747 bytes --]
There is an updated pull request by chrysos349 against master on the void-packages repository
https://github.com/chrysos349/void-packages gnome-connections
https://github.com/void-linux/void-packages/pull/49111
gnome-connections: update to 45.0
split into a separate pr (https://github.com/void-linux/void-packages/pull/48762#issuecomment-1976502687).
#### Testing the changes
- I tested the changes in this PR: **YES**
#### Local build testing
- I built this PR locally for my native architecture, (x86_64)
- I built this PR locally for these architectures (if supported. mark crossbuilds):
- aarch64-musl x
- armv7l x
- armv6l-musl x
A patch file from https://github.com/void-linux/void-packages/pull/49111.patch is attached
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-gnome-connections-49111.patch --]
[-- Type: text/x-diff, Size: 16983 bytes --]
From de298130aa3507b7f9fb0947dcce3867d3e65388 Mon Sep 17 00:00:00 2001
From: chrysos349 <chrysostom349@gmail.com>
Date: Tue, 5 Mar 2024 10:12:44 +0300
Subject: [PATCH] gnome-connections: update to 45.0
---
...-crashes-in-frdp-channel-clipboard-c.patch | 350 ++++++++++++++++++
srcpkgs/gnome-connections/template | 8 +-
2 files changed, 354 insertions(+), 4 deletions(-)
create mode 100644 srcpkgs/gnome-connections/patches/fix-crashes-in-frdp-channel-clipboard-c.patch
diff --git a/srcpkgs/gnome-connections/patches/fix-crashes-in-frdp-channel-clipboard-c.patch b/srcpkgs/gnome-connections/patches/fix-crashes-in-frdp-channel-clipboard-c.patch
new file mode 100644
index 00000000000000..6dd29f6bca9561
--- /dev/null
+++ b/srcpkgs/gnome-connections/patches/fix-crashes-in-frdp-channel-clipboard-c.patch
@@ -0,0 +1,350 @@
+this patch fixes several crashes related to clipboard channel in gtk-frdp subproject
+(backported from 46.beta)
+
+diff --git a/subprojects/gtk-frdp/src/frdp-channel-clipboard.c b/subprojects/gtk-frdp/src/frdp-channel-clipboard.c
+index 918b4709e..f7f376388 100644
+--- a/subprojects/gtk-frdp/src/frdp-channel-clipboard.c
++++ b/subprojects/gtk-frdp/src/frdp-channel-clipboard.c
+@@ -58,6 +58,13 @@ typedef struct
+ FILEDESCRIPTORW *descriptor;
+ } FrdpLocalFileInfo;
+
++typedef struct
++{
++ guint clip_data_id;
++ gsize local_files_count;
++ FrdpLocalFileInfo *local_files_infos;
++} FrdpLocalLockData;
++
+ typedef struct _FrdpRemoteFileInfo FrdpRemoteFileInfo;
+
+ struct _FrdpRemoteFileInfo
+@@ -108,6 +115,14 @@ typedef struct
+ GMutex fuse_mutex;
+
+ fuse_ino_t current_inode;
++
++ GList *locked_data; /* List of locked arrays of files - list of (FrdpLocalLockData *) */
++ GMutex lock_mutex;
++ gboolean pending_lock; /* Lock was requested right after format list has been sent */
++ guint pending_lock_id; /* Id for the pending lock */
++ gboolean awaiting_data_request; /* Format list has been send but data were not requested yet */
++
++ guint remote_clip_data_id; /* clipDataId for copying from remote side */
+ } FrdpChannelClipboardPrivate;
+
+ G_DEFINE_TYPE_WITH_PRIVATE (FrdpChannelClipboard, frdp_channel_clipboard, FRDP_TYPE_CHANNEL)
+@@ -129,6 +144,10 @@ static void clipboard_owner_change_cb (GtkClipboard *cl
+ GdkEventOwnerChange *event,
+ gpointer user_data);
+
++static void frdp_local_lock_data_free (FrdpLocalLockData *lock_data);
++static void lock_current_local_files (FrdpChannelClipboard *self,
++ guint clip_data_id);
++
+ static void
+ frdp_channel_clipboard_get_property (GObject *object,
+ guint property_id,
+@@ -181,7 +200,15 @@ frdp_channel_clipboard_finalize (GObject *object)
+ _gtk_clipboard_clear_func (priv->gtk_clipboard, self);
+ g_clear_pointer (&priv->fuse_directory, g_free);
+
++ g_mutex_lock (&priv->lock_mutex);
++
++ g_list_free_full (priv->locked_data, (GDestroyNotify) frdp_local_lock_data_free);
++ priv->locked_data = NULL;
++
++ g_mutex_unlock (&priv->lock_mutex);
++
+ g_mutex_clear (&priv->fuse_mutex);
++ g_mutex_clear (&priv->lock_mutex);
+
+ G_OBJECT_CLASS (frdp_channel_clipboard_parent_class)->finalize (object);
+ }
+@@ -269,6 +296,8 @@ request_size (FrdpChannelClipboard *self,
+ file_contents_request.cbRequested = 8;
+ file_contents_request.nPositionHigh = 0;
+ file_contents_request.nPositionLow = 0;
++ file_contents_request.haveClipDataId = TRUE;
++ file_contents_request.clipDataId = priv->remote_clip_data_id;
+
+ size_request = g_new0 (FrdpRemoteFileRequest, 1);
+ size_request->index = index;
+@@ -435,7 +464,8 @@ fuse_read (fuse_req_t request,
+ file_contents_request.cbRequested = size;
+ file_contents_request.nPositionHigh = offset >> 32;
+ file_contents_request.nPositionLow = offset & 0xffffffff;
+- file_contents_request.haveClipDataId = FALSE;
++ file_contents_request.haveClipDataId = TRUE;
++ file_contents_request.clipDataId = priv->remote_clip_data_id;
+
+ data_request = g_new0 (FrdpRemoteFileRequest, 1);
+ data_request->index = index;
+@@ -612,6 +642,9 @@ frdp_channel_clipboard_init (FrdpChannelClipboard *self)
+ priv->clipboard_owner_changed_id = g_signal_connect (priv->gtk_clipboard, "owner-change", G_CALLBACK (clipboard_owner_change_cb), self);
+ priv->fgdw_id = CB_FORMAT_TEXTURILIST;
+ priv->current_inode = FUSE_ROOT_ID + 1;
++ priv->locked_data = NULL;
++ priv->pending_lock = FALSE;
++ priv->remote_clip_data_id = 0;
+
+ argv[0] = "gnome-connections";
+ argv[1] = "-d";
+@@ -621,6 +654,7 @@ frdp_channel_clipboard_init (FrdpChannelClipboard *self)
+ priv->remote_files_requests = g_hash_table_new (g_direct_hash, g_direct_equal);
+
+ g_mutex_init (&priv->fuse_mutex);
++ g_mutex_init (&priv->lock_mutex);
+
+ priv->fuse_directory = g_mkdtemp (g_strdup_printf ("%s/clipboard-XXXXXX/", g_get_user_runtime_dir ()));
+
+@@ -669,6 +703,7 @@ send_client_capabilities (FrdpChannelClipboard *self)
+ general_capability_set.version = CB_CAPS_VERSION_2;
+ general_capability_set.generalFlags = CB_USE_LONG_FORMAT_NAMES |
+ CB_STREAM_FILECLIP_ENABLED |
++ CB_CAN_LOCK_CLIPDATA |
+ CB_FILECLIP_NO_FILE_PATHS |
+ CB_HUGE_FILE_SUPPORT_ENABLED;
+
+@@ -727,6 +762,7 @@ send_client_format_list (FrdpChannelClipboard *self)
+ format_list.numFormats = j;
+ format_list.formats = formats;
+
++ priv->awaiting_data_request = TRUE;
+ ret = priv->cliprdr_client_context->ClientFormatList (priv->cliprdr_client_context, &format_list);
+
+ if (formats != NULL) {
+@@ -886,12 +922,19 @@ _gtk_clipboard_get_func (GtkClipboard *clipboard,
+ guint info,
+ gpointer user_data)
+ {
++ CLIPRDR_LOCK_CLIPBOARD_DATA lock_clipboard_data = { 0 };
+ FrdpChannelClipboard *self = (FrdpChannelClipboard *) user_data;
+ FrdpChannelClipboardPrivate *priv = frdp_channel_clipboard_get_instance_private (self);
+ FrdpClipboardRequest *current_request;
+ gchar *data = NULL;
+ gint length;
+
++ lock_clipboard_data.msgType = CB_LOCK_CLIPDATA;
++ lock_clipboard_data.msgFlags = 0;
++ lock_clipboard_data.dataLen = 4;
++ lock_clipboard_data.clipDataId = ++priv->remote_clip_data_id;
++ priv->cliprdr_client_context->ClientLockClipboardData (priv->cliprdr_client_context, &lock_clipboard_data);
++
+ current_request = frdp_clipboard_request_send (self, info);
+ if (current_request != NULL) {
+
+@@ -1051,9 +1094,10 @@ static void
+ _gtk_clipboard_clear_func (GtkClipboard *clipboard,
+ gpointer user_data)
+ {
+- FrdpChannelClipboard *self = (FrdpChannelClipboard *) user_data;
+- FrdpChannelClipboardPrivate *priv = frdp_channel_clipboard_get_instance_private (self);
+- guint i;
++ CLIPRDR_UNLOCK_CLIPBOARD_DATA unlock_clipboard_data = { 0 };
++ FrdpChannelClipboard *self = (FrdpChannelClipboard *) user_data;
++ FrdpChannelClipboardPrivate *priv = frdp_channel_clipboard_get_instance_private (self);
++ guint i;
+
+ g_mutex_lock (&priv->fuse_mutex);
+
+@@ -1070,6 +1114,12 @@ _gtk_clipboard_clear_func (GtkClipboard *clipboard,
+
+ g_mutex_unlock (&priv->fuse_mutex);
+
++ unlock_clipboard_data.msgType = CB_UNLOCK_CLIPDATA;
++ unlock_clipboard_data.msgFlags = 0;
++ unlock_clipboard_data.dataLen = 4;
++ unlock_clipboard_data.clipDataId = priv->remote_clip_data_id;
++ priv->cliprdr_client_context->ClientUnlockClipboardData (priv->cliprdr_client_context, &unlock_clipboard_data);
++
+ clear_local_files_infos (self);
+
+ priv->remote_data_in_clipboard = FALSE;
+@@ -1373,6 +1423,12 @@ clipboard_content_received (GtkClipboard *clipboard,
+ }
+ g_list_free_full (list, g_free);
+
++ if (priv->awaiting_data_request && priv->pending_lock) {
++ lock_current_local_files (self, priv->pending_lock_id);
++
++ priv->awaiting_data_request = FALSE;
++ }
++
+ send_data_response (self, data, priv->local_files_count * sizeof (FILEDESCRIPTORW) + 4);
+ }
+ } else {
+@@ -1481,22 +1537,50 @@ server_file_contents_request (CliprdrClientContext *context,
+ FrdpChannelClipboard *self = (FrdpChannelClipboard *) context->custom;
+ FrdpChannelClipboardPrivate *priv = frdp_channel_clipboard_get_instance_private (self);
+ CLIPRDR_FILE_CONTENTS_RESPONSE response = { 0 };
++ FrdpLocalFileInfo local_file_info;
++ FrdpLocalLockData *ldata;
+ GFileInputStream *stream;
+ GFileInfo *file_info;
+ GFileType file_type;
++ gboolean local_file_info_set = FALSE, clip_data_id_found = FALSE;
+ guint64 *size;
+ goffset offset;
+ guchar *data = NULL;
+ gssize bytes_read;
++ GList *iter;
+ GFile *file;
+
+ response.msgType = CB_FILECONTENTS_RESPONSE;
+ response.msgFlags = CB_RESPONSE_FAIL;
+ response.streamId = file_contents_request->streamId;
+
++ g_mutex_lock (&priv->lock_mutex);
++
++ if (file_contents_request->haveClipDataId) {
++ for (iter = priv->locked_data; iter != NULL; iter = iter->next) {
++ ldata = (FrdpLocalLockData *) iter->data;
++
++ if (ldata->clip_data_id == file_contents_request->clipDataId) {
++ clip_data_id_found = TRUE;
++ if (file_contents_request->listIndex < ldata->local_files_count) {
++ local_file_info = ldata->local_files_infos[file_contents_request->listIndex];
++ local_file_info_set = TRUE;
++ }
++ break;
++ }
++ }
++ }
++
++ if (!local_file_info_set && !clip_data_id_found) {
++ if (file_contents_request->listIndex < priv->local_files_count) {
++ local_file_info = priv->local_files_infos[file_contents_request->listIndex];
++ local_file_info_set = TRUE;
++ }
++ }
++
+ /* TODO: Make it async. Signal progress if FD_SHOWPROGRESSUI is present. */
+- if (file_contents_request->listIndex < priv->local_files_count) {
+- file = g_file_new_for_uri (priv->local_files_infos[file_contents_request->listIndex].uri);
++ if (local_file_info_set) {
++ file = g_file_new_for_uri (local_file_info.uri);
+
+ if (file_contents_request->dwFlags & FILECONTENTS_SIZE) {
+ file_info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_SIZE, G_FILE_QUERY_INFO_NONE, NULL, NULL);
+@@ -1540,6 +1624,8 @@ server_file_contents_request (CliprdrClientContext *context,
+ g_warning ("Requested index is outside of the file list!");
+ }
+
++ g_mutex_unlock (&priv->lock_mutex);
++
+ return priv->cliprdr_client_context->ClientFileContentsResponse (priv->cliprdr_client_context, &response);
+ }
+
+@@ -1597,11 +1683,99 @@ server_file_contents_response (CliprdrClientContext *context,
+ g_free (request);
+ g_mutex_unlock (&priv->fuse_mutex);
+ }
++ } else {
++ if (file_contents_response->msgFlags & CB_RESPONSE_FAIL) {
++ g_warning ("Server file response has failed!");
++ }
+ }
+
+ return CHANNEL_RC_OK;
+ }
+
++static void
++lock_current_local_files (FrdpChannelClipboard *self,
++ guint clip_data_id)
++{
++ FrdpChannelClipboardPrivate *priv = frdp_channel_clipboard_get_instance_private (self);
++ FrdpLocalLockData *lock_data;
++ guint i;
++
++ g_mutex_lock (&priv->lock_mutex);
++
++ /* TODO: Implement flock */
++ if (priv->local_files_count > 0) {
++ lock_data = g_new (FrdpLocalLockData, 1);
++ lock_data->clip_data_id = clip_data_id;
++ lock_data->local_files_count = priv->local_files_count;
++ lock_data->local_files_infos = g_new (FrdpLocalFileInfo, lock_data->local_files_count);
++ for (i = 0; i < lock_data->local_files_count; i++) {
++ lock_data->local_files_infos[i].descriptor = priv->local_files_infos[i].descriptor;
++ lock_data->local_files_infos[i].uri = g_strdup (priv->local_files_infos[i].uri);
++ }
++
++ priv->locked_data = g_list_append (priv->locked_data, lock_data);
++ if (priv->pending_lock_id == clip_data_id)
++ priv->pending_lock = FALSE;
++ }
++
++ g_mutex_unlock (&priv->lock_mutex);
++}
++
++static guint
++server_lock_clipboard_data (CliprdrClientContext *context,
++ const CLIPRDR_LOCK_CLIPBOARD_DATA *lock_clipboard_data)
++{
++ FrdpChannelClipboard *self = (FrdpChannelClipboard *) context->custom;
++ FrdpChannelClipboardPrivate *priv = frdp_channel_clipboard_get_instance_private (self);
++
++ if (priv->awaiting_data_request) {
++ priv->pending_lock = TRUE;
++ priv->pending_lock_id = lock_clipboard_data->clipDataId;
++ } else {
++ lock_current_local_files (self, lock_clipboard_data->clipDataId);
++ }
++
++ return CHANNEL_RC_OK;
++}
++
++static void
++frdp_local_lock_data_free (FrdpLocalLockData *lock_data)
++{
++ guint i;
++
++ for (i = 0; i < lock_data->local_files_count; i++)
++ g_free (lock_data->local_files_infos[i].uri);
++ g_free (lock_data->local_files_infos);
++ g_free (lock_data);
++}
++
++static guint
++server_unlock_clipboard_data (CliprdrClientContext *context,
++ const CLIPRDR_UNLOCK_CLIPBOARD_DATA *unlock_clipboard_data)
++{
++ FrdpChannelClipboard *self = (FrdpChannelClipboard *) context->custom;
++ FrdpChannelClipboardPrivate *priv = frdp_channel_clipboard_get_instance_private (self);
++ FrdpLocalLockData *lock_data;
++ GList *iter;
++
++ g_mutex_lock (&priv->lock_mutex);
++
++ for (iter = priv->locked_data; iter != NULL; iter = iter->next) {
++ lock_data = iter->data;
++
++ if (lock_data->clip_data_id == unlock_clipboard_data->clipDataId) {
++ frdp_local_lock_data_free (lock_data);
++
++ priv->locked_data = g_list_delete_link (priv->locked_data, iter);
++ break;
++ }
++ }
++
++ g_mutex_unlock (&priv->lock_mutex);
++
++ return CHANNEL_RC_OK;
++}
++
+ static void
+ frdp_channel_clipboard_set_client_context (FrdpChannelClipboard *self,
+ CliprdrClientContext *context)
+@@ -1620,8 +1794,7 @@ frdp_channel_clipboard_set_client_context (FrdpChannelClipboard *self,
+ context->ServerFileContentsRequest = server_file_contents_request;
+ context->ServerFileContentsResponse = server_file_contents_response;
+
+- /* TODO: Implement these:
+- pcCliprdrServerLockClipboardData ServerLockClipboardData;
+- pcCliprdrServerUnlockClipboardData ServerUnlockClipboardData;
+- */
++ /* These don't lock/unlock files currently but store lists of files with their clipDataId. */
++ context->ServerLockClipboardData = server_lock_clipboard_data;
++ context->ServerUnlockClipboardData = server_unlock_clipboard_data;
+ }
diff --git a/srcpkgs/gnome-connections/template b/srcpkgs/gnome-connections/template
index dd9245bf96b3a8..6ee939a1f1ba08 100644
--- a/srcpkgs/gnome-connections/template
+++ b/srcpkgs/gnome-connections/template
@@ -1,16 +1,16 @@
# Template file for 'gnome-connections'
pkgname=gnome-connections
-version=44.0
+version=45.0
revision=1
build_style=meson
build_helper="gir"
hostmakedepends="pkg-config gettext itstool vala desktop-file-utils glib-devel"
makedepends="gtk+3-devel libhandy1-devel gtk-vnc-devel libgcrypt-devel
- gnutls-devel libsasl-devel libsecret-devel freerdp-devel"
+ gnutls-devel libsasl-devel libsecret-devel freerdp-devel fuse3-devel"
short_desc="Remote desktop client for the GNOME desktop environment"
maintainer="oreo6391 <oreo6391@gmail.com>"
license="GPL-3.0-or-later"
homepage="https://gitlab.gnome.org/GNOME/connections/"
-changelog="https://gitlab.gnome.org/GNOME/connections/-/raw/gnome-44/NEWS"
+changelog="https://gitlab.gnome.org/GNOME/connections/-/raw/gnome-45/NEWS"
distfiles="${GNOME_SITE}/gnome-connections/${version%.*}/gnome-connections-${version}.tar.xz"
-checksum=34c7a6bbfec9a9acfa9c2d2dba4b251431cd71874f8f055c5ff26f26f4244199
+checksum=b9fab525b90a3e27d113c16fb868c2b9c47bf8149310d14db862ea1912c06fb8
next prev parent reply other threads:[~2024-03-06 7:32 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-05 7:14 [PR PATCH] " chrysos349
2024-03-06 4:47 ` oreo639
2024-03-06 4:53 ` oreo639
2024-03-06 4:58 ` oreo639
2024-03-06 4:58 ` oreo639
2024-03-06 5:50 ` chrysos349
2024-03-06 5:52 ` chrysos349
2024-03-06 6:54 ` chrysos349
2024-03-06 7:08 ` chrysos349
2024-03-06 7:24 ` chrysos349
2024-03-06 7:32 ` chrysos349 [this message]
2024-03-06 8:26 ` chrysos349
2024-03-06 9:47 ` chrysos349
2024-03-06 10:28 ` chrysos349
2024-03-06 10:29 ` chrysos349
2024-03-06 10:29 ` chrysos349
2024-03-06 10:30 ` chrysos349
2024-03-06 10:30 ` chrysos349
2024-03-06 10:30 ` chrysos349
2024-03-06 10:32 ` chrysos349
2024-03-06 12:57 ` [PR PATCH] [Updated] " chrysos349
2024-03-06 13:01 ` chrysos349
2024-04-20 13:14 ` fanyx
2024-04-21 6:54 ` [PR PATCH] [Closed]: " chrysos349
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240306073234.1D27C26A29@inbox.vuxu.org \
--to=chrysos349@users.noreply.github.com \
--cc=ml@inbox.vuxu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).