summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'kde-frameworks/kfilemetadata/files/kfilemetadata-5.26.0-epubextractor-segfault.patch')
-rw-r--r--kde-frameworks/kfilemetadata/files/kfilemetadata-5.26.0-epubextractor-segfault.patch149
1 files changed, 149 insertions, 0 deletions
diff --git a/kde-frameworks/kfilemetadata/files/kfilemetadata-5.26.0-epubextractor-segfault.patch b/kde-frameworks/kfilemetadata/files/kfilemetadata-5.26.0-epubextractor-segfault.patch
new file mode 100644
index 000000000000..b738d1ae09ac
--- /dev/null
+++ b/kde-frameworks/kfilemetadata/files/kfilemetadata-5.26.0-epubextractor-segfault.patch
@@ -0,0 +1,149 @@
+From: Christoph Cullmann <cullmann@kde.org>
+Date: Sun, 11 Sep 2016 17:14:51 +0000
+Subject: Improve epub extractor, less segfaults
+X-Git-Url: http://quickgit.kde.org/?p=kfilemetadata.git&a=commitdiff&h=47f6e57b2fa3768feb4f1f4a2cd3ce46660d90f2
+---
+Improve epub extractor, less segfaults
+
+Improve epub extractor:
+
+1) check for more nullpointers (e.g. data can be null for some fields, iterators, ...)
+2) actually close the epub file again at all
+3) iterator seems to handle clink as stated in docs, fix double free
+
+e.g. see bug 361727
+could be the double freed clink in the last iterator
+
+BUG: 361727
+REVIEW: 128888
+---
+
+
+--- a/src/extractors/epubextractor.cpp
++++ b/src/extractors/epubextractor.cpp
+@@ -1,5 +1,6 @@
+ /*
+ Copyright (C) 2013 Vishesh Handa <me@vhanda.in>
++ Copyright (C) 2016 Christoph Cullmann <cullmann@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+@@ -46,11 +47,14 @@
+ QString fetchMetadata(struct epub* e, const epub_metadata& type)
+ {
+ int size = 0;
+-
+ unsigned char** data = epub_get_metadata(e, type, &size);
+ if (data) {
+ QStringList strList;
+ for (int i = 0; i < size; i++) {
++ // skip nullptr entries, can happen for broken xml files
++ if (!data[i])
++ continue;
++
+ strList << QString::fromUtf8((char*)data[i]);
+ free(data[i]);
+ }
+@@ -65,7 +69,8 @@
+
+ void EPubExtractor::extract(ExtractionResult* result)
+ {
+- struct epub* ePubDoc = epub_open(result->inputUrl().toUtf8().constData(), 1);
++ // open epub, return on exit, file will be closed again at end of function
++ auto ePubDoc = epub_open(result->inputUrl().toUtf8().constData(), 1);
+ if (!ePubDoc) {
+ qWarning() << "Invalid document";
+ return;
+@@ -138,49 +143,49 @@
+ //
+ // Plain Text
+ //
+- if (!(result->inputFlags() & ExtractionResult::ExtractPlainText)) {
+- return;
++ if (result->inputFlags() & ExtractionResult::ExtractPlainText) {
++ if (auto iter = epub_get_iterator(ePubDoc, EITERATOR_SPINE, 0)) {
++ do {
++ char* curr = epub_it_get_curr(iter);
++ if (!curr)
++ continue;
++
++ QString html = QString::fromUtf8(curr);
++ html.remove(QRegularExpression(QStringLiteral("<[^>]*>")));
++ result->append(html);
++ } while (epub_it_get_next(iter));
++
++ epub_free_iterator(iter);
++ }
++
++ auto tit = epub_get_titerator(ePubDoc, TITERATOR_NAVMAP, 0);
++ if (!tit) {
++ tit = epub_get_titerator(ePubDoc, TITERATOR_GUIDE, 0);
++ }
++ if (tit) {
++ if (epub_tit_curr_valid(tit)) {
++ do {
++ // get link, iterator handles freeing of it
++ char* clink = epub_tit_get_curr_link(tit);
++
++ // epub_get_data returns -1 on failure
++ char* data = nullptr;
++ const int size = epub_get_data(ePubDoc, clink, &data);
++ if (size >= 0 && data) {
++ QString html = QString::fromUtf8(data, size);
++ // strip html tags
++ html.remove(QRegularExpression(QStringLiteral("<[^>]*>")));
++
++ result->append(html);
++ free(data);
++ }
++ } while (epub_tit_next(tit));
++ }
++ epub_free_titerator(tit);
++ }
+ }
+
+- struct eiterator* iter = epub_get_iterator(ePubDoc, EITERATOR_SPINE, 0);
+- do {
+- char* curr = epub_it_get_curr(iter);
+- if (!curr)
+- continue;
+- QString html = QString::fromUtf8(curr);
+- html.remove(QRegularExpression(QStringLiteral("<[^>]*>")));
+-
+- result->append(html);
+- } while (epub_it_get_next(iter));
+-
+- epub_free_iterator(iter);
+-
+- struct titerator* tit;
+-
+- tit = epub_get_titerator(ePubDoc, TITERATOR_NAVMAP, 0);
+- if (!tit) {
+- tit = epub_get_titerator(ePubDoc, TITERATOR_GUIDE, 0);
+- }
+-
+- if (epub_tit_curr_valid(tit)) {
+- do {
+- char* clink = epub_tit_get_curr_link(tit);
+-
+- char* data;
+- int size = epub_get_data(ePubDoc, clink, &data);
+- free(clink);
+-
+- // epub_get_data returns -1 on failure
+- if (size > 0 && data) {
+- QString html = QString::fromUtf8(data, size);
+- // strip html tags
+- html.remove(QRegularExpression(QStringLiteral("<[^>]*>")));
+-
+- result->append(html);
+- free(data);
+- }
+- } while (epub_tit_next(tit));
+- }
+- epub_free_titerator(tit);
++ // close epub file again
++ epub_close(ePubDoc);
+ }
+
+