From 5ca1c40c92f074315bbdfe328c00484ff18146f2 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Fri, 1 Feb 2019 17:57:58 +0100 Subject: Fix configfile parsing of empty value lines and creation of missing configuration directory. --- src/configfile.cc | 9 +++++---- test/configtest.cc | 10 ++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/configfile.cc b/src/configfile.cc index 731d3aa..54fb4d1 100644 --- a/src/configfile.cc +++ b/src/configfile.cc @@ -84,10 +84,10 @@ static bool createConfigPath() std::string configpath = getConfigPath(); struct stat st; - if(stat(configpath.c_str(), &st) == 0) + if(stat(configpath.c_str(), &st) != 0) { DEBUG(configfile, "No configuration exists, creating directory '%s'\n", - configpath.c_str()); + configpath.c_str()); #if DG_PLATFORM == DG_PLATFORM_WINDOWS if(mkdir(configpath.c_str()) < 0) { @@ -221,7 +221,7 @@ std::string ConfigFile::readLine() { return ""; } - + std::string line; char buf[1024]; @@ -383,7 +383,8 @@ bool ConfigFile::parseLine(const std::string& line) } // If state == in_value_XXX_quoted here, the string was not terminated. - if(state != after_value && state != in_value) + // If state == before_value it means that the value is empty. + if(state != after_value && state != in_value && state != before_value) { ERR(configfile, "Malformed line: '%s'", line.c_str()); return false; diff --git a/test/configtest.cc b/test/configtest.cc index a4d5228..85a59ca 100644 --- a/test/configtest.cc +++ b/test/configtest.cc @@ -69,6 +69,7 @@ public: DGUNIT_TEST(test_configtest::loading_error_no_value); DGUNIT_TEST(test_configtest::loading_error_string_not_terminated_single); DGUNIT_TEST(test_configtest::loading_error_string_not_terminated_double); + DGUNIT_TEST(test_configtest::empty_value); } void teardown() override @@ -213,6 +214,15 @@ public: TestConfigFile cf; DGUNIT_ASSERT_EQUAL(false, cf.load()); } + + void empty_value() + { + writeFile("a:\n"); + + TestConfigFile cf; + DGUNIT_ASSERT_EQUAL(true, cf.load()); + DGUNIT_ASSERT_EQUAL(std::string(""), cf.getValue("a")); + } }; // Registers the fixture into the 'registry' -- cgit v1.2.3