<div dir="ltr"><div>The JPEGReader in 8.1.1 crashes when the output vertical extend is smaller than the whole image. Reason is: outExt[2] and [3] weren't even looked at in the code and it always filled up the whole vertical size going out of allocated outPtr size.</div><div><br></div><div>Below patch fixes it for me. I also posted this in the bug tracker, but dunno what is the supposed way for this.</div><div><br></div><div>Kind regards, Axel</div><div><br></div><div>diff -ru <a href="http://VTK-8.1.1.org/IO/Image/vtkJPEGReader.cxx">VTK-8.1.1.org/IO/Image/vtkJPEGReader.cxx</a> VTK-8.1.1/IO/Image/vtkJPEGReader.cxx</div><div>--- <a href="http://VTK-8.1.1.org/IO/Image/vtkJPEGReader.cxx">VTK-8.1.1.org/IO/Image/vtkJPEGReader.cxx</a><span style="white-space:pre">     </span>2018-05-11 16:34:24.000000000 +0200</div><div>+++ VTK-8.1.1/IO/Image/vtkJPEGReader.cxx<span style="white-space:pre">   </span>2018-07-19 12:37:04.697053464 +0200</div><div>@@ -295,19 +295,23 @@</div><div> </div><div>   // read the bulk data</div><div>   long outSize = cinfo.output_components*(outExt[1] - outExt[0] + 1);</div><div>+  unsigned int line = cinfo.output_height - 1;</div><div>+  outPtr += outSize*(outExt[3] - outExt[2] - 1);</div><div>   while (cinfo.output_scanline < cinfo.output_height)</div><div>   {</div><div>     JDIMENSION linesRead = jpeg_read_scanlines(&cinfo, row_pointers, maxChunk);</div><div> </div><div>     // copy the data into the outPtr</div><div>-    OT *outPtr2 = outPtr + (cinfo.output_height - cinfo.output_scanline)*outInc[1];</div><div>-    for (unsigned int i = 0; i < linesRead; ++i)</div><div>+    for (unsigned int i = linesRead; i > 0; --i)</div><div>     {</div><div>-      memcpy(outPtr2,</div><div>-             row_pointers[linesRead - i - 1]</div><div>-             + outExt[0]*cinfo.output_components,</div><div>-             outSize);</div><div>-      outPtr2 += outInc[1];</div><div>+<span style="white-space:pre">   </span>  if( line >= outExt[2] && line < outExt[3] )</div><div>+<span style="white-space:pre"> </span>  {</div><div>+<span style="white-space:pre"> </span>      memcpy(outPtr,</div><div>+    <span style="white-space:pre">        </span>         row_pointers[i - 1] + outExt[0]*cinfo.output_components,</div><div>+            <span style="white-space:pre">     </span> outSize);</div><div>+          outPtr -= outInc[1];</div><div>+<span style="white-space:pre">        </span>  }</div><div>+<span style="white-space:pre"> </span>  line--;</div><div>     }</div><div>   }</div><div><br></div><div><br></div><div>This code raises the segfault without above patch:</div><div><br></div><div><div>#include <vtkImageClip.h></div><div>#include <vtkJPEGReader.h></div><div><br></div><div>int main( int argc, char** argv )</div><div>{</div><div>    vtkJPEGReader * reader = vtkJPEGReader::New( );</div><div>    reader->SetFileName( "test.jpg" );</div><div>    reader->UpdateInformation( );</div><div><br></div><div>    vtkImageClip * clip = vtkImageClip::New( );</div><div>    clip->SetInputConnection( reader->GetOutputPort( ) );</div><div>    clip->SetOutputWholeExtent( 0, 10, 0, 10, 0, 1 );</div><div>    clip->Update( );</div><div><br></div><div>    return 0;</div><div>}</div></div><div><br></div><div>test.jpg being any large enough image.</div></div>