From 9851884021588a6b99978e98cc899ae6d63c17e9 Mon Sep 17 00:00:00 2001 From: Felix Kauselmann Date: Sat, 26 May 2018 10:30:14 +0200 Subject: [PATCH 1/5] Backport two nullpointer reference fixes from QtWebApp 1.7.4 --- .../server/lib/httpserver/httprequest.cpp | 28 +++++++++++-------- .../server/lib/logging/filelogger.cpp | 2 +- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/YACReaderLibrary/server/lib/httpserver/httprequest.cpp b/YACReaderLibrary/server/lib/httpserver/httprequest.cpp index 0939bd47..efbf686b 100644 --- a/YACReaderLibrary/server/lib/httpserver/httprequest.cpp +++ b/YACReaderLibrary/server/lib/httpserver/httprequest.cpp @@ -460,16 +460,23 @@ void HttpRequest::parseMultiPartFile() else if (!fileName.isEmpty() && !fieldName.isEmpty()) { // last field was a file - #ifdef SUPERVERBOSE - qDebug("HttpRequest: finishing writing to uploaded file"); - #endif - uploadedFile->resize(uploadedFile->size()-2); - uploadedFile->flush(); - uploadedFile->seek(0); - parameters.insert(fieldName,fileName); - qDebug("HttpRequest: set parameter %s=%s",fieldName.data(),fileName.data()); - uploadedFiles.insert(fieldName,uploadedFile); - qDebug("HttpRequest: uploaded file size is %i",(int) uploadedFile->size()); + if (uploadedFile) + { + #ifdef SUPERVERBOSE + qDebug("HttpRequest: finishing writing to uploaded file"); + #endif + uploadedFile->resize(uploadedFile->size()-2); + uploadedFile->flush(); + uploadedFile->seek(0); + parameters.insert(fieldName,fileName); + qDebug("HttpRequest: set parameter %s=%s",fieldName.data(),fileName.data()); + uploadedFiles.insert(fieldName,uploadedFile); + qDebug("HttpRequest: uploaded file size is %i",(int) uploadedFile->size()); + } + else + { + qWarning("HttpRequest: format error, unexpected end of file data"); + } } if (line.contains(boundary+"--")) { @@ -546,4 +553,3 @@ QHostAddress HttpRequest::getPeerAddress() const { return peerAddress; } - diff --git a/YACReaderLibrary/server/lib/logging/filelogger.cpp b/YACReaderLibrary/server/lib/logging/filelogger.cpp index 3e027bc2..a30acd85 100644 --- a/YACReaderLibrary/server/lib/logging/filelogger.cpp +++ b/YACReaderLibrary/server/lib/logging/filelogger.cpp @@ -92,8 +92,8 @@ void FileLogger::write(const LogMessage* logMessage) // Check for success if (file->error()) { - close(); qWarning("Cannot write to log file %s: %s",qPrintable(fileName),qPrintable(file->errorString())); + close(); } } From ca3bc94f2561c1aefb00c227c2e23fe54cc5c685 Mon Sep 17 00:00:00 2001 From: Felix Kauselmann Date: Sat, 26 May 2018 10:34:25 +0200 Subject: [PATCH 2/5] Fix potential memleak caused by unused QAction pointer in SortVolumeComics --- YACReaderLibrary/comic_vine/sort_volume_comics.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/YACReaderLibrary/comic_vine/sort_volume_comics.cpp b/YACReaderLibrary/comic_vine/sort_volume_comics.cpp index c62ae6ca..45ed0bae 100644 --- a/YACReaderLibrary/comic_vine/sort_volume_comics.cpp +++ b/YACReaderLibrary/comic_vine/sort_volume_comics.cpp @@ -86,7 +86,7 @@ SortVolumeComics::SortVolumeComics(QWidget *parent) : //rows actions QAction * removeItemFromList = new QAction(tr("remove selected comics"),this); QAction * restoreAllItems = new QAction(tr("restore all removed comics"),this); - QAction * restoreItems = new QAction(tr("restore removed comics"),this); + //QAction * restoreItems = new QAction(tr("restore removed comics"),this); tableFiles->setContextMenuPolicy(Qt::ActionsContextMenu); tableFiles->addAction(removeItemFromList); @@ -95,7 +95,7 @@ SortVolumeComics::SortVolumeComics(QWidget *parent) : connect(removeItemFromList,SIGNAL(triggered()),this,SLOT(removeSelectedComics())); connect(restoreAllItems,SIGNAL(triggered()),this,SLOT(restoreAllComics())); - connect(restoreItems,SIGNAL(triggered()),this,SLOT(showRemovedComicsSelector())); + //connect(restoreItems,SIGNAL(triggered()),this,SLOT(showRemovedComicsSelector())); } void SortVolumeComics::setData(QList & comics, const QString &json, const QString &vID) From 1ccb40624ce513d0c749d45e30a5dc99c62874da Mon Sep 17 00:00:00 2001 From: Felix Kauselmann Date: Sat, 26 May 2018 11:32:59 +0200 Subject: [PATCH 3/5] Remove potential memleak in folder model code --- YACReaderLibrary/db/folder_model.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/YACReaderLibrary/db/folder_model.cpp b/YACReaderLibrary/db/folder_model.cpp index f895e765..a6e095d3 100644 --- a/YACReaderLibrary/db/folder_model.cpp +++ b/YACReaderLibrary/db/folder_model.cpp @@ -823,7 +823,13 @@ void FolderModelProxy::setupFilteredModelData(QSqlQuery &sqlquery, FolderItem *p //si el nodo es hijo de 1 y no hab�a sido previamente insertado como hijo, se a�ade como tal if(!parentPreviousInserted) + { filteredItems.value(ROOT)->appendChild(item); + } + else + { + delete item; + } } } } From f7e254753170021fd92d3e3e8b11a6399ee287f4 Mon Sep 17 00:00:00 2001 From: Felix Kauselmann Date: Sat, 26 May 2018 12:11:30 +0200 Subject: [PATCH 4/5] Options dialog: Add default case to FlowType switch case to prevent undefined behaviour (just in case) --- custom_widgets/yacreader_options_dialog.cpp | 34 +++++++++++---------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/custom_widgets/yacreader_options_dialog.cpp b/custom_widgets/yacreader_options_dialog.cpp index 8e7af105..29fa4daa 100644 --- a/custom_widgets/yacreader_options_dialog.cpp +++ b/custom_widgets/yacreader_options_dialog.cpp @@ -70,37 +70,37 @@ YACReaderOptionsDialog::YACReaderOptionsDialog(QWidget * parent) connect(gl->xRotation,SIGNAL(valueChanged(int)),this,SLOT(saveXRotation(int))); connect(gl->xRotation,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); - + connect(gl->yPosition,SIGNAL(valueChanged(int)),this,SLOT(saveYPosition(int))); connect(gl->yPosition,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); - + connect(gl->coverDistance,SIGNAL(valueChanged(int)),this,SLOT(saveCoverDistance(int))); connect(gl->coverDistance,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); - + connect(gl->centralDistance,SIGNAL(valueChanged(int)),this,SLOT(saveCentralDistance(int))); connect(gl->centralDistance,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); - + connect(gl->zoomLevel,SIGNAL(valueChanged(int)),this,SLOT(saveZoomLevel(int))); connect(gl->zoomLevel,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); - + connect(gl->yCoverOffset,SIGNAL(valueChanged(int)),this,SLOT(saveYCoverOffset(int))); connect(gl->yCoverOffset,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); - + connect(gl->zCoverOffset,SIGNAL(valueChanged(int)),this,SLOT(saveZCoverOffset(int))); connect(gl->zCoverOffset,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); - + connect(gl->coverRotation,SIGNAL(valueChanged(int)),this,SLOT(saveCoverRotation(int))); connect(gl->coverRotation,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); - + connect(gl->fadeOutDist,SIGNAL(valueChanged(int)),this,SLOT(saveFadeOutDist(int))); connect(gl->fadeOutDist,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); - + connect(gl->lightStrength,SIGNAL(valueChanged(int)),this,SLOT(saveLightStrength(int))); connect(gl->lightStrength,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); - + connect(gl->maxAngle,SIGNAL(valueChanged(int)),this,SLOT(saveMaxAngle(int))); connect(gl->maxAngle,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); - + connect(gl->performanceSlider, SIGNAL(valueChanged(int)),this,SLOT(savePerformance(int))); connect(gl->performanceSlider, SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); @@ -237,7 +237,7 @@ void YACReaderOptionsDialog::restoreOptions(QSettings * settings) sw->setVisible(true); useGL->setChecked(false); } - + if(!settings->contains(FLOW_TYPE_GL)) { @@ -253,7 +253,7 @@ void YACReaderOptionsDialog::restoreOptions(QSettings * settings) gl->vSyncCheck->setChecked(false); gl->performanceSlider->setValue(settings->value(PERFORMANCE).toInt()); - + FlowType flowType; switch(settings->value(FLOW_TYPE_GL).toInt()) { @@ -275,8 +275,10 @@ void YACReaderOptionsDialog::restoreOptions(QSettings * settings) case 5: flowType = Custom; break; + default: + flowType = CoverFlowLike; } - + if(flowType == Custom) { @@ -311,7 +313,7 @@ void YACReaderOptionsDialog::restoreOptions(QSettings * settings) gl->radionModern->setChecked(true); return; } - + if(flowType == Roulette) { setRouletteConfig(); @@ -399,7 +401,7 @@ void YACReaderOptionsDialog::setModernConfig() void YACReaderOptionsDialog::setRouletteConfig() { gl->setValues(pressetYACReaderFlowDownConfig); - + saveFlowParameters(); settings->setValue(FLOW_TYPE_GL,Roulette); From 0cc6b3bcf715e553222c93cdca760692b4dda72a Mon Sep 17 00:00:00 2001 From: Felix Kauselmann Date: Sat, 26 May 2018 12:20:53 +0200 Subject: [PATCH 5/5] SendComic: Connect finished signal to deleteLater slot BEFORE the finished signal is emitted so it is actually processed and we don't get dangling pointers. Use modern signal slot syntax so that the compiler and source check tools can verify we actually fixed the problem. --- YACReader/main_window_viewer.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/YACReader/main_window_viewer.cpp b/YACReader/main_window_viewer.cpp index 7a4f3c81..1539a589 100644 --- a/YACReader/main_window_viewer.cpp +++ b/YACReader/main_window_viewer.cpp @@ -1682,6 +1682,7 @@ void MainWindowViewer::decreasePageZoomLevel() void MainWindowViewer::sendComic() { YACReaderLocalClient * client = new YACReaderLocalClient; + connect(client, &YACReaderLocalClient::finished, client, &YACReaderLocalClient::deleteLater); currentComicDB.info.lastTimeOpened = QDateTime::currentSecsSinceEpoch(); viewer->updateComic(currentComicDB); @@ -1692,15 +1693,12 @@ void MainWindowViewer::sendComic() ComicDB & nextComic = siblingComics[currentIndex+1]; nextComic.info.hasBeenOpened = true; int retries = 1; - while(!client->sendComicInfo(libraryId,currentComicDB,nextComic.id) && retries!=0) + while(!client->sendComicInfo(libraryId, currentComicDB, nextComic.id) && retries!=0) retries--; - connect(client,SIGNAL(finished()),client,SLOT(deleteLater())); } } else { int retries = 1; - while(!client->sendComicInfo(libraryId,currentComicDB) && retries!=0) + while(!client->sendComicInfo(libraryId, currentComicDB) && retries!=0) retries--; - connect(client,SIGNAL(finished()),client,SLOT(deleteLater())); } - //delete client; }