File tree Expand file tree Collapse file tree 4 files changed +31
-5
lines changed 
src/ImageSharp/Formats/Jpeg/Components/Decoder Expand file tree Collapse file tree 4 files changed +31
-5
lines changed Original file line number Diff line number Diff line change @@ -22,6 +22,9 @@ internal struct HuffmanScanBuffer
2222        // Whether there is no more good data to pull from the stream for the current mcu. 
2323        private  bool  badData ; 
2424
25+         // How many times have we hit the eof. 
26+         private  int  eofHitCount ; 
27+ 
2528        public  HuffmanScanBuffer ( BufferedReadStream  stream ) 
2629        { 
2730            this . stream  =  stream ; 
@@ -31,6 +34,7 @@ public HuffmanScanBuffer(BufferedReadStream stream)
3134            this . MarkerPosition  =  0 ; 
3235            this . badData  =  false ; 
3336            this . NoData  =  false ; 
37+             this . eofHitCount  =  0 ; 
3438        } 
3539
3640        /// <summary> 
@@ -218,11 +222,16 @@ private int ReadStream()
218222            // we know we have hit the EOI and completed decoding the scan buffer. 
219223            if  ( value  ==  - 1  ||  ( this . badData  &&  this . data  ==  0  &&  this . stream . Position  >=  this . stream . Length ) ) 
220224            { 
221-                 // We've encountered  the end of the file stream which means there's no EOI marker 
225+                 // We've hit  the end of the file stream more times than allowed  which means there's no EOI marker 
222226                // in the image or the SOS marker has the wrong dimensions set. 
223-                 this . badData  =  true ; 
224-                 this . NoData  =  true ; 
225-                 value  =  0 ; 
227+                 if  ( this . eofHitCount  >  JpegConstants . Huffman . FetchLoop ) 
228+                 { 
229+                     this . badData  =  true ; 
230+                     this . NoData  =  true ; 
231+                     value  =  0 ; 
232+                 } 
233+ 
234+                 this . eofHitCount ++ ; 
226235            } 
227236
228237            return  value ; 
Original file line number Diff line number Diff line change @@ -229,6 +229,19 @@ public void Issue2133_DeduceColorSpace<TPixel>(TestImageProvider<TPixel> provide
229229            } 
230230        } 
231231
232+         // https://github.com/SixLabors/ImageSharp/issues/2638 
233+         [ Theory ] 
234+         [ WithFile ( TestImages . Jpeg . Issues . Issue2638 ,  PixelTypes . Rgba32 ) ] 
235+         public  void  Issue2638_DecodeWorks < TPixel > ( TestImageProvider < TPixel >  provider ) 
236+             where  TPixel  :  unmanaged,  IPixel < TPixel > 
237+         { 
238+             using  ( Image < TPixel >  image  =  provider . GetImage ( JpegDecoder ) ) 
239+             { 
240+                 image . DebugSave ( provider ) ; 
241+                 image . CompareToOriginal ( provider ) ; 
242+             } 
243+         } 
244+ 
232245        // DEBUG ONLY! 
233246        // The PDF.js output should be saved by "tests\ImageSharp.Tests\Formats\Jpg\pdfjs\jpeg-converter.htm" 
234247        // into "\tests\Images\ActualOutput\JpegDecoderTests\" 
Original file line number Diff line number Diff line change @@ -269,7 +269,8 @@ public static class Issues
269269                public  const  string  ValidExifArgumentNullExceptionOnEncode  =  "Jpg/issues/Issue2087-exif-null-reference-on-encode.jpg" ; 
270270                public  const  string  Issue2133DeduceColorSpace  =  "Jpg/issues/Issue2133.jpg" ; 
271271                public  const  string  HangBadScan  =  "Jpg/issues/Hang_C438A851.jpg" ; 
272-             public  const  string  Issue2758  =  "Jpg/issues/issue-2758.jpg" ; 
272+                 public  const  string  Issue2758  =  "Jpg/issues/issue-2758.jpg" ; 
273+                 public  const  string  Issue2638  =  "Jpg/issues/Issue2638.jpg" ; 
273274
274275                public  static class  Fuzz 
275276                { 
 
 
   
 
     
   
   
          
    
    
     
    
      
     
     
    You can’t perform that action at this time.
  
 
    
  
    
      
        
     
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments