persistence: fixing crash with space-only values
authorPhilipp Hasper <vcs@ioxp.de>
Thu, 7 Jul 2016 07:55:30 +0000 (09:55 +0200)
committerPhilipp Hasper <vcs@ioxp.de>
Fri, 8 Jul 2016 10:41:05 +0000 (12:41 +0200)
modules/core/src/persistence.cpp
modules/core/test/test_io.cpp

index 2fc4f9f..4d99a4a 100644 (file)
@@ -1852,7 +1852,7 @@ icvYMLWriteString( CvFileStorage* fs, const char* key,
 
     if( quote || len == 0 || str[0] != str[len-1] || (str[0] != '\"' && str[0] != '\'') )
     {
-        int need_quote = quote || len == 0;
+        int need_quote = quote || len == 0 || str[0] == ' ';
         data = buf;
         *data++ = '\"';
         for( i = 0; i < len; i++ )
index 1367776..f2c53dc 100644 (file)
@@ -578,6 +578,22 @@ TEST(Core_InputOutput, FileStorageKey)
     ASSERT_STREQ(f.releaseAndGetString().c_str(), expected.c_str());
 }
 
+TEST(Core_InputOutput, FileStorageSpaces)
+{
+    cv::FileStorage f("dummy.yml", cv::FileStorage::WRITE | cv::FileStorage::MEMORY);
+    const int valueCount = 5;
+    std::string values[5] = { "", " ", " ", "  a", " some string" };
+    for (size_t i = 0; i < valueCount; i++) {
+        EXPECT_NO_THROW(f << cv::format("key%d", i) << values[i]);
+    }
+    cv::FileStorage f2(f.releaseAndGetString(), cv::FileStorage::READ | cv::FileStorage::MEMORY);
+    std::string valuesRead[valueCount];
+    for (size_t i = 0; i < valueCount; i++) {
+        EXPECT_NO_THROW(f2[cv::format("key%d", i)] >> valuesRead[i]);
+        ASSERT_STREQ(values[i].c_str(), valuesRead[i].c_str());
+    }
+}
+
 TEST(Core_InputOutput, filestorage_yml_compatibility)
 {
     // TODO: