aboutsummaryrefslogtreecommitdiffstats
path: root/ui/qt/sctp_graph_dialog.cpp
diff options
context:
space:
mode:
authorVasil Velichkov <vvvelichkov@gmail.com>2018-08-15 22:46:39 +0300
committerAnders Broman <a.broman58@gmail.com>2018-08-20 05:01:11 +0000
commitb7a6a11376c75f02b827a3dbd7598ecf419f6151 (patch)
treec8ef569252d22c9b1ba554ee8cd2449172892e37 /ui/qt/sctp_graph_dialog.cpp
parentaef622340967762e714b37286db9cf90385c17a2 (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.cpp56
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) {