summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorToni Uhlig <matzeton@googlemail.com>2023-07-30 21:44:51 +0200
committerToni Uhlig <matzeton@googlemail.com>2023-07-30 21:44:51 +0200
commit2b66205a05726697803ac6331aa083cb0fc26f6f (patch)
treef2bfd64a27dacc0d0f75c457a48764ee2c7a7900
parent2335b5f8bb0bd67b81937d56b6b1db4478203dac (diff)
Fixed memory issues.
Signed-off-by: Toni Uhlig <matzeton@googlemail.com>
-rw-r--r--mainwindow.cpp24
-rw-r--r--pcapplusplus.cpp14
-rw-r--r--pcapplusplus.h5
3 files changed, 31 insertions, 12 deletions
diff --git a/mainwindow.cpp b/mainwindow.cpp
index ae8a003..4b3dd21 100644
--- a/mainwindow.cpp
+++ b/mainwindow.cpp
@@ -15,15 +15,17 @@ MainWindow::MainWindow(QWidget *parent)
ui->setupUi(this);
ui->gridLayout->addWidget(&myHexEdit.editor);
- const auto& enableButtons = [](MainWindow *mainwindow, bool enable, bool ui_edit_only = false) {
- if (!ui_edit_only)
- mainwindow->ui->actionSave->setEnabled(enable);
+ const auto& enableMenuButtons = [](MainWindow *mainwindow, bool enable) {
+ mainwindow->ui->actionSave->setEnabled(enable);
+ };
+ const auto& enableHexEditButtons = [](MainWindow *mainwindow, bool enable) {
mainwindow->myHexEdit.prependBytes.setEnabled(enable);
mainwindow->myHexEdit.appendBytes.setEnabled(enable);
mainwindow->myHexEdit.deleteBytes.setEnabled(enable);
mainwindow->myHexEdit.deleteSelection.setEnabled(enable);
};
- enableButtons(this, false);
+ enableMenuButtons(this, false);
+ enableHexEditButtons(this, false);
myHexEdit.editor.setContextMenuPolicy(Qt::CustomContextMenu);
myHexEdit.prependBytes.setText("Prepend byte(s)..");
@@ -53,6 +55,7 @@ MainWindow::MainWindow(QWidget *parent)
if (!new_bytes)
break;
memset(new_bytes, 0, size);
+ rawPacket->reallocateData(rawPacket->getRawDataLen() + size);
rawPacket->insertData(offset, new_bytes, size);
myHexEdit.editor.setData(QByteArray::fromRawData(reinterpret_cast<const char *>(rawPacket->getRawData()), rawPacket->getRawDataLen()));
delete[] new_bytes;
@@ -107,6 +110,9 @@ MainWindow::MainWindow(QWidget *parent)
ui->lineEdit->clear();
ui->tableWidget->clear();
ui->tableWidget->setRowCount(0);
+ myHexEdit.editor.data().clear();
+ enableMenuButtons(this, true);
+ enableHexEditButtons(this, false);
ppp = new PcapPlusPlus(fileName.toStdString());
if (ppp) emit processPcap();
}
@@ -132,9 +138,10 @@ MainWindow::MainWindow(QWidget *parent)
connect(ui->actionSave, &QAction::triggered, this, [&](bool){
if (ppp) {
- QString fileName = QFileDialog::getSaveFileName(this, tr("Save PCAP File"), "", tr("PCAP Files (*.pcap)"));
+ QString selectedFilter;
+ QString fileName = QFileDialog::getSaveFileName(this, tr("Save PCAP File"), "", tr("PCAP Files (*.pcap)"), &selectedFilter);
if (fileName.length() > 0) {
- pcpp::PcapFileWriterDevice pcapWriter(fileName.toStdString(), pcpp::LINKTYPE_ETHERNET);
+ pcpp::PcapFileWriterDevice pcapWriter(fileName.toStdString() + ".pcap", ppp->getLinkLayer());
if (!pcapWriter.open())
throw std::runtime_error("Could not open file " + fileName.toStdString() + " for writing.");
{
@@ -225,7 +232,7 @@ MainWindow::MainWindow(QWidget *parent)
});
connect(ui->tableWidget, &QTableWidget::itemSelectionChanged, this, [&]() {
- enableButtons(this, ui->tableWidget->selectedItems().size() > 0, true);
+ enableHexEditButtons(this, ui->tableWidget->selectedItems().size() > 0);
if (ui->tableWidget->selectedItems().size() == 0 && myHexEdit.editor.data().size() > 0)
myHexEdit.editor.setData(QByteArray());
});
@@ -238,6 +245,7 @@ MainWindow::MainWindow(QWidget *parent)
auto cursorData = myHexEdit.editor.dataAt(cursorPos, 1);
if (myHexEdit.editor.cursorPosition() % 2 != 0 && myHexEdit.editor.cursorPosition() / 2 == myHexEdit.editor.data().size() - 1) {
const uint8_t new_byte = 0x00;
+ rawPacket->reallocateData(rawPacket->getRawDataLen() + 1);
rawPacket->insertData(rawPacket->getRawDataLen(), &new_byte, sizeof(new_byte));
myHexEdit.editor.setData(QByteArray::fromRawData(reinterpret_cast<const char *>(rawPacket->getRawData()), rawPacket->getRawDataLen()));
myHexEdit.editor.setCursorPosition(cursorPos * 2 + 1);
@@ -256,7 +264,7 @@ MainWindow::~MainWindow()
pcpp::RawPacket* MainWindow::currentSelectedPacket()
{
const auto &selected = ui->tableWidget->selectedItems();
- if (selected.empty())
+ if (!ppp || selected.empty())
return nullptr;
return &ppp->getRawPacket(selected.last()->row());
diff --git a/pcapplusplus.cpp b/pcapplusplus.cpp
index d78a2eb..743e845 100644
--- a/pcapplusplus.cpp
+++ b/pcapplusplus.cpp
@@ -77,16 +77,26 @@ bool PcapPlusPlus::processPacket(pcpp::Packet & packet)
return false;
}
-pcpp::RawPacket &PcapPlusPlus::getRawPacket(size_t index)
+pcpp::RawPacket& PcapPlusPlus::getRawPacket(size_t index)
{
return rawPackets.at(index);
}
-pcpp::Packet &PcapPlusPlus::getParsedPacket(size_t index)
+pcpp::Packet& PcapPlusPlus::getParsedPacket(size_t index)
{
return parsedPackets.at(index);
}
+pcpp::LinkLayerType PcapPlusPlus::getLinkLayer()
+{
+ const auto& pcap_file_reader = dynamic_cast<pcpp::PcapFileReaderDevice*>(reader);
+
+ if (pcap_file_reader)
+ return pcap_file_reader->getLinkLayerType();
+ else
+ return pcpp::LinkLayerType::LINKTYPE_NULL;
+}
+
std::vector<pcpp::RawPacket>::iterator PcapPlusPlus::rawPacketsBegin()
{
return rawPackets.begin();
diff --git a/pcapplusplus.h b/pcapplusplus.h
index 71735d3..81d1b9d 100644
--- a/pcapplusplus.h
+++ b/pcapplusplus.h
@@ -14,8 +14,9 @@ public:
void closePcap();
bool setFilter(QString filter);
bool processPacket(pcpp::Packet & packet);
- pcpp::RawPacket &getRawPacket(size_t index);
- pcpp::Packet &getParsedPacket(size_t index);
+ pcpp::RawPacket& getRawPacket(size_t index);
+ pcpp::Packet& getParsedPacket(size_t index);
+ pcpp::LinkLayerType getLinkLayer();
std::vector<pcpp::RawPacket>::iterator rawPacketsBegin();
std::vector<pcpp::RawPacket>::iterator rawPacketsEnd();
std::vector<pcpp::Packet>::iterator parsedPacketsBegin();