Fix off-by-one error in ByteVector::find.

In case where the pattern has the same length as the bytevector, it should
degrade to A == B, not just return "not found" (e.g. A.find(A) should
return 0, not -1).


git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@735107 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
This commit is contained in:
Lukáš Lalinský 2007-11-10 22:16:56 +00:00
parent b44cee48f4
commit 41bc6f0686
2 changed files with 10 additions and 1 deletions

View File

@ -95,7 +95,7 @@ namespace TagLib {
template <class Vector>
int vectorFind(const Vector &v, const Vector &pattern, uint offset, int byteAlign)
{
if(pattern.size() > v.size() || offset >= v.size() - 1)
if(pattern.size() > v.size() || offset > v.size() - 1)
return -1;
// Let's go ahead and special case a pattern of size one since that's common

View File

@ -34,6 +34,7 @@ class TestByteVector : public CppUnit::TestFixture
CPPUNIT_TEST_SUITE(TestByteVector);
CPPUNIT_TEST(testByteVector);
CPPUNIT_TEST(testFind1);
CPPUNIT_TEST(testFind2);
CPPUNIT_TEST(testRfind1);
CPPUNIT_TEST(testRfind2);
CPPUNIT_TEST_SUITE_END();
@ -128,6 +129,14 @@ public:
CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find("SggO", 8));
}
void testFind2()
{
CPPUNIT_ASSERT_EQUAL(0, ByteVector("\x01", 1).find("\x01"));
CPPUNIT_ASSERT_EQUAL(0, ByteVector("\x01\x02", 2).find("\x01\x02"));
CPPUNIT_ASSERT_EQUAL(-1, ByteVector("\x01", 1).find("\x02"));
CPPUNIT_ASSERT_EQUAL(-1, ByteVector("\x01\x02", 2).find("\x01\x03"));
}
void testRfind1()
{
CPPUNIT_ASSERT_EQUAL(-1, ByteVector(".OggS....").rfind("OggS", 0));