Skip to content

Commit 58e6da8

Browse files
committed
Merge remote-tracking branch 'origin/fix-GHSL-2022-090'
2 parents cd2f088 + c1866d9 commit 58e6da8

File tree

3 files changed

+26
-14
lines changed

3 files changed

+26
-14
lines changed

src/cmark-gfm-extension_api.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ typedef struct delimiter {
114114
struct delimiter *previous;
115115
struct delimiter *next;
116116
cmark_node *inl_text;
117+
bufsize_t position;
117118
bufsize_t length;
118119
unsigned char delim_char;
119120
int can_open;

src/inlines.c

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ static const char *RIGHTSINGLEQUOTE = "\xE2\x80\x99";
3535

3636
typedef struct bracket {
3737
struct bracket *previous;
38-
struct delimiter *previous_delimiter;
3938
cmark_node *inl_text;
4039
bufsize_t position;
4140
bool image;
@@ -511,6 +510,7 @@ static void push_delimiter(subject *subj, unsigned char c, bool can_open,
511510
delim->can_open = can_open;
512511
delim->can_close = can_close;
513512
delim->inl_text = inl_text;
513+
delim->position = subj->pos;
514514
delim->length = inl_text->as.literal.len;
515515
delim->previous = subj->last_delim;
516516
delim->next = NULL;
@@ -531,7 +531,6 @@ static void push_bracket(subject *subj, bool image, cmark_node *inl_text) {
531531
b->active = true;
532532
b->inl_text = inl_text;
533533
b->previous = subj->last_bracket;
534-
b->previous_delimiter = subj->last_delim;
535534
b->position = subj->pos;
536535
b->bracket_after = false;
537536
if (image) {
@@ -646,12 +645,13 @@ static cmark_syntax_extension *get_extension_for_special_char(cmark_parser *pars
646645
return NULL;
647646
}
648647

649-
static void process_emphasis(cmark_parser *parser, subject *subj, delimiter *stack_bottom) {
650-
delimiter *closer = subj->last_delim;
648+
static void process_emphasis(cmark_parser *parser, subject *subj, bufsize_t stack_bottom) {
649+
delimiter *candidate;
650+
delimiter *closer = NULL;
651651
delimiter *opener;
652652
delimiter *old_closer;
653653
bool opener_found;
654-
delimiter *openers_bottom[3][128];
654+
bufsize_t openers_bottom[3][128];
655655
int i;
656656

657657
// initialize openers_bottom:
@@ -664,8 +664,10 @@ static void process_emphasis(cmark_parser *parser, subject *subj, delimiter *sta
664664
}
665665

666666
// move back to first relevant delim.
667-
while (closer != NULL && closer->previous != stack_bottom) {
668-
closer = closer->previous;
667+
candidate = subj->last_delim;
668+
while (candidate != NULL && candidate->position >= stack_bottom) {
669+
closer = candidate;
670+
candidate = candidate->previous;
669671
}
670672

671673
// now move forward, looking for closers, and handling each
@@ -675,8 +677,8 @@ static void process_emphasis(cmark_parser *parser, subject *subj, delimiter *sta
675677
// Now look backwards for first matching opener:
676678
opener = closer->previous;
677679
opener_found = false;
678-
while (opener != NULL && opener != stack_bottom &&
679-
opener != openers_bottom[closer->length % 3][closer->delim_char]) {
680+
while (opener != NULL && opener->position >= stack_bottom &&
681+
opener->position >= openers_bottom[closer->length % 3][closer->delim_char]) {
680682
if (opener->can_open && opener->delim_char == closer->delim_char) {
681683
// interior closer of size 2 can't match opener of size 1
682684
// or of size 1 can't match 2
@@ -722,7 +724,7 @@ static void process_emphasis(cmark_parser *parser, subject *subj, delimiter *sta
722724
if (!opener_found) {
723725
// set lower bound for future searches for openers
724726
openers_bottom[old_closer->length % 3][old_closer->delim_char] =
725-
old_closer->previous;
727+
old_closer->position;
726728
if (!old_closer->can_open) {
727729
// we can remove a closer that can't be an
728730
// opener, once we've seen there's no
@@ -735,7 +737,8 @@ static void process_emphasis(cmark_parser *parser, subject *subj, delimiter *sta
735737
}
736738
}
737739
// free all delimiters in list until stack_bottom:
738-
while (subj->last_delim != NULL && subj->last_delim != stack_bottom) {
740+
while (subj->last_delim != NULL &&
741+
subj->last_delim->position >= stack_bottom) {
739742
remove_delimiter(subj, subj->last_delim);
740743
}
741744
}
@@ -1251,7 +1254,7 @@ static cmark_node *handle_close_bracket(cmark_parser *parser, subject *subj) {
12511254
// being replacing the opening '[' text node with a `^footnote-ref]` node.
12521255
cmark_node_insert_before(opener->inl_text, fnref);
12531256

1254-
process_emphasis(parser, subj, opener->previous_delimiter);
1257+
process_emphasis(parser, subj, opener->position);
12551258
// sometimes, the footnote reference text gets parsed into multiple nodes
12561259
// i.e. '[^example]' parsed into '[', '^exam', 'ple]'.
12571260
// this happens for ex with the autolink extension. when the autolinker
@@ -1303,7 +1306,7 @@ static cmark_node *handle_close_bracket(cmark_parser *parser, subject *subj) {
13031306
// Free the bracket [:
13041307
cmark_node_free(opener->inl_text);
13051308

1306-
process_emphasis(parser, subj, opener->previous_delimiter);
1309+
process_emphasis(parser, subj, opener->position);
13071310
pop_bracket(subj);
13081311

13091312
// Now, if we have a link, we also want to deactivate earlier link
@@ -1528,7 +1531,7 @@ void cmark_parse_inlines(cmark_parser *parser,
15281531
while (!is_eof(&subj) && parse_inline(parser, &subj, parent, options))
15291532
;
15301533

1531-
process_emphasis(parser, &subj, NULL);
1534+
process_emphasis(parser, &subj, 0);
15321535
// free bracket and delim stack
15331536
while (subj.last_delim) {
15341537
remove_delimiter(&subj, subj.last_delim);

test/regression.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,3 +366,11 @@ Hello world
366366
.
367367
<p>Hello world</p>
368368
````````````````````````````````
369+
370+
Issue #424 - emphasis before links
371+
372+
```````````````````````````````` example
373+
*text* [link](#section)
374+
.
375+
<p><em>text</em> <a href="#section">link</a></p>
376+
````````````````````````````````

0 commit comments

Comments
 (0)