diff --git a/src/core/desktopfile/desktopfilereader.cpp b/src/core/desktopfile/desktopfilereader.cpp index 110b107..3c33106 100644 --- a/src/core/desktopfile/desktopfilereader.cpp +++ b/src/core/desktopfile/desktopfilereader.cpp @@ -78,9 +78,13 @@ namespace linuxdeploy { if (currentSectionName.empty()) throw ParseError("No section in desktop file"); + auto delimiterPos = line.find('='); + if (delimiterPos == std::string::npos) + throw ParseError("No = key/value delimiter found"); + // this line should be a normal key-value pair - std::string key = line.substr(0, line.find('=')); - std::string value = line.substr(line.find('=') + 1, line.size()); + std::string key = line.substr(0, delimiterPos); + std::string value = line.substr(delimiterPos + 1, line.size()); // we can strip away any sort of leading or trailing whitespace safely linuxdeploy::util::trim(key); diff --git a/tests/core/test_desktopfilereader.cpp b/tests/core/test_desktopfilereader.cpp index 7645d9a..cad2cc2 100644 --- a/tests/core/test_desktopfilereader.cpp +++ b/tests/core/test_desktopfilereader.cpp @@ -261,3 +261,22 @@ TEST_F(DesktopFileReaderFixture, testReadBrokenSectionHeaderTooManyOpeningBracke ASSERT_THROW(DesktopFileReader reader(ins), ParseError); } } + +TEST_F(DesktopFileReaderFixture, testReadBrokenSectionMissingOpeningBracket) { + { + std::stringstream ins; + ins << "Desktop Entry]" << std::endl + << "test=test" << std::endl; + ASSERT_THROW(DesktopFileReader reader(ins), ParseError); + } + + // also test for brokenness in a later section, as the first section is normally treated specially + { + std::stringstream ins; + ins << "[Desktop Entry]" << std::endl + << "test=test" << std::endl + << "Another Section]" << std::endl; + + ASSERT_THROW(DesktopFileReader reader(ins), ParseError); + } +}