|
From: <br...@us...> - 2008-07-26 08:29:23
|
Revision: 3497
http://openvrml.svn.sourceforge.net/openvrml/?rev=3497&view=rev
Author: braden
Date: 2008-07-26 08:29:32 +0000 (Sat, 26 Jul 2008)
Log Message:
-----------
Fixed some potential crashes when processing coordinate, color, and normal indices.
Modified Paths:
--------------
trunk/ChangeLog
trunk/src/libopenvrml-gl/openvrml/gl/viewer.cpp
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2008-07-23 17:16:29 UTC (rev 3496)
+++ trunk/ChangeLog 2008-07-26 08:29:32 UTC (rev 3497)
@@ -1,3 +1,24 @@
+2008-07-26 Braden McDaniel <br...@en...>
+
+ Fixed some potential crashes when processing coordinate, color,
+ and normal indices.
+
+ * src/libopenvrml-gl/openvrml/gl/viewer.cpp
+ (insertShellTess(GLUtesselator &, const std::vector<vertex_data>&,
+ const std::vector<openvrml::int32> &, bool, const
+ std::vector<openvrml::color> &, const
+ std::vector<openvrml::int32>&, bool, const
+ std::vector<openvrml::vec3f> &, const
+ std::vector<openvrml::int32>&)): Advance past invalid coordinate
+ indices.
+ (openvrml::gl::viewer::do_insert_shell(unsigned int, const
+ std::vector<vec3f> &, const std::vector<int32> &, const
+ std::vector<color> &, const std::vector<int32> &, const
+ std::vector<vec3f> & const std::vector<int32> &, const
+ std::vector<vec2f> &, const std::vector<int32> &)): Advance past
+ -1 entries and invalid coordinate indices in the colorIndex and
+ normalIndex fields.
+
2008-07-23 Braden McDaniel <br...@en...>
Use GtkBuilder in openvrml-player instead of libglade. Note that
Modified: trunk/src/libopenvrml-gl/openvrml/gl/viewer.cpp
===================================================================
--- trunk/src/libopenvrml-gl/openvrml/gl/viewer.cpp 2008-07-23 17:16:29 UTC (rev 3496)
+++ trunk/src/libopenvrml-gl/openvrml/gl/viewer.cpp 2008-07-26 08:29:32 UTC (rev 3497)
@@ -2939,7 +2939,14 @@
for (vector<openvrml::int32>::size_type i = 0;
i < coord_index.size();
++i) {
- if (coord_index[i] != -1) {
+ using openvrml::int32;
+ if (!(coord_index[i] < int32(vertices.size()))) {
+ //
+ // We've encountered an invalid coordinate index. Advance to
+ // the next polygon.
+ //
+ while (coord_index[i + 1] != -1) { ++i; }
+ } else if (coord_index[i] != -1) {
gluTessVertex(&tessobj,
const_cast<GLdouble *>(
vertices[coord_index[i]].coord),
@@ -3060,11 +3067,13 @@
++i) {
vertices[i].color = &color[i];
}
- } else {
+ } else if (color_index.size() == coord_index.size()) {
for (vector<int32>::size_type i = 0;
i < color_index.size();
++i) {
- vertices[i].color = &color[color_index[i]];
+ if (color_index[i] < 0) { continue; }
+ if (!(coord_index[i] < coord.size())) { continue; }
+ vertices[coord_index[i]].color = &color[color_index[i]];
}
}
}
@@ -3075,11 +3084,13 @@
++i) {
vertices[i].normal = &normal[i];
}
- } else {
+ } else if (normal_index.size() == coord_index.size()) {
for (vector<int32>::size_type i = 0;
i < normal_index.size();
++i) {
- vertices[i].normal = &normal[normal_index[i]];
+ if (normal_index[i] < 0) { continue; }
+ if (!(coord_index[i] < coord.size())) { continue; }
+ vertices[coord_index[i]].normal = &normal[normal_index[i]];
}
}
}
@@ -3094,6 +3105,7 @@
for (vector<int32>::size_type i = 0;
i < tex_coord_index.size();
++i) {
+ if (tex_coord_index[i] < 0) { continue; }
vertices[tex_coord_index[i]].tex_coord =
&tex_coord[tex_coord_index[i]];
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|