diff options
| -rw-r--r-- | apt-pkg/deb/deblistparser.cc | 2 | ||||
| -rw-r--r-- | test/libapt/parsedepends_test.cc | 33 |
2 files changed, 34 insertions, 1 deletions
diff --git a/apt-pkg/deb/deblistparser.cc b/apt-pkg/deb/deblistparser.cc index 46c362952..071189b04 100644 --- a/apt-pkg/deb/deblistparser.cc +++ b/apt-pkg/deb/deblistparser.cc @@ -608,7 +608,7 @@ const char *debListParser::ParseDepends(const char *Start, const char *Stop, { // Skip the '(' for (I++; I != Stop && isspace_ascii(*I) != 0 ; I++); - if (I + 3 >= Stop) + if (I + 3 > Stop) return 0; I = ConvertRelation(I,Op); diff --git a/test/libapt/parsedepends_test.cc b/test/libapt/parsedepends_test.cc index f641c8c1c..454908ef7 100644 --- a/test/libapt/parsedepends_test.cc +++ b/test/libapt/parsedepends_test.cc @@ -278,3 +278,36 @@ test: if (runner < 8) goto test; // this is the prove: tests are really evil ;) } + +TEST(ParseDependsTest, SpaceHate) +{ + auto const *const Depends = "no(=1), some(<<1),some (<<1),some( <<1),some(<< 1),some(<<1 ),some(<<1) ,last (=1)"; + const char* const End = Depends + strlen(Depends); + + const char* Start = Depends; + std::string Package; + std::string Version; + unsigned int Op = 29; + + Start = debListParser::ParseDepends(Start, End, Package, Version, Op); + EXPECT_NE(nullptr, Start); + EXPECT_EQ("no", Package); + EXPECT_EQ("1", Version); + EXPECT_EQ(pkgCache::Dep::Equals, Op); + + for (int i = 0; i < 6; ++i) + { + SCOPED_TRACE(i); + Start = debListParser::ParseDepends(Start, End, Package, Version, Op); + EXPECT_NE(nullptr, Start); + EXPECT_EQ("some", Package); + EXPECT_EQ("1", Version); + EXPECT_EQ(pkgCache::Dep::Less, Op); + } + + Start = debListParser::ParseDepends(Start, End, Package, Version, Op); + EXPECT_EQ(End, Start); + EXPECT_EQ("last", Package); + EXPECT_EQ("1", Version); + EXPECT_EQ(pkgCache::Dep::Equals, Op); +} |
