isLastBlock = (header[0] & 0x80) != 0;
length = header.toUInt(1U, 3U);
- ByteVector data = readBlock(length);
- if(data.size() != length || length == 0) {
- debug("FLAC::File::scan() -- FLAC stream corrupted");
+ if(length == 0 && blockType != MetadataBlock::Padding) {
+ debug("FLAC::File::scan() -- Zero-sized metadaba block found");
+ setValid(false);
+ return;
+ }
+
+ const ByteVector data = readBlock(length);
+ if(data.size() != length) {
+ debug("FLAC::File::scan() -- Failed to read a metadata block");
setValid(false);
return;
}
block = picture;
}
else {
- debug("FLAC::File::scan() -- invalid picture found, discarting");
+ debug("FLAC::File::scan() -- invalid picture found, discarding");
delete picture;
}
}
CPPUNIT_TEST(testSaveMultipleValues);
CPPUNIT_TEST(testDict);
CPPUNIT_TEST(testInvalid);
+ CPPUNIT_TEST(testZeroSizedPadding);
CPPUNIT_TEST_SUITE_END();
public:
CPPUNIT_ASSERT_EQUAL(TagLib::uint(0), f.properties().size());
}
+ void testZeroSizedPadding()
+ {
+ ScopedFileCopy copy("zero-sized-padding", ".flac");
+
+ FLAC::File f(copy.fileName().c_str());
+ CPPUNIT_ASSERT(f.isValid());
+ }
+
};
CPPUNIT_TEST_SUITE_REGISTRATION(TestFLAC);