From d44293d8a8f14d4d28121aaf405bc5876c4f1253 Mon Sep 17 00:00:00 2001 From: Jeremiah Willcock Date: Thu, 17 Feb 2011 23:00:20 +0000 Subject: [PATCH] Fixed buffer overflow from parallel edges in isomorphism(); fixes #5175 [SVN r68979] --- include/boost/graph/isomorphism.hpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/include/boost/graph/isomorphism.hpp b/include/boost/graph/isomorphism.hpp index 9461dc31..f5869026 100644 --- a/include/boost/graph/isomorphism.hpp +++ b/include/boost/graph/isomorphism.hpp @@ -284,18 +284,30 @@ namespace boost { typedef size_type result_type; degree_vertex_invariant(const InDegreeMap& in_degree_map, const Graph& g) - : m_in_degree_map(in_degree_map), m_g(g) { } + : m_in_degree_map(in_degree_map), + m_max_vertex_in_degree(0), + m_max_vertex_out_degree(0), + m_g(g) { + BGL_FORALL_VERTICES_T(v, g, Graph) { + m_max_vertex_in_degree = + (std::max)(m_max_vertex_in_degree, get(m_in_degree_map, v)); + m_max_vertex_out_degree = + (std::max)(m_max_vertex_out_degree, out_degree(v, g)); + } + } size_type operator()(vertex_t v) const { - return (num_vertices(m_g) + 1) * out_degree(v, m_g) + return (m_max_vertex_in_degree + 1) * out_degree(v, m_g) + get(m_in_degree_map, v); } // The largest possible vertex invariant number size_type max BOOST_PREVENT_MACRO_SUBSTITUTION () const { - return num_vertices(m_g) * num_vertices(m_g) + num_vertices(m_g); + return (m_max_vertex_in_degree + 2) * m_max_vertex_out_degree + 1; } private: InDegreeMap m_in_degree_map; + size_type m_max_vertex_in_degree; + size_type m_max_vertex_out_degree; const Graph& m_g; };