xrdp 0.10.6 dynamic-resize and persistent-session interoperability patches for Banana Pi BPI-F3 (riscv64) on openSUSE Tumbleweed.
Keywords: #opensuse #suse #tumbleweed #riscv64 #risc-v #bpif3 #bananapi #spacemitk1 #xrdp #rdp #rdpedisp #displaycontrol #sesman
This repository fixes RDP window resizing for clients which complete the DRDYNVC handshake but do not send DisplayControl monitor-layout updates to an xrdp/Xorg session. It also backports upstream session discovery so saved sessions survive an xrdp-sesman restart.
It provides the reviewed patch set and a pinned source build script. This is a source-only repository: no prebuilt binaries, packages, tags, or GitHub Releases are distributed.
The resize failure had three parts: fragmented DRDYNVC messages were not reassembled correctly, DisplayControl was opened before the Xorg backend resize queue existed, and the local sesman path did not send the logged-on notification expected by some modern clients.
xrdp 0.10.6 also keeps its session registry only in xrdp-sesman memory. Restarting the manager can orphan an existing Xorg desktop and create a second desktop for the same user. On LXQt, the duplicate login can leave pcmanfm-qt attached to the older display, which removes the expected wallpaper, desktop menu, and file-manager windows from the newer display.
The patch set therefore:
- Backports the upstream DRDYNVC multi-chunk reassembly fix.
- Advertises compiled-in graphics-pipeline support during RDP negotiation.
- Sends
INFOTYPE_LOGON_PLAINNOTIFYwithout bulk compression after the display server attaches. - Opens DisplayControl only when both DRDYNVC and the user session are ready.
- Preserves early EGFX initialization and prevents duplicate channel setup.
- Backports the complete upstream xrdp-sesman restart discovery series and its xrdp 0.10.6 API prerequisites from PR #3346.
- Upstream version: xrdp 0.10.6
- Upstream tag commit:
440a538149561ec8e8e57552ab8f2e0e3f273cd5 - Board: Banana Pi BPI-F3 / SpacemiT K1
- Architecture:
riscv64 - Operating system: openSUSE Tumbleweed
- Backend: xorgxrdp
build_xrdp_riscv64_bpi_f3_opensuse_tumbleweed.shdownloads the pinned upstream release, verifies its SHA-256 digest, applies all three patches, and stages the compiled result under a temporaryDESTDIRwithout installing xrdp on the host.patches/0001-fix-dynvc-multichunk.patchis the upstream DRDYNVC reassembly backport.patches/0002-xrdp-defer-displaycontrol-until-session-attach.patchcontains the session-attach and DisplayControl interoperability fix.patches/0003-sesman-preserve-sessions-across-manager-restart.patchis the complete upstream xrdp-sesman restart discovery backport.
The build result is staged under dist/ and does not overwrite RPM-managed xrdp files. By default, the script installs missing build dependencies with zypper; use --skip-deps when they are already present.
git clone https://github.com/itinfra7/xrdp-riscv64-bpi-f3-opensuse-tumbleweed.git
cd xrdp-riscv64-bpi-f3-opensuse-tumbleweed
sudo ./build_xrdp_riscv64_bpi_f3_opensuse_tumbleweed.shThe output files are:
dist/xrdp-0.10.6-patched-riscv64-staged.tar.gzdist/xrdp-0.10.6-patched-riscv64-staged.tar.gz.sha256
Install the distribution packages first so configuration, xorgxrdp, PAM, systemd integration, and RDP audio remain package-managed:
sudo zypper install xrdp xorgxrdp pipewire-module-xrdpLog out all xrdp desktops before the first patched installation. Verify the local build, stop xrdp, and overlay only the compiled program files; existing files under /etc/xrdp are not replaced.
cd dist
sha256sum -c xrdp-0.10.6-patched-riscv64-staged.tar.gz.sha256
sudo systemctl stop xrdp.service xrdp-sesman.service
sudo tar -xzf xrdp-0.10.6-patched-riscv64-staged.tar.gz -C / \
./usr/bin/ ./usr/sbin/ ./usr/lib64/xrdp/ ./usr/libexec/xrdp/
sudo ldconfig
sudo systemctl start xrdp-sesman.service xrdp.serviceThis overlay intentionally leaves RPM-managed configuration unchanged. A later xrdp package upgrade can replace the patched program files; rebuild and reinstall the patch set after such an upgrade.
- Check the openSUSE Tumbleweed and
riscv64target. - Retrieve xrdp 0.10.6 and verify its pinned SHA-256 digest.
- Verify and apply the three patches in order.
- Regenerate the Autotools build system for the added sesman sources.
- Build with stack protection,
FORTIFY_SOURCE=3, PIE, RELRO, immediate binding, and LTO. - Stage xrdp under a temporary
DESTDIRwithout installing it into/usror/etc. - Produce a normalized staged archive under
dist/for local inspection or packaging.
- All three patches apply cleanly to the xrdp 0.10.6 release source.
- The patched source was built on openSUSE Tumbleweed for riscv64.
- The staged ELF set was checked for PIE, RELRO, immediate binding, NX, stack protection, and fortified libc calls.
- Live xorgxrdp sessions accepted client-window resize events without reconnecting.
This repository does not publish or replace host-specific xrdp.ini, sesman.ini, desktop selection, wallpaper, audio, authentication, firewall, or session-policy configuration. The restart backport preserves sessions created by the patched xrdp-sesexec; it cannot recover a session which was already orphaned by an older binary.
The xrdp project provides the upstream RDP server and protocol implementation. Denis Skvortsov authored the upstream DRDYNVC reassembly fix, and matt335672 authored the xrdp-sesman restart discovery series backported here.
itinfra7 is credited for the session-attach analysis, DisplayControl interoperability patch, riscv64 validation, and openSUSE source build workflow.