1
0
mirror of https://github.com/dguglielmi/sunny-overlay.git synced 2025-12-06 09:32:37 +01:00
Files
sunny-overlay/media-sound/mixxx/files/mixxx-2.1.0-fix-crash-when-importing-id3v2-apic-frames.patch

85 lines
3.6 KiB
Diff

From 8b408749a1efb7a9dba5bed6fec8a2af1023589c Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Sat, 2 Jun 2018 17:23:57 +0200
Subject: [PATCH] Fix crash when importing ID3v2 APIC frames with unexpected
type
---
src/track/trackmetadatataglib.cpp | 49 ++++++++++++++++++++++++++-------------
1 file changed, 33 insertions(+), 16 deletions(-)
diff --git a/src/track/trackmetadatataglib.cpp b/src/track/trackmetadatataglib.cpp
index 2615ae5bb6..ebbf120946 100644
--- a/src/track/trackmetadatataglib.cpp
+++ b/src/track/trackmetadatataglib.cpp
@@ -876,6 +876,23 @@ QImage importCoverImageFromVorbisCommentPictureList(
return QImage();
}
+template<typename T>
+const T* downcastID3v2Frame(TagLib::ID3v2::Frame* frame) {
+ DEBUG_ASSERT(frame);
+ // We need to use a safe dynamic_cast at runtime instead of an unsafe
+ // static_cast at compile time to detect unexpected frame subtypes!
+ // See also: https://bugs.launchpad.net/mixxx/+bug/1774790
+ const T* downcastFrame = dynamic_cast<T*>(frame);
+ VERIFY_OR_DEBUG_ASSERT(downcastFrame) {
+ // This should only happen when reading corrupt or malformed files
+ kLogger.warning()
+ << "Unexpected ID3v2"
+ << frame->frameID().data()
+ << "frame type";
+ }
+ return downcastFrame;
+}
+
void importCoverImageFromID3v2Tag(QImage* pCoverArt, const TagLib::ID3v2::Tag& tag) {
if (!pCoverArt) {
return; // nothing to do
@@ -891,10 +908,9 @@ void importCoverImageFromID3v2Tag(QImage* pCoverArt, const TagLib::ID3v2::Tag& t
const TagLib::ID3v2::FrameList pFrames = iterAPIC->second;
for (const auto coverArtType: kPreferredID3v2PictureTypes) {
for (const auto pFrame: pFrames) {
- const TagLib::ID3v2::AttachedPictureFrame* pApicFrame =
- static_cast<const TagLib::ID3v2::AttachedPictureFrame*>(pFrame);
- DEBUG_ASSERT(pApicFrame); // trust TagLib
- if (pApicFrame->type() == coverArtType) {
+ const auto* pApicFrame =
+ downcastID3v2Frame<TagLib::ID3v2::AttachedPictureFrame>(pFrame);
+ if (pApicFrame && (pApicFrame->type() == coverArtType)) {
QImage image(loadImageFromID3v2PictureFrame(*pApicFrame));
if (image.isNull()) {
kLogger.warning()
@@ -911,18 +927,19 @@ void importCoverImageFromID3v2Tag(QImage* pCoverArt, const TagLib::ID3v2::Tag& t
// Fallback: No best match -> Simply select the 1st loadable image
for (const auto pFrame: pFrames) {
- const TagLib::ID3v2::AttachedPictureFrame* pApicFrame =
- static_cast<const TagLib::ID3v2::AttachedPictureFrame*>(pFrame);
- DEBUG_ASSERT(pApicFrame); // trust TagLib
- const QImage image(loadImageFromID3v2PictureFrame(*pApicFrame));
- if (image.isNull()) {
- kLogger.warning()
- << "Failed to load image from ID3v2 APIC frame of type"
- << pApicFrame->type();
- continue;
- } else {
- *pCoverArt = image;
- return; // success
+ const auto* pApicFrame =
+ downcastID3v2Frame<TagLib::ID3v2::AttachedPictureFrame>(pFrame);
+ if (pApicFrame) {
+ const QImage image(loadImageFromID3v2PictureFrame(*pApicFrame));
+ if (image.isNull()) {
+ kLogger.warning()
+ << "Failed to load image from ID3v2 APIC frame of type"
+ << pApicFrame->type();
+ continue;
+ } else {
+ *pCoverArt = image;
+ return; // success
+ }
}
}
}