From 22dcde2c3268d5a8002818b92e76aef33f154701 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Thu, 3 Dec 2020 17:43:34 +0000 Subject: [PATCH] Do not skip pages when decoding a page longer than the MODE SENSE buffer. --- SCSI/Modes/Mode10.cs | 10 ++++++---- SCSI/Modes/Mode6.cs | 10 ++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/SCSI/Modes/Mode10.cs b/SCSI/Modes/Mode10.cs index eaea48733..a405edc01 100644 --- a/SCSI/Modes/Mode10.cs +++ b/SCSI/Modes/Mode10.cs @@ -204,11 +204,12 @@ namespace Aaru.Decoders.SCSI if(isSubpage) { pg.PageResponse = new byte[(modeResponse[offset + 2] << 8) + modeResponse[offset + 3] + 4]; + int copyLen = pg.PageResponse.Length; if(pg.PageResponse.Length + offset > modeResponse.Length) - return decoded; + copyLen = modeResponse.Length - offset; - Array.Copy(modeResponse, offset, pg.PageResponse, 0, pg.PageResponse.Length); + Array.Copy(modeResponse, offset, pg.PageResponse, 0, copyLen); pg.Page = (byte)(modeResponse[offset] & 0x3F); pg.Subpage = modeResponse[offset + 1]; offset += pg.PageResponse.Length; @@ -216,11 +217,12 @@ namespace Aaru.Decoders.SCSI else { pg.PageResponse = new byte[modeResponse[offset + 1] + 2]; + int copyLen = pg.PageResponse.Length; if(pg.PageResponse.Length + offset > modeResponse.Length) - return decoded; + copyLen = modeResponse.Length - offset; - Array.Copy(modeResponse, offset, pg.PageResponse, 0, pg.PageResponse.Length); + Array.Copy(modeResponse, offset, pg.PageResponse, 0, copyLen); pg.Page = (byte)(modeResponse[offset] & 0x3F); pg.Subpage = 0; offset += pg.PageResponse.Length; diff --git a/SCSI/Modes/Mode6.cs b/SCSI/Modes/Mode6.cs index 9d6998333..360190388 100644 --- a/SCSI/Modes/Mode6.cs +++ b/SCSI/Modes/Mode6.cs @@ -149,11 +149,12 @@ namespace Aaru.Decoders.SCSI break; pg.PageResponse = new byte[(modeResponse[offset + 2] << 8) + modeResponse[offset + 3] + 4]; + int copyLen = pg.PageResponse.Length; if(pg.PageResponse.Length + offset > modeResponse.Length) - return decoded; + copyLen = modeResponse.Length - offset; - Array.Copy(modeResponse, offset, pg.PageResponse, 0, pg.PageResponse.Length); + Array.Copy(modeResponse, offset, pg.PageResponse, 0, copyLen); pg.Page = (byte)(modeResponse[offset] & 0x3F); pg.Subpage = modeResponse[offset + 1]; offset += pg.PageResponse.Length; @@ -164,11 +165,12 @@ namespace Aaru.Decoders.SCSI break; pg.PageResponse = new byte[modeResponse[offset + 1] + 2]; + int copyLen = pg.PageResponse.Length; if(pg.PageResponse.Length + offset > modeResponse.Length) - return decoded; + copyLen = modeResponse.Length - offset; - Array.Copy(modeResponse, offset, pg.PageResponse, 0, pg.PageResponse.Length); + Array.Copy(modeResponse, offset, pg.PageResponse, 0, copyLen); pg.Page = (byte)(modeResponse[offset] & 0x3F); pg.Subpage = 0; offset += pg.PageResponse.Length;