Skip to content

Commit 6b4af94

Browse files
PerlmintCBenoit
andauthored
fix(pdu): make AddressFamily parsing resilient (#672)
Co-authored-by: Benoît Cortier <[email protected]>
1 parent c4595bd commit 6b4af94

File tree

3 files changed

+22
-12
lines changed

3 files changed

+22
-12
lines changed

crates/ironrdp-connector/src/connection.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -754,8 +754,8 @@ fn create_client_info_pdu(config: &Config, routing_addr: &SocketAddr) -> rdp::Cl
754754
work_dir: String::new(),
755755
extra_info: ExtendedClientInfo {
756756
address_family: match routing_addr {
757-
SocketAddr::V4(_) => AddressFamily::INet,
758-
SocketAddr::V6(_) => AddressFamily::INet6,
757+
SocketAddr::V4(_) => AddressFamily::INET,
758+
SocketAddr::V6(_) => AddressFamily::INET_6,
759759
},
760760
address: routing_addr.ip().to_string(),
761761
dir: config.client_dir.clone(),

crates/ironrdp-pdu/src/rdp/client_info.rs

+19-9
Original file line numberDiff line numberDiff line change
@@ -208,8 +208,7 @@ impl ExtendedClientInfo {
208208
fn decode(src: &mut ReadCursor<'_>, character_set: CharacterSet) -> DecodeResult<Self> {
209209
ensure_size!(in: src, size: CLIENT_ADDRESS_FAMILY_SIZE + CLIENT_ADDRESS_LENGTH_SIZE);
210210

211-
let address_family = AddressFamily::from_u16(src.read_u16())
212-
.ok_or_else(|| invalid_field_err!("clientAddressFamily", "invalid address family"))?;
211+
let address_family = AddressFamily::from_u16(src.read_u16());
213212

214213
// This size includes the length of the mandatory null terminator.
215214
let address_size = src.read_u16() as usize;
@@ -235,7 +234,7 @@ impl ExtendedClientInfo {
235234
fn encode(&self, dst: &mut WriteCursor<'_>, character_set: CharacterSet) -> EncodeResult<()> {
236235
ensure_size!(in: dst, size: self.size(character_set));
237236

238-
dst.write_u16(self.address_family.to_u16().unwrap());
237+
dst.write_u16(self.address_family.as_u16());
239238
// // + size of null terminator, which will write in the write_string function
240239
dst.write_u16(string_len(self.address.as_str(), character_set) + character_set.to_u16().unwrap());
241240
utils::write_string_to_cursor(dst, self.address.as_str(), character_set, true)?;
@@ -609,12 +608,23 @@ impl Default for PerformanceFlags {
609608
}
610609
}
611610

612-
#[repr(u16)]
613-
#[derive(Debug, Copy, Clone, PartialEq, Eq, FromPrimitive, ToPrimitive)]
614-
pub enum AddressFamily {
615-
Invalid = 0x0000, // value given by MS Remote Desktop for Android 10.0.18.1251
616-
INet = 0x0002,
617-
INet6 = 0x0017,
611+
#[repr(transparent)]
612+
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
613+
pub struct AddressFamily(u16);
614+
615+
impl AddressFamily {
616+
pub const INET: Self = Self(0x0002);
617+
pub const INET_6: Self = Self(0x0017);
618+
}
619+
620+
impl AddressFamily {
621+
pub fn from_u16(val: u16) -> Self {
622+
Self(val)
623+
}
624+
625+
pub fn as_u16(self) -> u16 {
626+
self.0
627+
}
618628
}
619629

620630
bitflags! {

crates/ironrdp-testsuite-core/src/client_info.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ lazy_static::lazy_static! {
9696
alternate_shell: String::from(""),
9797
work_dir: String::from(""),
9898
extra_info: ExtendedClientInfo {
99-
address_family: AddressFamily::INet,
99+
address_family: AddressFamily::INET,
100100
address: String::from("157.59.242.156"),
101101
dir: String::from("C:\\depots\\w2k3_1\\termsrv\\newclient\\lib\\win32\\obj\\i386\\mstscax.dll"),
102102
optional_data: ExtendedClientOptionalInfo::builder()

0 commit comments

Comments
 (0)