diff options
author | Toni Uhlig <matzeton@googlemail.com> | 2023-07-30 21:44:51 +0200 |
---|---|---|
committer | Toni Uhlig <matzeton@googlemail.com> | 2023-07-30 21:44:51 +0200 |
commit | 2b66205a05726697803ac6331aa083cb0fc26f6f (patch) | |
tree | f2bfd64a27dacc0d0f75c457a48764ee2c7a7900 | |
parent | 2335b5f8bb0bd67b81937d56b6b1db4478203dac (diff) |
Fixed memory issues.
Signed-off-by: Toni Uhlig <matzeton@googlemail.com>
-rw-r--r-- | mainwindow.cpp | 24 | ||||
-rw-r--r-- | pcapplusplus.cpp | 14 | ||||
-rw-r--r-- | pcapplusplus.h | 5 |
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(); |