Added check for stl corruption

This commit is contained in:
Matt Keeter 2014-03-25 18:53:07 -04:00
parent de5c4b440a
commit 9cc3bd82e8
4 changed files with 26 additions and 0 deletions

View file

@ -4,6 +4,7 @@
Loader::Loader(QObject* parent, const QString& filename) Loader::Loader(QObject* parent, const QString& filename)
: QThread(parent), filename(filename) : QThread(parent), filename(filename)
{ {
// Nothing to do here
} }
void Loader::run() void Loader::run()
@ -16,6 +17,19 @@ void Loader::run()
emit error_ascii_stl(); emit error_ascii_stl();
return; return;
} }
// Skip the rest of the buffer
file.read(75);
// Assume we're on a little-endian system for simplicity
uint32_t tri_count;
file.read(reinterpret_cast<char*>(&tri_count), sizeof(tri_count));
if (file.size() != 84 + tri_count*50)
{
emit error_bad_stl();
return;
}
} }
emit got_mesh(Mesh::load_stl(filename)); emit got_mesh(Mesh::load_stl(filename));

View file

@ -16,6 +16,7 @@ signals:
void loaded_file(QString filename); void loaded_file(QString filename);
void got_mesh(Mesh* m); void got_mesh(Mesh* m);
void error_ascii_stl(); void error_ascii_stl();
void error_bad_stl();
private: private:
const QString filename; const QString filename;

View file

@ -77,6 +77,14 @@ void Window::on_ascii_stl()
"Please convert to binary <code>.stl</code> and retry"); "Please convert to binary <code>.stl</code> and retry");
} }
void Window::on_bad_stl()
{
QMessageBox::critical(this, "Error",
"<b>Error:</b><br>"
"This <code>.stl</code> file is invalid or corrupted.<br>"
"Please export it from the original source, verify, and retry.");
}
void Window::enable_open() void Window::enable_open()
{ {
open_action->setEnabled(true); open_action->setEnabled(true);
@ -101,6 +109,8 @@ bool Window::load_stl(const QString& filename)
canvas, &Canvas::load_mesh); canvas, &Canvas::load_mesh);
connect(loader, &Loader::error_ascii_stl, connect(loader, &Loader::error_ascii_stl,
this, &Window::on_ascii_stl); this, &Window::on_ascii_stl);
connect(loader, &Loader::error_bad_stl,
this, &Window::on_bad_stl);
connect(loader, &Loader::finished, connect(loader, &Loader::finished,
loader, &Loader::deleteLater); loader, &Loader::deleteLater);

View file

@ -16,6 +16,7 @@ public slots:
void on_open(); void on_open();
void on_about(); void on_about();
void on_ascii_stl(); void on_ascii_stl();
void on_bad_stl();
void enable_open(); void enable_open();
void disable_open(); void disable_open();