From 8104c4133248b93fa45a8e95c51c7ff734406605 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Fri, 10 Aug 2012 11:18:37 +0300 Subject: [PATCH] Fix possible crash when adding a tracker to a magnet torrent without metadata (Closes #1034254) --- src/properties/propertieswidget.cpp | 4 ++- src/properties/trackerlist.cpp | 41 ++++++++++++++++------------- src/sessionapplication.cpp | 11 ++++++++ src/sessionapplication.h | 3 +++ 4 files changed, 39 insertions(+), 20 deletions(-) diff --git a/src/properties/propertieswidget.cpp b/src/properties/propertieswidget.cpp index 289a9b1e6..5eda693c9 100644 --- a/src/properties/propertieswidget.cpp +++ b/src/properties/propertieswidget.cpp @@ -396,7 +396,9 @@ void PropertiesWidget::loadDynamicData() { filesList->setUpdatesEnabled(true); } } - } catch(invalid_handle e) {} + } catch(const invalid_handle& e) { + qWarning() << "Caught exception in PropertiesWidget::loadDynamicData(): " << e.what(); + } } void PropertiesWidget::loadUrlSeeds() { diff --git a/src/properties/trackerlist.cpp b/src/properties/trackerlist.cpp index 4fb472d67..f7f63be37 100644 --- a/src/properties/trackerlist.cpp +++ b/src/properties/trackerlist.cpp @@ -186,6 +186,28 @@ void TrackerList::clear() { } void TrackerList::loadStickyItems(const QTorrentHandle &h) { + // load DHT information + if (QBtSession::instance()->isDHTEnabled() && (!h.has_metadata() || !h.priv())) { + dht_item->setText(COL_STATUS, tr("Working")); + } else { + dht_item->setText(COL_STATUS, tr("Disabled")); + } + if (h.has_metadata() && h.priv()) { + dht_item->setText(COL_MSG, tr("This torrent is private")); + } + + // Load PeX Information + if (QBtSession::instance()->isPexEnabled()) + pex_item->setText(COL_STATUS, tr("Working")); + else + pex_item->setText(COL_STATUS, tr("Disabled")); + + // Load LSD Information + if (QBtSession::instance()->isLSDEnabled()) + lsd_item->setText(COL_STATUS, tr("Working")); + else + lsd_item->setText(COL_STATUS, tr("Disabled")); + // XXX: libtorrent should provide this info... // Count peers from DHT, LSD, PeX uint nb_dht = 0, nb_lsd = 0, nb_pex = 0; @@ -201,27 +223,8 @@ void TrackerList::loadStickyItems(const QTorrentHandle &h) { if (it->source & peer_info::pex) ++nb_pex; } - // load DHT information - if (QBtSession::instance()->isDHTEnabled() && !h.priv()) { - dht_item->setText(COL_STATUS, tr("Working")); - } else { - dht_item->setText(COL_STATUS, tr("Disabled")); - } dht_item->setText(COL_PEERS, QString::number(nb_dht)); - if (h.has_metadata() && h.priv()) { - dht_item->setText(COL_MSG, tr("This torrent is private")); - } - // Load PeX Information - if (QBtSession::instance()->isPexEnabled()) - pex_item->setText(COL_STATUS, tr("Working")); - else - pex_item->setText(COL_STATUS, tr("Disabled")); pex_item->setText(COL_PEERS, QString::number(nb_pex)); - // Load LSD Information - if (QBtSession::instance()->isLSDEnabled()) - lsd_item->setText(COL_STATUS, tr("Working")); - else - lsd_item->setText(COL_STATUS, tr("Disabled")); lsd_item->setText(COL_PEERS, QString::number(nb_lsd)); } diff --git a/src/sessionapplication.cpp b/src/sessionapplication.cpp index 4a8b264b6..8a06abedf 100644 --- a/src/sessionapplication.cpp +++ b/src/sessionapplication.cpp @@ -28,6 +28,7 @@ * Contact : chris@qbittorrent.org */ +#include #include "sessionapplication.h" SessionApplication::SessionApplication(const QString &id, int &argc, char **argv) : @@ -42,3 +43,13 @@ void SessionApplication::commitData(QSessionManager & manager) { Q_UNUSED(manager); emit sessionIsShuttingDown(); } + +bool SessionApplication::notify(QObject* receiver, QEvent* event) { + try { + return QApplication::notify(receiver, event); + } catch(const std::exception& e) { + qCritical() << "Exception thrown:" << e.what() << ", receiver: " << receiver->objectName(); + receiver->dumpObjectInfo(); + } + return false; +} diff --git a/src/sessionapplication.h b/src/sessionapplication.h index d3ce6866b..a7bfbf6fd 100644 --- a/src/sessionapplication.h +++ b/src/sessionapplication.h @@ -54,6 +54,9 @@ public: SessionApplication(const QString &id, int &argc, char **argv); void commitData(QSessionManager & manager); +protected: + virtual bool notify(QObject* receiver, QEvent* event); + signals: void sessionIsShuttingDown(); };