Fix crash with empty imported STL/PNG (#1717625)

This commit is contained in:
Miro Hrončok 2019-06-24 12:23:32 +02:00
parent 0d7ce36168
commit b7ae333905
2 changed files with 219 additions and 1 deletions

206
2973.patch Normal file
View File

@ -0,0 +1,206 @@
From 87c05067f5267c9e678435c462e7b5a5a32e1f1b Mon Sep 17 00:00:00 2001
From: Torsten Paul <Torsten.Paul@gmx.de>
Date: Sun, 16 Jun 2019 23:02:38 +0200
Subject: [PATCH 1/3] Have Reindexer return a const ref instead of a pointer
into value array.
---
src/GeometryUtils.cc | 2 +-
src/GeometryUtils.h | 2 +-
src/Reindexer.h | 12 +++++++-----
src/export_off.cc | 2 +-
src/polyset-utils.cc | 2 +-
5 files changed, 11 insertions(+), 9 deletions(-)
diff --git a/src/GeometryUtils.cc b/src/GeometryUtils.cc
index d1a740d3ff..347164e08a 100644
--- a/src/GeometryUtils.cc
+++ b/src/GeometryUtils.cc
@@ -188,7 +188,7 @@ class EdgeDict {
Returns true on error, false on success.
*/
-bool GeometryUtils::tessellatePolygonWithHoles(const Vector3f *vertices,
+bool GeometryUtils::tessellatePolygonWithHoles(const std::vector<Vector3f>& vertices,
const std::vector<IndexedFace> &faces,
std::vector<IndexedTriangle> &triangles,
const Vector3f *normal)
diff --git a/src/GeometryUtils.h b/src/GeometryUtils.h
index 5260b0aa61..073c41335a 100644
--- a/src/GeometryUtils.h
+++ b/src/GeometryUtils.h
@@ -29,7 +29,7 @@ namespace GeometryUtils {
bool tessellatePolygon(const Polygon &polygon,
Polygons &triangles,
const Vector3f *normal = nullptr);
- bool tessellatePolygonWithHoles(const Vector3f *vertices,
+ bool tessellatePolygonWithHoles(const std::vector<Vector3f>& vertices,
const std::vector<IndexedFace> &faces,
std::vector<IndexedTriangle> &triangles,
const Vector3f *normal = nullptr);
diff --git a/src/Reindexer.h b/src/Reindexer.h
index f9ad6bc69d..8abbd21461 100644
--- a/src/Reindexer.h
+++ b/src/Reindexer.h
@@ -4,6 +4,8 @@
#include <functional>
#include <vector>
#include <algorithm>
+#include <boost/range/adaptor/map.hpp>
+#include <boost/range/algorithm/copy.hpp>
#include "hash.h"
/*!
@@ -39,14 +41,14 @@ class Reindexer
/*!
Return the new element array.
*/
- const T *getArray() {
- this->vec.resize(this->map.size());
- typename std::unordered_map<T, int>::const_iterator iter = this->map.begin();
+ const std::vector<T>& getArray() {
+ this->vec.resize(this->map.size());
+ typename std::unordered_map<T, int>::const_iterator iter = this->map.begin();
while (iter != this->map.end()) {
this->vec[iter->second] = iter->first;
iter++;
- }
- return &this->vec[0];
+ }
+ return this->vec;
}
/*!
diff --git a/src/export_off.cc b/src/export_off.cc
index 8a74d60cd4..f18134aac8 100644
--- a/src/export_off.cc
+++ b/src/export_off.cc
@@ -83,7 +83,7 @@ void export_off(const shared_ptr<const Geometry> &geom, std::ostream &output)
append_geometry(geom, mesh);
output << "OFF " << mesh.vertices.size() << " " << mesh.numfaces << " 0\n";
- const Vector3d *v = mesh.vertices.getArray();
+ const auto v = mesh.vertices.getArray();
size_t numverts = mesh.vertices.size();
for (size_t i=0;i<numverts;i++) {
output << v[i][0] << " " << v[i][1] << " " << v[i][2] << " " << "\n";
diff --git a/src/polyset-utils.cc b/src/polyset-utils.cc
index 84951caba3..6f964d8186 100644
--- a/src/polyset-utils.cc
+++ b/src/polyset-utils.cc
@@ -78,7 +78,7 @@ namespace PolysetUtils {
}
// Tessellate indexed mesh
- const auto *verts = allVertices.getArray();
+ const auto verts = allVertices.getArray();
std::vector<IndexedTriangle> allTriangles;
for (const auto &faces : polygons) {
std::vector<IndexedTriangle> triangles;
From 0cc0c9869079fbbd43d3c8658947b74084e83ca5 Mon Sep 17 00:00:00 2001
From: Torsten Paul <Torsten.Paul@gmx.de>
Date: Sun, 23 Jun 2019 17:50:53 +0200
Subject: [PATCH 2/3] Enforce reference type to prevent copying.
---
src/GeometryUtils.cc | 2 +-
src/cgalutils.cc | 2 +-
src/export_off.cc | 2 +-
src/polyset-utils.cc | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/GeometryUtils.cc b/src/GeometryUtils.cc
index 347164e08a..c5919ca681 100644
--- a/src/GeometryUtils.cc
+++ b/src/GeometryUtils.cc
@@ -430,7 +430,7 @@ bool GeometryUtils::tessellatePolygon(const Polygon &polygon, Polygons &triangle
}
if (currface.front() == currface.back()) currface.pop_back();
if (currface.size() >= 3) { // Cull empty triangles
- const auto verts = uniqueVertices.getArray();
+ const auto& verts = uniqueVertices.getArray();
std::vector<IndexedTriangle> indexedtriangles;
err = tessellatePolygonWithHoles(verts, indexedfaces, indexedtriangles, normal);
for (const auto &t : indexedtriangles) {
diff --git a/src/cgalutils.cc b/src/cgalutils.cc
index 2f17973ee9..3885830470 100644
--- a/src/cgalutils.cc
+++ b/src/cgalutils.cc
@@ -316,7 +316,7 @@ namespace CGALUtils {
PRINTB("Error: Non-manifold mesh encountered: %d unconnected edges", unconnected);
}
// 3. Triangulate each face
- const auto verts = allVertices.getArray();
+ const auto& verts = allVertices.getArray();
std::vector<IndexedTriangle> allTriangles;
for (const auto &faces : polygons) {
#if 0 // For debugging
diff --git a/src/export_off.cc b/src/export_off.cc
index f18134aac8..b81583ac06 100644
--- a/src/export_off.cc
+++ b/src/export_off.cc
@@ -83,7 +83,7 @@ void export_off(const shared_ptr<const Geometry> &geom, std::ostream &output)
append_geometry(geom, mesh);
output << "OFF " << mesh.vertices.size() << " " << mesh.numfaces << " 0\n";
- const auto v = mesh.vertices.getArray();
+ const auto& v = mesh.vertices.getArray();
size_t numverts = mesh.vertices.size();
for (size_t i=0;i<numverts;i++) {
output << v[i][0] << " " << v[i][1] << " " << v[i][2] << " " << "\n";
diff --git a/src/polyset-utils.cc b/src/polyset-utils.cc
index 6f964d8186..4979d5f673 100644
--- a/src/polyset-utils.cc
+++ b/src/polyset-utils.cc
@@ -78,7 +78,7 @@ namespace PolysetUtils {
}
// Tessellate indexed mesh
- const auto verts = allVertices.getArray();
+ const auto& verts = allVertices.getArray();
std::vector<IndexedTriangle> allTriangles;
for (const auto &faces : polygons) {
std::vector<IndexedTriangle> triangles;
From 95c73000b834d9b03345ec20b0e4001c36c97614 Mon Sep 17 00:00:00 2001
From: Torsten Paul <Torsten.Paul@gmx.de>
Date: Sun, 23 Jun 2019 21:10:52 +0200
Subject: [PATCH 3/3] Use range based loop.
---
src/Reindexer.h | 14 +++++---------
1 file changed, 5 insertions(+), 9 deletions(-)
diff --git a/src/Reindexer.h b/src/Reindexer.h
index 8abbd21461..2688ea16bc 100644
--- a/src/Reindexer.h
+++ b/src/Reindexer.h
@@ -4,8 +4,6 @@
#include <functional>
#include <vector>
#include <algorithm>
-#include <boost/range/adaptor/map.hpp>
-#include <boost/range/algorithm/copy.hpp>
#include "hash.h"
/*!
@@ -42,13 +40,11 @@ class Reindexer
Return the new element array.
*/
const std::vector<T>& getArray() {
- this->vec.resize(this->map.size());
- typename std::unordered_map<T, int>::const_iterator iter = this->map.begin();
- while (iter != this->map.end()) {
- this->vec[iter->second] = iter->first;
- iter++;
- }
- return this->vec;
+ this->vec.resize(this->map.size());
+ for (const auto& entry : map) {
+ this->vec[entry.second] = entry.first;
+ }
+ return this->vec;
}
/*!

View File

@ -1,7 +1,7 @@
Name: openscad
Version: 2019.05
%global upversion %{version}
Release: 2%{?dist}
Release: 3%{?dist}
Summary: The Programmers Solid 3D CAD Modeller
# COPYING contains a linking exception for CGAL
# Appdata file is CC0
@ -10,6 +10,15 @@ License: GPLv2 with exceptions and CC0
URL: http://www.%{name}.org/
Source0: http://files.%{name}.org/%{name}-%{upversion}.src.tar.gz
Patch0: %{name}-polyclipping.patch
# Upstream backports:
%global github https://github.com/openscad/openscad
# Crash with empty STL/PNG import
# https://bugzilla.redhat.com/show_bug.cgi?id=1717625
# https://github.com/openscad/openscad/issues/2965
Patch1: %{github}/pull/2973.patch
BuildRequires: CGAL-devel >= 3.6
BuildRequires: ImageMagick
BuildRequires: Xvfb
@ -202,6 +211,9 @@ cd -
%{_datadir}/%{name}/libraries/MCAD/bitmap/*.scad
%changelog
* Mon Jun 24 2019 Miro Hrončok <mhroncok@redhat.com> - 2019.05-3
- Fix crash with empty imported STL/PNG (#1717625)
* Thu May 23 2019 Ivan Mironov <mironov.ivan@gmail.com> - 2019.05-2
- Switch to Qt5 (this enables OctoPrint support)
- Add dependency on Qt Gamepad (enables gamepad support)