Browse Source

Better EOF handling.

pull/479/head
James Jackson-South 8 years ago
parent
commit
632233d659
  1. 8
      src/ImageSharp/Formats/Jpeg/GolangPort/Components/Decoder/DecoderThrowHelper.cs
  2. 24
      src/ImageSharp/Formats/Jpeg/GolangPort/OrigJpegDecoderCore.cs

8
src/ImageSharp/Formats/Jpeg/GolangPort/Components/Decoder/DecoderThrowHelper.cs

@ -24,8 +24,14 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.GolangPort.Components.Decoder
throw new ArgumentException("ThrowExceptionForErrorCode() called with NoError!", nameof(errorCode));
case OrigDecoderErrorCode.MissingFF00:
throw new MissingFF00Exception();
case OrigDecoderErrorCode.UnexpectedEndOfStream:
throw new EOFException();
// TODO:
// Disabled for now since we want to avoid throwing for most bad eof.
// Will probably delete
// throw new EOFException();
break;
default:
throw new ArgumentOutOfRangeException(nameof(errorCode), errorCode, null);
}

24
src/ImageSharp/Formats/Jpeg/GolangPort/OrigJpegDecoderCore.cs

@ -235,6 +235,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.GolangPort
// Check for the Start Of Image marker.
this.InputProcessor.ReadFull(this.Temp, 0, 2);
if (this.Temp[0] != OrigJpegConstants.Markers.XFF || this.Temp[1] != OrigJpegConstants.Markers.SOI)
{
throw new ImageFormatException("Missing SOI marker.");
@ -247,6 +248,13 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.GolangPort
while (processBytes)
{
this.InputProcessor.ReadFull(this.Temp, 0, 2);
if (this.InputProcessor.ReachedEOF)
{
// We've reached the end of the stream.
processBytes = false;
}
while (this.Temp[0] != 0xff)
{
// Strictly speaking, this is a format error. However, libjpeg is
@ -282,6 +290,13 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.GolangPort
// Section B.1.1.2 says, "Any marker may optionally be preceded by any
// number of fill bytes, which are bytes assigned code X'FF'".
marker = this.InputProcessor.ReadByte();
if (this.InputProcessor.ReachedEOF)
{
// We've reached the end of the stream.
processBytes = false;
break;
}
}
// End Of Image.
@ -388,15 +403,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.GolangPort
{
this.InputProcessor.Skip(remaining);
}
else if (marker < OrigJpegConstants.Markers.SOF0)
{
// See Table B.1 "Marker code assignments".
throw new ImageFormatException("Unknown marker");
}
else
{
throw new ImageFormatException("Unknown marker");
}
break;
}

Loading…
Cancel
Save