Skip to content

Test: replay review publication for upstream PR #2005 - #1

Closed
meanaverage wants to merge 2 commits into
test/pr2005-review-replay-base-20261011from
test/pr2005-review-replay-head-20261011
Closed

meanaverage wants to merge 2 commits into
test/pr2005-review-replay-base-20261011from
test/pr2005-review-replay-head-20261011

Conversation

@meanaverage

Copy link
Copy Markdown
Owner

Disposable diagnostic PR in this public fork. Recreates the exact base and head of Devolutions#2005 to replay the review API payload that failed during the October 7 GitHub outage. No merge intended; this PR will be closed after the test.

A server can send data on a dynamic channel before it sees the client
decline that channel in its Create Response. GNOME Remote Desktop does this
for AUDIO_PLAYBACK_DVC right after the Create Request, so a client without
an audio channel failed `process` with "access to non existing DVC channel"
and the session ended about a second after connecting.

Such data has nowhere to go: log it and drop it.
As with a declined channel on the server side, this is not a fault, and a
server may keep sending such data, so a warning per PDU would flood the log.

@meanaverage meanaverage left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR 2005 replaces a session-ending error in DrdynvcClient::process_data with a debug-logged drop when data arrives for a channel that is not open (e.g. declined AUDIO_PLAYBACK_DVC before the server sees the NO_LISTENER Create Response), consistent with MS-RDPEDYC's ignore-stale-references model, existing process_close/process_soft_sync_request tolerance, and verified by a new reproducing test. Both specialist candidates are valid: the identical pre-decline race remains fatal on the multitransport tunnel path (process_tunnel still errors for channels absent from tunnel_channels, and declined channels are never inserted there), published as a question since tunnel-routing strictness may be intentional and no tunnel reproduction exists; and the new test's local closure duplicates a data-PDU encoding pattern that actually appears four times across the test file, refined to recommend a file-level shared helper.

  1. [skeptical] Same pre-decline race remains fatal on the multitransport tunnel path — low 🟡 ❓ — crates/ironrdp-dvc/src/client.rs
    The PR makes the TCP path drop data for a never-opened channel, but process_tunnel still returns a hard session-ending error when a Data PDU's channel_id is absent from tunnel_channels (client.rs:380-382). Declined channels are never inserted there: process_soft_sync_request only maps channels present in dynamic_channels and skips declined ones with a debug log (lines 510-519), while its own comments state the server starts sending data for listed channels (including declined ones) on the tunnel before seeing the Soft-Sync response (lines 498-509). A server reproducing the AUDIO_PLAYBACK_DVC race over a Soft-Sync tunnel would therefore still terminate the session. It is unclear whether this is intentional tunnel-routing validation (MS-RDPEDYC 3.1.5.4.3/3.2.5.3.2) that the PR deliberately scopes out, and no tunnel-path reproduction was provided, so maintainer input is needed before treating it as a defect.

Comment on lines +99 to +105
let data = |channel_id: u32, payload: &[u8]| {
encode_vec(&DrdynvcServerPdu::Data(DrdynvcDataPdu::Data(DataPdu::new(
channel_id,
payload.to_vec(),
))))
.expect("DVC data should encode")
};

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[code-compressor] New test's data closure duplicates a data-PDU encoding pattern repeated across the file — low 🟡 — The new test introduces a local data closure (lines 99-105) wrapping the encode_vec(&DrdynvcServerPdu::Data(DrdynvcDataPdu::Data(DataPdu::new(...)))) construction, which is already written inline in established_dynamic_channel_routes_recorded_data_without_negotiation (lines 133-137) and appears again in two further tests (lines 243 and 295). Hoisting one file-level helper function in the style of the existing exchange_capabilities helper and using it at all four sites would remove the duplication and shrink each test body. The closure as written is correct; this is a behavior-neutral, optional cleanup.

@meanaverage
meanaverage deleted the test/pr2005-review-replay-head-20261011 branch October 11, 2026 10:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant