diff options
author | Vasil Velichkov <vvvelichkov@gmail.com> | 2018-08-15 22:46:39 +0300 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2018-08-20 05:01:11 +0000 |
commit | b7a6a11376c75f02b827a3dbd7598ecf419f6151 (patch) | |
tree | c8ef569252d22c9b1ba554ee8cd2449172892e37 /ui/qt/sctp_graph_dialog.cpp | |
parent | aef622340967762e714b37286db9cf90385c17a2 (diff) |
Qt: fix several crashes in the SCTP Dialogs
Store the association id instead of a pointer to the volatile
"sctp_assoc_info_t" structure because it gets freed after a rescan.
Bug: 14970
Change-Id: Id8fe2dfe3549bd711fc8ddef0770b217e83c2088
Fixes: v1.11.3-rc1-604-g796bf409b0 ("Add dialogs and graphs to analyse SCTP behavior similar to the GTK version.")
Reviewed-on: https://code.wireshark.org/review/28711
Reviewed-by: Peter Wu <peter@lekensteyn.nl>
Petri-Dish: Peter Wu <peter@lekensteyn.nl>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'ui/qt/sctp_graph_dialog.cpp')
-rw-r--r-- | ui/qt/sctp_graph_dialog.cpp | 56 |
1 files changed, 35 insertions, 21 deletions
diff --git a/ui/qt/sctp_graph_dialog.cpp b/ui/qt/sctp_graph_dialog.cpp index 82bc5794b3..03201e6923 100644 --- a/ui/qt/sctp_graph_dialog.cpp +++ b/ui/qt/sctp_graph_dialog.cpp @@ -27,33 +27,34 @@ #include "ui/qt/widgets/wireshark_file_dialog.h" #include "wireshark_application.h" -SCTPGraphDialog::SCTPGraphDialog(QWidget *parent, sctp_assoc_info_t *assoc, capture_file *cf, int dir) : +SCTPGraphDialog::SCTPGraphDialog(QWidget *parent, const sctp_assoc_info_t *assoc, + capture_file *cf, int dir) : QDialog(parent), ui(new Ui::SCTPGraphDialog), - selected_assoc(assoc), cap_file_(cf), frame_num(0), direction(dir), relative(false), type(1) { + Q_ASSERT(assoc); + selected_assoc_id = assoc->assoc_id; + ui->setupUi(this); - if (!selected_assoc) { - selected_assoc = SCTPAssocAnalyseDialog::findAssocForPacket(cap_file_); - } Qt::WindowFlags flags = Qt::Window | Qt::WindowSystemMenuHint | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint | Qt::WindowCloseButtonHint; this->setWindowFlags(flags); - this->setWindowTitle(QString(tr("SCTP TSNs and SACKs over Time: %1 Port1 %2 Port2 %3")).arg(gchar_free_to_qstring(cf_get_display_name(cap_file_))).arg(selected_assoc->port1).arg(selected_assoc->port2)); - if ((direction == 1 && selected_assoc->n_array_tsn1 == 0) || (direction == 2 && selected_assoc->n_array_tsn2 == 0)) { + this->setWindowTitle(QString(tr("SCTP TSNs and SACKs over Time: %1 Port1 %2 Port2 %3")) + .arg(gchar_free_to_qstring(cf_get_display_name(cap_file_))).arg(assoc->port1).arg(assoc->port2)); + if ((direction == 1 && assoc->n_array_tsn1 == 0) || (direction == 2 && assoc->n_array_tsn2 == 0)) { QMessageBox msgBox; msgBox.setText(tr("No Data Chunks sent")); msgBox.exec(); return; } else { - drawGraph(); + drawGraph(assoc); } } @@ -62,7 +63,7 @@ SCTPGraphDialog::~SCTPGraphDialog() delete ui; } -void SCTPGraphDialog::drawNRSACKGraph() +void SCTPGraphDialog::drawNRSACKGraph(const sctp_assoc_info_t* selected_assoc) { tsn_t *sack; GList *list=NULL, *tlist; @@ -129,7 +130,7 @@ void SCTPGraphDialog::drawNRSACKGraph() } } -void SCTPGraphDialog::drawSACKGraph() +void SCTPGraphDialog::drawSACKGraph(const sctp_assoc_info_t* selected_assoc) { GList *listSACK = NULL, *tlist; guint16 gap_start=0, gap_end=0, nr, dup_nr; @@ -257,7 +258,7 @@ void SCTPGraphDialog::drawSACKGraph() } } -void SCTPGraphDialog::drawTSNGraph() +void SCTPGraphDialog::drawTSNGraph(const sctp_assoc_info_t* selected_assoc) { GList *listTSN = NULL,*tlist; tsn_t *tsn; @@ -313,8 +314,13 @@ void SCTPGraphDialog::drawTSNGraph() } } -void SCTPGraphDialog::drawGraph() +void SCTPGraphDialog::drawGraph(const sctp_assoc_info_t* selected_assoc) { + if (!selected_assoc) { + selected_assoc = SCTPAssocAnalyseDialog::findAssoc(this, selected_assoc_id); + if (!selected_assoc) return; + } + guint32 maxTSN, minTSN; if (direction == 1) { @@ -342,18 +348,23 @@ void SCTPGraphDialog::drawGraph() fn.clear(); typeStrings.clear(); switch (type) { - case 1: drawSACKGraph(); - drawNRSACKGraph(); + case 1: + drawSACKGraph(selected_assoc); + drawNRSACKGraph(selected_assoc); break; - case 2: drawTSNGraph(); + case 2: + drawTSNGraph(selected_assoc); break; - case 3: drawTSNGraph(); - drawSACKGraph(); - drawNRSACKGraph(); + case 3: + drawTSNGraph(selected_assoc); + drawSACKGraph(selected_assoc); + drawNRSACKGraph(selected_assoc); + break; + default: + drawTSNGraph(selected_assoc); + drawSACKGraph(selected_assoc); + drawNRSACKGraph(selected_assoc); break; - default: drawTSNGraph(); - drawSACKGraph(); - drawNRSACKGraph(); } // give the axes some labels: @@ -394,6 +405,9 @@ void SCTPGraphDialog::on_pushButton_3_clicked() void SCTPGraphDialog::on_pushButton_4_clicked() { + const sctp_assoc_info_t* selected_assoc = SCTPAssocAnalyseDialog::findAssoc(this, selected_assoc_id); + if (!selected_assoc) return; + ui->sctpPlot->xAxis->setRange(selected_assoc->min_secs, selected_assoc->max_secs+1); if (relative) { if (direction == 1) { |