* 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.
This commit is contained in:
2015-11-05 06:50:02 +00:00
parent 2f6eaa2393
commit b3bbc5dbe5
2 changed files with 14 additions and 0 deletions

View File

@@ -1,3 +1,9 @@
2015-11-05 Natalia Portillo <claunia@claunia.com>
* SCSI/Modes.cs:
Check for vendor pages not following page format (even if
they must).
2015-11-02 Natalia Portillo <claunia@claunia.com> 2015-11-02 Natalia Portillo <claunia@claunia.com>
* DiscImageChef.Decoders.csproj: * DiscImageChef.Decoders.csproj:

View File

@@ -5904,6 +5904,10 @@ namespace DiscImageChef.Decoders.SCSI
if (isSubpage) if (isSubpage)
{ {
pg.PageResponse = new byte[(modeResponse[offset + 2] << 8) + modeResponse[offset + 3] + 4]; 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); Array.Copy(modeResponse, offset, pg.PageResponse, 0, pg.PageResponse.Length);
pg.Page = (byte)(modeResponse[offset] & 0x3F); pg.Page = (byte)(modeResponse[offset] & 0x3F);
pg.Subpage = modeResponse[offset + 1]; pg.Subpage = modeResponse[offset + 1];
@@ -5912,6 +5916,10 @@ namespace DiscImageChef.Decoders.SCSI
else else
{ {
pg.PageResponse = new byte[modeResponse[offset + 1] + 2]; 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); Array.Copy(modeResponse, offset, pg.PageResponse, 0, pg.PageResponse.Length);
pg.Page = (byte)(modeResponse[offset] & 0x3F); pg.Page = (byte)(modeResponse[offset] & 0x3F);
pg.Subpage = 0; pg.Subpage = 0;