diff --git a/taglib/toolkit/tbytevector.cpp b/taglib/toolkit/tbytevector.cpp index ce47fbb8..631acc87 100644 --- a/taglib/toolkit/tbytevector.cpp +++ b/taglib/toolkit/tbytevector.cpp @@ -601,11 +601,11 @@ bool ByteVector::containsAt(const ByteVector &pattern, uint offset, uint pattern patternLength = pattern.size(); // do some sanity checking -- all of these things are needed for the search to be valid - - if(offset + patternLength > size() || patternOffset >= pattern.size() || patternLength == 0) + const uint compareLength = patternLength - patternOffset; + if(offset + compareLength > size() || patternOffset >= pattern.size() || patternLength == 0) return false; - return (::memcmp(data() + offset, pattern.data() + patternOffset, patternLength - patternOffset) == 0); + return (::memcmp(data() + offset, pattern.data() + patternOffset, compareLength) == 0); } bool ByteVector::startsWith(const ByteVector &pattern) const diff --git a/tests/test_bytevector.cpp b/tests/test_bytevector.cpp index dd433456..9efd23af 100644 --- a/tests/test_bytevector.cpp +++ b/tests/test_bytevector.cpp @@ -112,12 +112,17 @@ public: ByteVector s2("f"); CPPUNIT_ASSERT(ByteVectorList::split(s2, " ").size() == 1); - CPPUNIT_ASSERT(ByteVector().size() == 0); CPPUNIT_ASSERT(ByteVector("asdf").clear().size() == 0); CPPUNIT_ASSERT(ByteVector("asdf").clear() == ByteVector()); - } + ByteVector i("blah blah"); + ByteVector j("blah"); + CPPUNIT_ASSERT(i.containsAt(j, 5, 0)); + CPPUNIT_ASSERT(i.containsAt(j, 6, 1)); + CPPUNIT_ASSERT(i.containsAt(j, 6, 1, 3)); + } + void testFind1() { CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find("SggO"));