diff --git a/corpus/issues.txt b/corpus/issues.txt index 8577f21..92b4461 100644 --- a/corpus/issues.txt +++ b/corpus/issues.txt @@ -134,3 +134,19 @@ ss_*. (text))) (paragraph (text))) + +================================================================================ +#16 - infinite loop caused by overlapped delimiter range +================================================================================ +[(https://example.com/foo[bar] + +-------------------------------------------------------------------------------- + +(document + (paragraph + (text) + (uri_autolink + (text)) + (link + (link_text + (text))))) diff --git a/src/tree_sitter_markdown/inline_scan.cc b/src/tree_sitter_markdown/inline_scan.cc index a36cfcf..b5cba14 100644 --- a/src/tree_sitter_markdown/inline_scan.cc +++ b/src/tree_sitter_markdown/inline_scan.cc @@ -356,7 +356,10 @@ bool scn_ext_aut_lnk(Lexer &lxr, InlineDelimiterList &inl_dlms, InlineContextSta LexedPosition bgn_pos = lxr.cur_pos(); bool in_tbl = is_in_tbl(blk_ctx_stk); InlineDelimiterList::Iterator ctx_itr = inl_ctx_stk.back().dlm_itr(); - while (!is_wht_chr(lxr.lka_chr()) && lxr.lka_chr() != '<' && !MAYBE_TBL_COL_SEP()) { + while ( + (nxt_inl_dlm_itr == inl_dlms.end() || lxr.cur_idx() < nxt_inl_dlm_itr->pos().idx()) + && !is_wht_chr(lxr.lka_chr()) && lxr.lka_chr() != '<' && !MAYBE_TBL_COL_SEP() + ) { if (lxr.lka_chr() == '(') { ctx_itr->set_ctm_dat(ctx_itr->ctm_dat() - 1); } else if (lxr.lka_chr() == ')') {