Hi yall,
I really spent precious time getting on top of this nasty one ...

In nglImageJPEGCodec_shr.cpp :

bool nglImageJPEGCodec::Feed(nglIStream* pIStream)
{
  while(pIStream->Available() && pIStream->GetState() == eStreamReady)
  {
    switch(mState)
    {
      case jpegReadHeader:
        if(ReadHeader(pIStream))
        {
          mpBuffer = mpImage->GetBuffer() +
                     mLineSize*(mpImage->GetHeight()-1);
          mState = jpegReadData;
        }
        break;
      case(jpegReadData):
        ReadData();
        SendData((float)mLine/(float)mpImage->GetHeight());
        return (pIStream->GetState()==eStreamWait) ||
               (pIStream->GetState()==eStreamReady);
        break;
      case(jpegError):
        return false;
    }
  }
  return (pIStream->GetState()==eStreamWait) ||
         (pIStream->GetState()==eStreamReady);
}

This F&[EMAIL PROTECTED] routine miserably fails and leaks teraloads of garbage to memory when actual file size is less than : INPUT_BUF_SIZE ...

The patch below seems to correct the flaw.

bool nglImageJPEGCodec::Feed(nglIStream* pIStream)
{
  while(pIStream->Available() && pIStream->GetState() == eStreamReady)
  {
    switch(mState)
    {
      case jpegReadHeader:
        if(!ReadHeader(pIStream))
        {
          jpeg_finish_decompress(&mCinfo);
          jpeg_destroy_decompress(&mCinfo);
          mState = jpegError;
          return false;
        }
        mpBuffer = mpImage->GetBuffer() +
                   mLineSize*(mpImage->GetHeight()-1);
        mState = jpegReadData;
        /*fallthru!*/
      case(jpegReadData):
        ReadData();
        SendData((float)mLine/(float)mpImage->GetHeight());
        if((pIStream->GetState()!=eStreamWait) &&
           (pIStream->GetState()!=eStreamReady))
        {
          return false;
        }
        break;
      case(jpegError):
        return false;
    }
  }
  return (pIStream->GetState()==eStreamWait) ||
         (pIStream->GetState()==eStreamReady);
}

I haven't looked to other codecs but if the same shit happens it might be worth propagating the fix.

Cheers.

Lo.

_______________________________________________
https://mail.gna.org/listinfo/ngl-devel

Reply via email to