diff --git a/lib/srv/desktop/rdp/rdpclient/src/cliprdr.rs b/lib/srv/desktop/rdp/rdpclient/src/cliprdr.rs index 0451f4b90de35..3942ea1ca88f1 100644 --- a/lib/srv/desktop/rdp/rdpclient/src/cliprdr.rs +++ b/lib/srv/desktop/rdp/rdpclient/src/cliprdr.rs @@ -572,14 +572,16 @@ fn decode_clipboard(mut data: Vec, format: ClipboardFormat) -> RdpResult { let mut data = data.as_slice(); - let clip = data.len() - 2; - if data.len() >= 2 && data[clip..] == [0, 0] { - data = &data[..clip]; + let len = data.len(); + if len >= 2 { + let clip = len - 2; + if data[clip..] == [0, 0] { + data = &data[..clip]; + } } let units: Vec = data @@ -807,6 +809,13 @@ mod tests { use std::io::Cursor; use std::sync::mpsc::channel; + #[test] + fn decode_clipboard_overflow() { + // a single byte is invalid for CF_UNICODETEXT + let result = decode_clipboard(vec![54u8], ClipboardFormat::CF_UNICODETEXT).unwrap(); + assert!(result.is_empty()); + } + #[test] fn encode_format_list_short() { let client = Client::default();