Skip to content

v0.19.16

Choose a tag to compare

@github-actions github-actions released this 08 Aug 13:34
· 5 commits to main since this release

What's Changed

Fixed

  • Embedded RDP no longer reads the local clipboard just to announce it, which is what crashed the process on X11 (issue #261) — the reporter's three coredumps settle what 0.19.15 could only narrow down. All three are the same fault to the byte, and it is a NULL dereference in GTK rather than anything racy: strcmp(NULL, "STRING"), reached on a GIO worker thread through _gdk_x11_display_text_property_to_utf8_listgdk_x11_text_list_converter_convert ← a GConverterInputStream read ← read_async_threadg_task_thread_pool_thread.

    The GTK path is exact. get_selection_property() reports type None when a property fetch fails; gdkselectioninputstream-x11.c turns that into priv->type before it checks whether any bytes arrived, and returns the stream as successful anyway; gdk_x11_get_xatom_name_for_display() answers NULL for the None atom; and gdkclipboard-x11.c then hands that server-derived type straight to the text-list converter with no NULL guard, where g_intern_string(NULL) keeps it NULL until the converter dereferences it. Reaching it needs the X11 backend, a clipboard read, and a fallback to COMPOUND_TEXT/TEXT/STRING — GDK tries UTF8_STRING first and only falls back when that transfer fails, which is why it took time to show up rather than firing on the first copy.

    What made it ours is that RustConn was reading on a hair trigger. The embedded client watched the display-global clipboard and read the selection on every change anywhere on the desktop, purely to forward the text to the server — so every copy in any application was another roll of the dice, and 0.19.15's handler leak meant one roll per RDP session ever opened. MS-RDPECLIP never needed that: a client announces which formats it has and supplies the bytes only when the peer answers with a Format Data Request. rustconn-core already implemented that flow and documented it. The change handler now sends the announcement alone, and the read happens in the request handler that was already there — once per paste inside the session instead of once per copy on the desktop. The two places that still read on purpose, the Paste button and script paste, are single user-initiated actions and are unchanged.

    Announcing without data needed one guard: on_format_data_request answers from its parked payload before it asks the GUI, so text left over from an earlier explicit copy would have been served in place of the new clipboard contents exactly once. The new AnnounceClipboardFormats command drops the payload for precisely the formats it announces, which is narrower than the existing bulk clear on purpose — a pending file descriptor from a drag has nothing to do with a text announcement, and a test pins that distinction.

    This removes RustConn from the crashing path; it does not repair GTK. A paste inside the session still goes through read_text_async, so the upstream bug remains reachable, just no longer driven by ambient desktop activity. The GTK side has been reported and fixed upstream in GTK merge request !10227, against GTK issue #6850.

  • Turning off Clipboard on an RDP connection now stops every clipboard read, not just the automatic ones (issue #261) — 0.19.15 made the setting gate the clipboard watcher, the server→local auto-sync and the reply to a server request. It did not gate the toolbar Copy and Paste buttons or Type Clipboard, all of which read the local selection on demand. That left the setting as a partial measure at exactly the moment users were reaching for it as a workaround: a reporter turned clipboard sharing off on every RDP profile and still saw the crash, which is consistent with those three paths staying live.

    All of them now check the same setting, so switching Clipboard off is a complete escape hatch until the GTK fix reaches distributions. Pressing the buttons with sharing off reports "Clipboard sharing is off" in the session status area rather than failing silently — the alternative, hiding the buttons, would have hidden them for connections whose configuration has not loaded yet.

    Two routes deliberately remain, because neither is gated by a clipboard setting and neither can be closed without removing working features: the string drop targets on the sidebar and split-view panels reach the same GTK converter through gdkdrop-x11.c, and a paste performed inside the remote session still asks the client for data. Both are user-initiated rather than ambient. The file drop target on the session view was checked and is not affected: it accepts GdkFileList, which negotiates text/uri-list and never enters the text-list converter.

Dependencies

  • Updated: thiserror 2.0.19→2.0.20, aws-lc-rs 1.17.3→1.18.0, wasm-bindgen 0.2.126→0.2.127, js-sys/web-sys 0.3.103→0.3.104, wide 1.5.0→1.6.1, yuv 0.8.16→0.8.17

Installation

Flatpak (Recommended)

flatpak install flathub io.github.totoshko88.RustConn

Snap

sudo snap install rustconn

Debian/Ubuntu (.deb from this release)

sudo dpkg -i rustconn_0.19.16_amd64.deb
sudo apt-get install -f  # Install dependencies if needed

Fedora (.rpm from this release)

sudo dnf install rustconn-0.19.16-1.fc44.x86_64.rpm

AppImage

chmod +x RustConn-0.19.16-x86_64.AppImage
./RustConn-0.19.16-x86_64.AppImage

macOS (Homebrew)

brew tap totoshko88/rustconn
brew install rustconn
open $(brew --prefix)/opt/rustconn/RustConn.app

All dependencies (GTK4, libadwaita, VTE, Adwaita icons) are installed automatically.
Requires macOS 13 (Ventura) or later.

OBS Repositories

Packages available at: https://build.opensuse.org/package/show/home:totoshko88:rustconn/rustconn

# Debian 13 (Trixie)
echo 'deb http://download.opensuse.org/repositories/home:/totoshko88:/rustconn/Debian_13/ /' \
  | sudo tee /etc/apt/sources.list.d/rustconn.list
curl -fsSL https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/Debian_13/Release.key \
  | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/rustconn.gpg > /dev/null
sudo apt update && sudo apt install rustconn

# Ubuntu 24.04 LTS (Noble)
echo 'deb http://download.opensuse.org/repositories/home:/totoshko88:/rustconn/xUbuntu_24.04/ /' \
  | sudo tee /etc/apt/sources.list.d/rustconn.list
curl -fsSL https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/xUbuntu_24.04/Release.key \
  | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/rustconn.gpg > /dev/null
sudo apt update && sudo apt install rustconn

# Ubuntu 26.04 LTS (Resolute)
echo 'deb http://download.opensuse.org/repositories/home:/totoshko88:/rustconn/xUbuntu_26.04/ /' \
  | sudo tee /etc/apt/sources.list.d/rustconn.list
curl -fsSL https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/xUbuntu_26.04/Release.key \
  | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/rustconn.gpg > /dev/null
sudo apt update && sudo apt install rustconn

# Fedora 44
sudo dnf config-manager addrepo --from-repofile=https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/Fedora_44/home:totoshko88:rustconn.repo
sudo dnf install rustconn

# Fedora 43
sudo dnf config-manager addrepo --from-repofile=https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/Fedora_43/home:totoshko88:rustconn.repo
sudo dnf install rustconn

# openSUSE Tumbleweed
sudo zypper ar https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/openSUSE_Tumbleweed/ rustconn
sudo zypper ref && sudo zypper in rustconn

# openSUSE Leap 16.0
sudo zypper ar https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/openSUSE_Leap_16.0/ rustconn
sudo zypper ref && sudo zypper in rustconn

Arch Linux (AUR)

yay -S rustconn

FreeBSD (Ports)

pkg install rustconn

Full installation guide: https://github.com/totoshko88/RustConn/blob/main/docs/INSTALL.md