cvOpenFileStorage: reduce the scope of xml_buf and make sure it's freed...
authorRoman Donchenko <roman.donchenko@itseez.com>
Mon, 22 Dec 2014 15:54:39 +0000 (18:54 +0300)
committerRoman Donchenko <roman.donchenko@itseez.com>
Mon, 22 Dec 2014 15:54:39 +0000 (18:54 +0300)
... before any exceptions occur.

modules/core/src/persistence.cpp

index c88e6d2..fe39dc0 100644 (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;
@@ -2822,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(;;)
                 {
@@ -2840,6 +2839,7 @@ cvOpenFileStorage( const char* filename, CvMemStorage* dststorage, int flags, co
                         ptr += strlen(substr);
                     }
                 }
+                cvFree( &xml_buf );
                 if( last_occurence < 0 )
                 {
                     cvReleaseFileStorage( &fs );
@@ -2954,7 +2954,6 @@ _exit_:
         }
     }
 
-    cvFree( &xml_buf );
     return  fs;
 }