File Dont-crash-if-initializeVideo-fails.patch of Package ffmpegthumbs4
From b8223de8e65de6de08f2e29a398f0922fa282bbb Mon Sep 17 00:00:00 2001
From: Fabian Vogt <fabian@ritter-vogt.de>
Date: Sat, 3 Nov 2018 11:41:56 +0100
Subject: [PATCH] Don't crash if initializeVideo fails
Summary:
If avcodec_find_decoder returns NULL, a warning is printed and then NULL is
dereferenced later...
Test Plan:
A user crashed thumbnail.so reproducably with a specific file.
Doesn't anymore with this patch applied.
Reviewers: broulik
Reviewed By: broulik
Differential Revision: https://phabricator.kde.org/D16631
---
ffmpegthumbnailer/moviedecoder.cpp | 14 ++++++++++----
ffmpegthumbnailer/moviedecoder.h | 2 +-
2 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/ffmpegthumbnailer/moviedecoder.cpp b/ffmpegthumbnailer/moviedecoder.cpp
index 6d1a79c..207e36b 100644
--- a/ffmpegthumbnailer/moviedecoder.cpp
+++ b/ffmpegthumbnailer/moviedecoder.cpp
@@ -73,7 +73,10 @@ void MovieDecoder::initialize(const QString& filename)
return;
}
- initializeVideo();
+ if (!initializeVideo()) {
+ // It already printed a message
+ return;
+ }
m_pFrame = av_frame_alloc();
if (m_pFrame) {
@@ -126,7 +129,7 @@ QString MovieDecoder::getCodec()
return codecName;
}
-void MovieDecoder::initializeVideo()
+bool MovieDecoder::initializeVideo()
{
for (unsigned int i = 0; i < m_pFormatContext->nb_streams; i++) {
if (m_pFormatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
@@ -138,7 +141,7 @@ void MovieDecoder::initializeVideo()
if (m_VideoStream == -1) {
kDebug() << "Could not find video stream";
- return;
+ return false;
}
m_pVideoCodecContext = m_pFormatContext->streams[m_VideoStream]->codec;
@@ -148,14 +151,17 @@ void MovieDecoder::initializeVideo()
// set to NULL, otherwise avcodec_close(m_pVideoCodecContext) crashes
m_pVideoCodecContext = NULL;
kDebug() << "Video Codec not found";
- return;
+ return false;
}
m_pVideoCodecContext->workaround_bugs = 1;
if (avcodec_open2(m_pVideoCodecContext, m_pVideoCodec, 0) < 0) {
kDebug() << "Could not open video codec";
+ return false;
}
+
+ return true;
}
int MovieDecoder::getWidth()
diff --git a/ffmpegthumbnailer/moviedecoder.h b/ffmpegthumbnailer/moviedecoder.h
index 060c02e..eadc8e2 100644
--- a/ffmpegthumbnailer/moviedecoder.h
+++ b/ffmpegthumbnailer/moviedecoder.h
@@ -51,7 +51,7 @@ public:
bool getInitialized();
private:
- void initializeVideo();
+ bool initializeVideo();
bool decodeVideoPacket();
bool getVideoPacket();
--
GitLab