From 8fd1e10830483edda85f0136f6bb92f1dd16d6d6 Mon Sep 17 00:00:00 2001 From: Dominik Csapak Date: Tue, 27 Apr 2021 10:17:01 +0200 Subject: [PATCH] tools/sgutils2: add size workaround for mode_sense Some drives will always return the number of bytes given in the allocation_length field, but correctly report the data len in the mode sense header. Simply ignore the excess data. Signed-off-by: Dominik Csapak --- src/tools/sgutils2.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/tools/sgutils2.rs b/src/tools/sgutils2.rs index 7a24404e..78527554 100644 --- a/src/tools/sgutils2.rs +++ b/src/tools/sgutils2.rs @@ -728,10 +728,15 @@ pub fn scsi_mode_sense( let mut reader = &data[..]; let head: ModeParameterHeader = unsafe { reader.read_be_value()? }; + let expected_len = head.mode_data_len as usize + 2; - if (head.mode_data_len as usize + 2) != data.len() { - let len = head.mode_data_len; - bail!("wrong mode_data_len: {}, expected {}", len, data.len() - 2); + if data.len() < expected_len { + bail!("wrong mode_data_len: got {}, expected {}", data.len(), expected_len); + } else if data.len() > expected_len { + // Note: Some hh7 drives returns the allocation_length + // instead of real data_len + let header_size = std::mem::size_of::(); + reader = &data[header_size..expected_len]; } if disable_block_descriptor && head.block_descriptior_len != 0 {