From 8843e11b55ceeb834eabdebb24b5751b6d9249a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Tue, 13 Aug 2024 23:31:43 +0400 Subject: [PATCH] fix(server): error early for bitmap encoding if width % 4 != 0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is not supported yet, and I am not sure how to do it atm. Generally, server uses multiple of 4 widths, and client has surface capabilities, so this path is unlikely. Signed-off-by: Marc-André Lureau --- crates/ironrdp-server/src/encoder/bitmap.rs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/crates/ironrdp-server/src/encoder/bitmap.rs b/crates/ironrdp-server/src/encoder/bitmap.rs index c87b31bf..468a8c3a 100644 --- a/crates/ironrdp-server/src/encoder/bitmap.rs +++ b/crates/ironrdp-server/src/encoder/bitmap.rs @@ -3,7 +3,7 @@ use ironrdp_graphics::rdp6::{ABgrChannels, ARgbChannels, BgrAChannels, BitmapStr use ironrdp_pdu::bitmap::{self, BitmapData, BitmapUpdateData, Compression}; use ironrdp_pdu::cursor::WriteCursor; use ironrdp_pdu::geometry::InclusiveRectangle; -use ironrdp_pdu::{PduEncode, PduError}; +use ironrdp_pdu::{invalid_message_err, PduEncode, PduError}; use crate::{BitmapUpdate, PixelOrder}; @@ -20,7 +20,16 @@ impl BitmapEncoder { } pub(crate) fn encode(&mut self, bitmap: &BitmapUpdate, output: &mut [u8]) -> Result { - let row_len = usize::from(bitmap.width.get()) * usize::from(bitmap.format.bytes_per_pixel()); + // FIXME: support non-multiple of 4 widths. + // + // It’s not clear how to achieve that yet, but generally, server uses multiple of 4-widths, + // and client has surface capabilities, so this path is unlikely. + if bitmap.width.get() % 4 != 0 { + return Err(invalid_message_err!("bitmap", "Width must be a multiple of 4")); + } + + let bytes_per_pixel = usize::from(bitmap.format.bytes_per_pixel()); + let row_len = usize::from(bitmap.width.get()) * bytes_per_pixel; let chunk_height = usize::from(u16::MAX) / row_len; let mut cursor = WriteCursor::new(output);