core(persistence): fix resource leaks - force closing files

pull/16895/head
Alexander Alekhin 5 years ago
parent 4dfa798e75
commit 673eb2b006
  1. 13
      modules/core/src/persistence.cpp
  2. 61
      modules/core/test/test_io.cpp

@ -407,14 +407,13 @@ public:
else if ( fmt == FileStorage::FORMAT_JSON )
puts( "}\n" );
}
closeFile();
if( mem_mode && out )
{
*out = cv::String(outbuf.begin(), outbuf.end());
}
init();
}
closeFile();
init();
}
void analyze_file_name( const std::string& file_name, std::vector<std::string>& params )
@ -1824,12 +1823,20 @@ FileStorage::~FileStorage()
}
bool FileStorage::open(const String& filename, int flags, const String& encoding)
{
try
{
bool ok = p->open(filename.c_str(), flags, encoding.c_str());
if(ok)
state = FileStorage::NAME_EXPECTED + FileStorage::INSIDE_MAP;
return ok;
}
catch (...)
{
release();
throw; // re-throw
}
}
bool FileStorage::isOpened() const { return p->is_opened; }

@ -1711,4 +1711,65 @@ TEST(Core_InputOutput, FileStorage_JSON_VeryLongLines)
}
}
TEST(Core_InputOutput, FileStorage_empty_16823)
{
std::string fname = tempfile("test_fs_empty.yml");
{
// create empty file
std::ofstream f(fname.c_str(), std::ios::out);
}
try
{
FileStorage fs(fname, FileStorage::READ);
ADD_FAILURE() << "Exception must be thrown for empty file.";
}
catch (const cv::Exception&)
{
// expected way
// closed files can be checked manually through 'strace'
}
catch (const std::exception& e)
{
ADD_FAILURE() << "Unexpected exception: " << e.what();
}
catch (...)
{
ADD_FAILURE() << "Unexpected unknown C++ exception";
}
EXPECT_EQ(0, remove(fname.c_str()));
}
TEST(Core_InputOutput, FileStorage_open_empty_16823)
{
std::string fname = tempfile("test_fs_open_empty.yml");
{
// create empty file
std::ofstream f(fname.c_str(), std::ios::out);
}
FileStorage fs;
try
{
fs.open(fname, FileStorage::READ);
ADD_FAILURE() << "Exception must be thrown for empty file.";
}
catch (const cv::Exception&)
{
// expected way
// closed files can be checked manually through 'strace'
}
catch (const std::exception& e)
{
ADD_FAILURE() << "Unexpected exception: " << e.what();
}
catch (...)
{
ADD_FAILURE() << "Unexpected unknown C++ exception";
}
EXPECT_EQ(0, remove(fname.c_str()));
}
}} // namespace

Loading…
Cancel
Save