summaryrefslogtreecommitdiff
path: root/src/commonmark.c
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2016-01-08 13:26:06 -0800
committerJohn MacFarlane <jgm@berkeley.edu>2016-01-08 13:26:06 -0800
commit9305d14f39f72c1ad02917df7e15126dc4a4ab1c (patch)
treeef359e720e3233019277f9a9b5c57b0c7bb3af20 /src/commonmark.c
parent56501dc4d3f8d33c13ca833d2386a445ecde7435 (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/commonmark.c')
-rw-r--r--src/commonmark.c22
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) {