max_subgraph_nesting_level in read_graphviz_new

This commit is contained in:
sehe 2024-05-02 06:00:11 +02:00
parent 9c0ceda4c8
commit c71ceb8486

View File

@ -53,6 +53,7 @@ namespace boost
namespace read_graphviz_detail namespace read_graphviz_detail
{ {
static const long max_subgraph_nesting_level = 255;
struct token struct token
{ {
enum token_type enum token_type
@ -527,6 +528,7 @@ namespace read_graphviz_detail
std::map< subgraph_name, subgraph_info > subgraphs; std::map< subgraph_name, subgraph_info > subgraphs;
std::string current_subgraph_name; std::string current_subgraph_name;
int sgcounter; // Counter for anonymous subgraphs int sgcounter; // Counter for anonymous subgraphs
long sgnesting_level;
std::set< std::pair< node_name, node_name > > std::set< std::pair< node_name, node_name > >
existing_edges; // Used for checking in strict graphs existing_edges; // Used for checking in strict graphs
@ -538,7 +540,7 @@ namespace read_graphviz_detail
subgraph_member_list& current_members() { return current().members; } subgraph_member_list& current_members() { return current().members; }
parser(const std::string& gr, parser_result& result) parser(const std::string& gr, parser_result& result)
: the_tokenizer(gr), lookahead(), r(result), sgcounter(0) : the_tokenizer(gr), lookahead(), r(result), sgcounter(0), sgnesting_level(0)
{ {
current_subgraph_name = "___root___"; current_subgraph_name = "___root___";
current() = subgraph_info(); // Initialize root graph current() = subgraph_info(); // Initialize root graph
@ -803,6 +805,10 @@ namespace read_graphviz_detail
return name; return name;
} }
subgraph_name old_sg = current_subgraph_name; subgraph_name old_sg = current_subgraph_name;
if (++sgnesting_level > max_subgraph_nesting_level)
{
error("Exceeded maximum subgraph nesting level");
}
current_subgraph_name = name; current_subgraph_name = name;
if (first_token.type != token::left_brace) if (first_token.type != token::left_brace)
{ {
@ -817,6 +823,7 @@ namespace read_graphviz_detail
else else
error("Wanted right brace to end subgraph"); error("Wanted right brace to end subgraph");
current_subgraph_name = old_sg; current_subgraph_name = old_sg;
sgnesting_level -= 1;
return name; return name;
} }