cvOpenFileStorage: reduce the scope of xml_buf and make sure it's freed...

... before any exceptions occur.

(cherry picked from commit 08da247a87)
This commit is contained in:
Roman Donchenko 2014-12-22 18:54:39 +03:00 committed by Alexander Smorkalov
parent b0b2fc9e3f
commit bf2256fb89

View File

@ -2683,7 +2683,6 @@ CV_IMPL CvFileStorage*
cvOpenFileStorage( const char* filename, CvMemStorage* dststorage, int flags, const char* encoding ) cvOpenFileStorage( const char* filename, CvMemStorage* dststorage, int flags, const char* encoding )
{ {
CvFileStorage* fs = 0; CvFileStorage* fs = 0;
char* xml_buf = 0;
int default_block_size = 1 << 18; int default_block_size = 1 << 18;
bool append = (flags & 3) == CV_STORAGE_APPEND; bool append = (flags & 3) == CV_STORAGE_APPEND;
bool mem = (flags & CV_STORAGE_MEMORY) != 0; bool mem = (flags & CV_STORAGE_MEMORY) != 0;
@ -2815,7 +2814,7 @@ cvOpenFileStorage( const char* filename, CvMemStorage* dststorage, int flags, co
int last_occurence = -1; int last_occurence = -1;
xml_buf_size = MIN(xml_buf_size, int(file_size)); xml_buf_size = MIN(xml_buf_size, int(file_size));
fseek( fs->file, -xml_buf_size, SEEK_END ); 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> // find the last occurence of </opencv_storage>
for(;;) for(;;)
{ {
@ -2833,6 +2832,7 @@ cvOpenFileStorage( const char* filename, CvMemStorage* dststorage, int flags, co
ptr += strlen(substr); ptr += strlen(substr);
} }
} }
cvFree( &xml_buf );
if( last_occurence < 0 ) if( last_occurence < 0 )
CV_Error( CV_StsError, "Could not find </opencv_storage> in the end of file.\n" ); CV_Error( CV_StsError, "Could not find </opencv_storage> in the end of file.\n" );
icvCloseFile( fs ); icvCloseFile( fs );
@ -2936,7 +2936,6 @@ _exit_:
} }
} }
cvFree( &xml_buf );
return fs; return fs;
} }