From 428f5e0e48e066bdc8663b7ad29caccd60d15f5f Mon Sep 17 00:00:00 2001 From: Esha310 Date: Wed, 1 Jul 2026 11:49:30 +0530 Subject: [PATCH 1/2] fix(decoder): handle insufficient bytes in process_p16 and add unit test Updated the `process_p16` method to check for sufficient data bytes before processing, logging a warning if the input is inadequate. Added a unit test to verify behavior when insufficient bytes are provided. --- src/rust/src/decoder/service_decoder.rs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/rust/src/decoder/service_decoder.rs b/src/rust/src/decoder/service_decoder.rs index 6b9019b63..eda0809ad 100644 --- a/src/rust/src/decoder/service_decoder.rs +++ b/src/rust/src/decoder/service_decoder.rs @@ -262,7 +262,14 @@ impl dtvcc_service_decoder { warn!("dtvcc_process_p16: Window has to be defined first"); return; } - let sym = dtvcc_symbol::new_16(block[0], block[1]); + let Some((&byte0, &byte1)) = block.get(0).zip(block.get(1)) else { + warn!( + "dtvcc_process_p16: P16 command needs 2 data bytes but block only has {}; skipping", + block.len() + ); + return; + }; + let sym = dtvcc_symbol::new_16(byte0, byte1); debug!("dtvcc_process_p16: [{:4X}]", sym.sym); self.process_character(sym); } @@ -1476,6 +1483,16 @@ mod test { decoder.windows[1].attribs.print_direction = 4; } + #[test] + fn test_process_p16_insufficient_bytes() { + let mut decoder = setup_test_decoder_with_memory(); + + decoder.process_p16(&[]); + decoder.process_p16(&[b'a']); + + cleanup_test_decoder(&mut decoder); + } + #[test] fn test_process_p16() { let mut decoder = setup_test_decoder_with_memory(); From c1e8b293397c226574b681772bd1a03ccdd063af Mon Sep 17 00:00:00 2001 From: Esha310 Date: Wed, 1 Jul 2026 12:41:31 +0530 Subject: [PATCH 2/2] handle insufficient bytes in process_p16 --- src/rust/src/decoder/service_decoder.rs | 28 ++++++++++++------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/rust/src/decoder/service_decoder.rs b/src/rust/src/decoder/service_decoder.rs index eda0809ad..cc82ba5e4 100644 --- a/src/rust/src/decoder/service_decoder.rs +++ b/src/rust/src/decoder/service_decoder.rs @@ -262,14 +262,14 @@ impl dtvcc_service_decoder { warn!("dtvcc_process_p16: Window has to be defined first"); return; } - let Some((&byte0, &byte1)) = block.get(0).zip(block.get(1)) else { + if block.len() < 2 { warn!( - "dtvcc_process_p16: P16 command needs 2 data bytes but block only has {}; skipping", + "dtvcc_process_p16: needs 2 data bytes but block only has {}; skipping", block.len() ); return; - }; - let sym = dtvcc_symbol::new_16(byte0, byte1); + } + let sym = dtvcc_symbol::new_16(block[0], block[1]); debug!("dtvcc_process_p16: [{:4X}]", sym.sym); self.process_character(sym); } @@ -1483,16 +1483,6 @@ mod test { decoder.windows[1].attribs.print_direction = 4; } - #[test] - fn test_process_p16_insufficient_bytes() { - let mut decoder = setup_test_decoder_with_memory(); - - decoder.process_p16(&[]); - decoder.process_p16(&[b'a']); - - cleanup_test_decoder(&mut decoder); - } - #[test] fn test_process_p16() { let mut decoder = setup_test_decoder_with_memory(); @@ -1512,6 +1502,16 @@ mod test { cleanup_test_decoder(&mut decoder); } + #[test] + fn test_process_p16_insufficient_bytes() { + let mut decoder = setup_test_decoder_with_memory(); + + decoder.process_p16(&[]); + decoder.process_p16(&[b'a']); + + cleanup_test_decoder(&mut decoder); + } + // -------------------------- C1 Commands------------------------- #[test] fn test_handle_display_windows() {