From b3bbc5dbe5e7a94e97b995e3aa32b4c674399fa9 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Thu, 5 Nov 2015 06:50:02 +0000 Subject: [PATCH] * DiscImageChef.Decoders/SCSI/Modes.cs: Check for vendor pages not following page format (even if they must). * DiscImageChef.Devices/Device/Constructor.cs: Some devices (at least smsc usb-floppy) crash and reset when receiving ata over the ATA PASS-THROUGH scsi command. This will check for SCSI compliance first giving devices time to reset. * DiscImageChef.Devices/Device/ScsiCommands.cs: Some devices (smsc usb floppies) return the real command result size disregarding allocation length and generating a buffer overflow. * DiscImageChef.Devices/Enums.cs: Added some vendor commands for Plextor and HL-DT-ST devices. * DiscImageChef/Commands/DeviceInfo.cs: Mode sense should be written even if it can't be decoded. --- ChangeLog | 6 ++++++ SCSI/Modes.cs | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/ChangeLog b/ChangeLog index 7480dda..3bd6714 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2015-11-05 Natalia Portillo + + * SCSI/Modes.cs: + Check for vendor pages not following page format (even if + they must). + 2015-11-02 Natalia Portillo * DiscImageChef.Decoders.csproj: diff --git a/SCSI/Modes.cs b/SCSI/Modes.cs index f458316..9548f24 100644 --- a/SCSI/Modes.cs +++ b/SCSI/Modes.cs @@ -5904,6 +5904,10 @@ namespace DiscImageChef.Decoders.SCSI if (isSubpage) { pg.PageResponse = new byte[(modeResponse[offset + 2] << 8) + modeResponse[offset + 3] + 4]; + + if((pg.PageResponse.Length + offset) > modeResponse.Length) + return decoded; + Array.Copy(modeResponse, offset, pg.PageResponse, 0, pg.PageResponse.Length); pg.Page = (byte)(modeResponse[offset] & 0x3F); pg.Subpage = modeResponse[offset + 1]; @@ -5912,6 +5916,10 @@ namespace DiscImageChef.Decoders.SCSI else { pg.PageResponse = new byte[modeResponse[offset + 1] + 2]; + + if((pg.PageResponse.Length + offset) > modeResponse.Length) + return decoded; + Array.Copy(modeResponse, offset, pg.PageResponse, 0, pg.PageResponse.Length); pg.Page = (byte)(modeResponse[offset] & 0x3F); pg.Subpage = 0;