diff options
author | John MacFarlane <jgm@berkeley.edu> | 2016-01-08 13:26:06 -0800 |
---|---|---|
committer | John MacFarlane <jgm@berkeley.edu> | 2016-01-08 13:26:06 -0800 |
commit | 9305d14f39f72c1ad02917df7e15126dc4a4ab1c (patch) | |
tree | ef359e720e3233019277f9a9b5c57b0c7bb3af20 /src | |
parent | 56501dc4d3f8d33c13ca833d2386a445ecde7435 (diff) |
Fixed get_containing_block logic in src/commonmark.c.
This did not allow for the possibility that a node
might have no containing block, causing the commonmark
renderer to segfault if passed an inline node with no
block parent.
Diffstat (limited to 'src')
-rw-r--r-- | src/commonmark.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/src/commonmark.c b/src/commonmark.c index 69bd2b1..1a61334 100644 --- a/src/commonmark.c +++ b/src/commonmark.c @@ -135,12 +135,17 @@ static bool is_autolink(cmark_node *node) { // if node is a block node, returns node. // otherwise returns first block-level node that is an ancestor of node. +// if there is no block-level ancestor, returns NULL. static cmark_node *get_containing_block(cmark_node *node) { - while (node && (node->type < CMARK_NODE_FIRST_BLOCK || - node->type > CMARK_NODE_LAST_BLOCK)) { - node = node->parent; + while (node) { + if (node->type >= CMARK_NODE_FIRST_BLOCK && + node->type <= CMARK_NODE_LAST_BLOCK) { + return node; + } else { + node = node->parent; + } } - return node; + return NULL; } static int S_render_node(cmark_renderer *renderer, cmark_node *node, @@ -163,10 +168,11 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node, if (!(node->type == CMARK_NODE_ITEM && node->prev == NULL && entering)) { tmp = get_containing_block(node); renderer->in_tight_list_item = - (tmp->type == CMARK_NODE_ITEM && - cmark_node_get_list_tight(tmp->parent)) || - (tmp && tmp->parent && tmp->parent->type == CMARK_NODE_ITEM && - cmark_node_get_list_tight(tmp->parent->parent)); + tmp && // tmp might be NULL if there is no containing block + ((tmp->type == CMARK_NODE_ITEM && + cmark_node_get_list_tight(tmp->parent)) || + (tmp && tmp->parent && tmp->parent->type == CMARK_NODE_ITEM && + cmark_node_get_list_tight(tmp->parent->parent))); } switch (node->type) { |