File opencv-imgcodecs-replace-assert-add-overflow-checks.patch of Package opencv.8179
diff --git a/modules/imgcodecs/src/bitstrm.cpp b/modules/imgcodecs/src/bitstrm.cpp
index 81829c4..ad6f947 100644
--- a/modules/imgcodecs/src/bitstrm.cpp
+++ b/modules/imgcodecs/src/bitstrm.cpp
@@ -42,6 +42,7 @@
#include "precomp.hpp"
#include "bitstrm.hpp"
+#include "utils.hpp"
namespace cv
{
@@ -164,7 +165,7 @@ void RBaseStream::release()
void RBaseStream::setPos( int pos )
{
- assert( isOpened() && pos >= 0 );
+ CV_Assert(isOpened() && pos >= 0);
if( !m_file )
{
@@ -181,14 +182,19 @@ void RBaseStream::setPos( int pos )
int RBaseStream::getPos()
{
- assert( isOpened() );
- return m_block_pos + (int)(m_current - m_start);
+ CV_Assert(isOpened());
+ int pos = validateToInt((m_current - m_start) + m_block_pos);
+ CV_Assert(pos >= m_block_pos); // overflow check
+ CV_Assert(pos >= 0); // overflow check
+ return pos;
}
void RBaseStream::skip( int bytes )
{
- assert( bytes >= 0 );
+ CV_Assert(bytes >= 0);
+ uchar* old = m_current;
m_current += bytes;
+ CV_Assert(m_current >= old); // overflow check
}
///////////////////////// RLByteStream ////////////////////////////
@@ -220,7 +226,7 @@ int RLByteStream::getBytes( void* buffer, int count )
{
uchar* data = (uchar*)buffer;
int readed = 0;
- assert( count >= 0 );
+ CV_Assert(count >= 0);
while( count > 0 )
{
@@ -371,7 +377,7 @@ void WBaseStream::writeBlock()
{
int size = (int)(m_current - m_start);
- assert( isOpened() );
+ CV_Assert(isOpened());
if( size == 0 )
return;
@@ -442,7 +448,7 @@ void WBaseStream::release()
int WBaseStream::getPos()
{
- assert( isOpened() );
+ CV_Assert(isOpened());
return m_block_pos + (int)(m_current - m_start);
}
@@ -465,7 +471,7 @@ void WLByteStream::putBytes( const void* buffer, int count )
{
uchar* data = (uchar*)buffer;
- assert( data && m_current && count >= 0 );
+ CV_Assert(data && m_current && count >= 0);
while( count )
{
diff --git a/modules/imgcodecs/src/grfmt_bmp.cpp b/modules/imgcodecs/src/grfmt_bmp.cpp
index e53ae13..0d6156e 100644
--- a/modules/imgcodecs/src/grfmt_bmp.cpp
+++ b/modules/imgcodecs/src/grfmt_bmp.cpp
@@ -92,6 +92,7 @@ bool BmpDecoder::readHeader()
m_offset = m_strm.getDWord();
int size = m_strm.getDWord();
+ CV_Assert(size > 0); // overflow, 2Gb limit
if( size >= 36 )
{
diff --git a/modules/imgcodecs/src/grfmt_sunras.cpp b/modules/imgcodecs/src/grfmt_sunras.cpp
index 97e1812..97e51fd 100644
--- a/modules/imgcodecs/src/grfmt_sunras.cpp
+++ b/modules/imgcodecs/src/grfmt_sunras.cpp
@@ -120,7 +120,7 @@ bool SunRasterDecoder::readHeader()
m_type = IsColorPalette( m_palette, m_bpp ) ? CV_8UC3 : CV_8UC1;
m_offset = m_strm.getPos();
- assert( m_offset == 32 + m_maplength );
+ CV_Assert(m_offset == 32 + m_maplength);
result = true;
}
}
@@ -133,7 +133,7 @@ bool SunRasterDecoder::readHeader()
m_offset = m_strm.getPos();
- assert( m_offset == 32 + m_maplength );
+ CV_Assert(m_offset == 32 + m_maplength);
result = true;
}
}
@@ -226,7 +226,7 @@ bool SunRasterDecoder::readData( Mat& img )
code = m_strm.getByte();
if( len > line_end - tsrc )
{
- assert(0);
+ CV_Error(Error::StsInternal, "");
goto bad_decoding_1bpp;
}
@@ -367,7 +367,7 @@ bad_decoding_end:
result = true;
break;
default:
- assert(0);
+ CV_Error(Error::StsInternal, "");
}
}
catch( ... )
diff --git a/modules/imgcodecs/src/utils.cpp b/modules/imgcodecs/src/utils.cpp
index f7c38d6..9c48336 100644
--- a/modules/imgcodecs/src/utils.cpp
+++ b/modules/imgcodecs/src/utils.cpp
@@ -668,7 +668,7 @@ cvConvertImage( const CvArr* srcarr, CvArr* dstarr, int flags )
icvCvt_BGR2Gray_8u_C3C1R( s, s_step, d, d_step, size, swap_rb );
break;
case 33:
- assert( swap_rb );
+ CV_Assert(swap_rb);
icvCvt_RGB2BGR_8u_C3R( s, s_step, d, d_step, size );
break;
case 41: