Qt: make "Save As" in Follow Streams usable

For formats other than "Raw" and "UTF-8", the written file does not
match the actual stream data. It would be duplicated in strange ways.
Executing the "Save As" action twice while the dialog is open would also
write two different files (huh?).

As a quick fix, just replace the strange save logic by writing the text
field contents. A functional difference is that previously it would
write data while parsing the "follow data" list, now it uses the text
field contents. That data will now be truncated after 500 MB.

Bug: 14933
Change-Id: I498676389d0da3ac070346d6903bd2e6b0fc7674
Fixes: v1.11.0-rc1-2538-g80f9326b2f ("Add TCP/UDP/SSL Follow feature to QtShark")
Reviewed-on: https://code.wireshark.org/review/28663
Petri-Dish: Peter Wu <peter@lekensteyn.nl>
Tested-by: Petri Dish Buildbot
Reviewed-by: Peter Wu <peter@lekensteyn.nl>
This commit is contained in:
Peter Wu 2018-07-10 00:33:24 +02:00
parent ec22bcc0ee
commit 16953695d7
2 changed files with 24 additions and 54 deletions

View File

@ -53,6 +53,8 @@
// - Instead of calling QMessageBox, display the error message in the text
// box and disable the appropriate controls.
// - Add a progress bar and connect captureCaptureUpdateContinue to it
// - User's Guide documents the "Raw" type as "same as ASCII, but saving binary
// data". However it currently displays hex-encoded data.
// Matches SplashOverlay.
static int info_update_freq_ = 100;
@ -72,7 +74,6 @@ FollowStreamDialog::FollowStreamDialog(QWidget &parent, CaptureFile &cf, follow_
last_packet_(0),
last_from_server_(0),
turns_(0),
save_as_(false),
use_regex_find_(false),
terminating_(false)
{
@ -267,28 +268,26 @@ void FollowStreamDialog::findText(bool go_back)
void FollowStreamDialog::saveAs()
{
QString file_name = WiresharkFileDialog::getSaveFileName(this, wsApp->windowTitleString(tr("Save Stream Content As" UTF8_HORIZONTAL_ELLIPSIS)));
if (!file_name.isEmpty()) {
QTextStream out(&file_);
file_.setFileName(file_name);
if (!file_.open(QIODevice::WriteOnly)) {
open_failure_alert_box(file_name.toUtf8().constData(), errno, TRUE);
return;
}
save_as_ = true;
readStream();
if ((show_type_ != SHOW_RAW) && (show_type_ != SHOW_UTF8))
{
out << ui->teStreamContent->toPlainText();
}
save_as_ = false;
file_.close();
if (file_name.isEmpty()) {
return;
}
QFile file(file_name);
if (!file.open(QIODevice::WriteOnly)) {
open_failure_alert_box(file_name.toUtf8().constData(), errno, TRUE);
return;
}
// Unconditionally save data as UTF-8 (even if data is decoded as UTF-16).
QByteArray bytes = ui->teStreamContent->toPlainText().toUtf8();
if (show_type_ == SHOW_RAW) {
// The "Raw" format is currently displayed as hex data and needs to be
// converted to binary data.
bytes = QByteArray::fromHex(bytes);
}
QDataStream out(&file);
out.writeRawData(bytes.constData(), bytes.size());
}
void FollowStreamDialog::helpButton()
@ -438,11 +437,8 @@ frs_return_t
FollowStreamDialog::readStream()
{
// Only clear the display if we're going to refill it
if (save_as_ == false) {
ui->teStreamContent->clear();
text_pos_to_packet_.clear();
}
ui->teStreamContent->clear();
text_pos_to_packet_.clear();
truncated_ = false;
frs_return_t ret;
@ -469,8 +465,7 @@ FollowStreamDialog::readStream()
break;
}
if (save_as_ == false)
ui->teStreamContent->moveCursor(QTextCursor::Start);
ui->teStreamContent->moveCursor(QTextCursor::Start);
return ret;
}
@ -484,29 +479,6 @@ FollowStreamDialog::followStream()
const int FollowStreamDialog::max_document_length_ = 500 * 1000 * 1000; // Just a guess
void FollowStreamDialog::addText(QString text, gboolean is_from_server, guint32 packet_num)
{
if (save_as_ == true)
{
size_t nwritten;
int FileDescriptor = file_.handle();
int fd_new = ws_dup(FileDescriptor);
if (fd_new == -1)
return;
FILE* fh = ws_fdopen(fd_new, "wb");
if (show_type_ == SHOW_RAW) {
QByteArray binstream = QByteArray::fromHex(text.toUtf8());
nwritten = fwrite(binstream.constData(), binstream.length(), 1, fh);
} else {
nwritten = fwrite(text.toUtf8().constData(), text.length(), 1, fh);
}
fclose(fh);
if ((int)nwritten != text.length()) {
#if 0
report_an_error_maybe();
#endif
}
return;
}
if (truncated_) {
return;
}

View File

@ -119,9 +119,7 @@ private:
int turns_;
QMap<int,guint32> text_pos_to_packet_;
bool save_as_;
bool use_regex_find_;
QFile file_;
bool terminating_;
};