diff --git a/taglib/mpeg/id3v2/id3v2frame.cpp b/taglib/mpeg/id3v2/id3v2frame.cpp index bee5375a..85e9f66d 100644 --- a/taglib/mpeg/id3v2/id3v2frame.cpp +++ b/taglib/mpeg/id3v2/id3v2frame.cpp @@ -193,6 +193,9 @@ void Frame::setText(const String &) ByteVector Frame::render() const { ByteVector fieldData = renderFields(); + if(fieldData.isEmpty()) + fieldData = ByteVector("\x00", 1); + d->header->setFrameSize(fieldData.size()); ByteVector headerData = d->header->render(); diff --git a/tests/test_id3v2.cpp b/tests/test_id3v2.cpp index e0d2d176..c62be280 100644 --- a/tests/test_id3v2.cpp +++ b/tests/test_id3v2.cpp @@ -92,6 +92,7 @@ class TestID3v2 : public CppUnit::TestFixture CPPUNIT_TEST(testParseTableOfContentsFrame); CPPUNIT_TEST(testRenderTableOfContentsFrame); CPPUNIT_TEST(testShrinkPadding); + CPPUNIT_TEST(testEmptyFrame); CPPUNIT_TEST_SUITE_END(); public: @@ -1039,6 +1040,35 @@ public: } } + void testEmptyFrame() + { + ScopedFileCopy copy("xing", ".mp3"); + string newname = copy.fileName(); + + { + MPEG::File f(newname.c_str()); + ID3v2::Tag *tag = f.ID3v2Tag(true); + + ID3v2::UrlLinkFrame *frame1 = new ID3v2::UrlLinkFrame( + ByteVector("WOAF\x00\x00\x00\x01\x00\x00\x00", 11)); + tag->addFrame(frame1); + + ID3v2::TextIdentificationFrame *frame2 = new ID3v2::TextIdentificationFrame("TIT2"); + frame2->setText("Title"); + tag->addFrame(frame2); + + f.save(); + } + + { + MPEG::File f(newname.c_str()); + CPPUNIT_ASSERT_EQUAL(true, f.hasID3v2Tag()); + + ID3v2::Tag *tag = f.ID3v2Tag(); + CPPUNIT_ASSERT_EQUAL(String("Title"), tag->title()); + } + } + }; CPPUNIT_TEST_SUITE_REGISTRATION(TestID3v2);