From abcc42e01fda3ce9c8e1739524e0fc73b8778d83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Tue, 8 Apr 2025 15:09:19 +0400 Subject: [PATCH] fix(rdpsnd): correct TrainingPdu wPackSize field MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marc-André Lureau --- crates/ironrdp-rdpsnd/src/pdu/mod.rs | 19 ++++++++++++++++--- .../tests/rdpsnd/mod.rs | 2 +- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/crates/ironrdp-rdpsnd/src/pdu/mod.rs b/crates/ironrdp-rdpsnd/src/pdu/mod.rs index 6ea13cdf..b2d45e58 100644 --- a/crates/ironrdp-rdpsnd/src/pdu/mod.rs +++ b/crates/ironrdp-rdpsnd/src/pdu/mod.rs @@ -599,7 +599,12 @@ impl Encode for TrainingPdu { ensure_size!(in: dst, size: self.size()); dst.write_u16(self.timestamp); - dst.write_u16(cast_length!("TrainingPdu::wPackSize", self.data.len())?); + let len = if self.data.is_empty() { + 0 + } else { + self.size() + ServerAudioOutputPdu::FIXED_PART_SIZE + }; + dst.write_u16(cast_length!("TrainingPdu::wPackSize", len)?); dst.write_slice(&self.data); Ok(()) @@ -622,8 +627,16 @@ impl<'de> Decode<'de> for TrainingPdu { let timestamp = src.read_u16(); let len = src.read_u16() as usize; - ensure_size!(in: src, size: len); - let data = src.read_slice(len).into(); + let data = if len != 0 { + if len < Self::FIXED_PART_SIZE + ServerAudioOutputPdu::FIXED_PART_SIZE { + return Err(invalid_field_err!("TrainingPdu::wPackSize", "too small")); + } + let len = len - Self::FIXED_PART_SIZE - ServerAudioOutputPdu::FIXED_PART_SIZE; + ensure_size!(in: src, size: len); + src.read_slice(len).into() + } else { + Vec::new() + }; Ok(Self { timestamp, data }) } diff --git a/crates/ironrdp-testsuite-core/tests/rdpsnd/mod.rs b/crates/ironrdp-testsuite-core/tests/rdpsnd/mod.rs index 44f14ec7..a175e100 100644 --- a/crates/ironrdp-testsuite-core/tests/rdpsnd/mod.rs +++ b/crates/ironrdp-testsuite-core/tests/rdpsnd/mod.rs @@ -148,7 +148,7 @@ encode_decode_test! { data: vec![0x42], }), [ - 0x06, 0x00, 0x05, 0x00, 0xda, 0x89, 0x01, 0x00, 0x42 + 0x06, 0x00, 0x05, 0x00, 0xda, 0x89, 0x09, 0x00, 0x42 ]; training_confirm: pdu::ClientAudioOutputPdu::TrainingConfirm(pdu::TrainingConfirmPdu { timestamp: 0x89da,