Merge pull request #3497 from SpecLad:fs-open-fail-leak

This commit is contained in:
Roman Donchenko 2014-12-24 08:59:53 +00:00
commit 034ff3ce13

View File

@ -2683,7 +2683,6 @@ CV_IMPL CvFileStorage*
cvOpenFileStorage( const char* filename, CvMemStorage* dststorage, int flags, const char* encoding )
{
CvFileStorage* fs = 0;
char* xml_buf = 0;
int default_block_size = 1 << 18;
bool append = (flags & 3) == CV_STORAGE_APPEND;
bool mem = (flags & CV_STORAGE_MEMORY) != 0;
@ -2724,7 +2723,10 @@ cvOpenFileStorage( const char* filename, CvMemStorage* dststorage, int flags, co
(dot_pos[3] == '\0' || (cv_isdigit(dot_pos[3]) && dot_pos[4] == '\0')) )
{
if( append )
{
cvReleaseFileStorage( &fs );
CV_Error(CV_StsNotImplemented, "Appending data to compressed file is not implemented" );
}
isGZ = true;
compression = dot_pos[3];
if( compression )
@ -2745,6 +2747,7 @@ cvOpenFileStorage( const char* filename, CvMemStorage* dststorage, int flags, co
if( !fs->gzfile )
goto _exit_;
#else
cvReleaseFileStorage( &fs );
CV_Error(CV_StsNotImplemented, "There is no compressed file storage support in this configuration");
#endif
}
@ -2797,7 +2800,10 @@ cvOpenFileStorage( const char* filename, CvMemStorage* dststorage, int flags, co
if( strcmp( encoding, "UTF-16" ) == 0 ||
strcmp( encoding, "utf-16" ) == 0 ||
strcmp( encoding, "Utf-16" ) == 0 )
{
cvReleaseFileStorage( &fs );
CV_Error( CV_StsBadArg, "UTF-16 XML encoding is not supported! Use 8-bit encoding\n");
}
CV_Assert( strlen(encoding) < 1000 );
char buf[1100];
@ -2815,7 +2821,7 @@ cvOpenFileStorage( const char* filename, CvMemStorage* dststorage, int flags, co
int last_occurence = -1;
xml_buf_size = MIN(xml_buf_size, int(file_size));
fseek( fs->file, -xml_buf_size, SEEK_END );
xml_buf = (char*)cvAlloc( xml_buf_size+2 );
char* xml_buf = (char*)cvAlloc( xml_buf_size+2 );
// find the last occurence of </opencv_storage>
for(;;)
{
@ -2833,8 +2839,12 @@ cvOpenFileStorage( const char* filename, CvMemStorage* dststorage, int flags, co
ptr += strlen(substr);
}
}
cvFree( &xml_buf );
if( last_occurence < 0 )
{
cvReleaseFileStorage( &fs );
CV_Error( CV_StsError, "Could not find </opencv_storage> in the end of file.\n" );
}
icvCloseFile( fs );
fs->file = fopen( fs->filename, "r+t" );
fseek( fs->file, last_occurence, SEEK_SET );
@ -2908,10 +2918,18 @@ cvOpenFileStorage( const char* filename, CvMemStorage* dststorage, int flags, co
//mode = cvGetErrMode();
//cvSetErrMode( CV_ErrModeSilent );
if( fs->fmt == CV_STORAGE_FORMAT_XML )
icvXMLParse( fs );
else
icvYMLParse( fs );
try
{
if( fs->fmt == CV_STORAGE_FORMAT_XML )
icvXMLParse( fs );
else
icvYMLParse( fs );
}
catch (...)
{
cvReleaseFileStorage( &fs );
throw;
}
//cvSetErrMode( mode );
// release resources that we do not need anymore
@ -2936,7 +2954,6 @@ _exit_:
}
}
cvFree( &xml_buf );
return fs;
}