File cmark-gfm-CVE-2023-22486.patch of Package cmark.28333
diff --unified --recursive --text --new-file --color cmark-0.30.2.old/src/inlines.c cmark-0.30.2.new/src/inlines.c
--- cmark-0.30.2.old/src/inlines.c 2021-09-24 23:56:14.000000000 +0800
+++ cmark-0.30.2.new/src/inlines.c 2023-03-22 12:26:45.728198282 +0800
@@ -66,6 +66,7 @@
bracket *last_bracket;
bufsize_t backticks[MAXBACKTICKS + 1];
bool scanned_for_backticks;
+ bool no_link_openers;
} subject;
static CMARK_INLINE bool S_is_line_end_char(char c) {
@@ -207,6 +208,7 @@
e->backticks[i] = 0;
}
e->scanned_for_backticks = false;
+ e->no_link_openers = true;
}
static CMARK_INLINE int isbacktick(int c) { return (c == '`'); }
@@ -551,6 +553,9 @@
b->position = subj->pos;
b->bracket_after = false;
subj->last_bracket = b;
+ if (!image) {
+ subj->no_link_openers = false;
+ }
}
// Assumes the subject has a c at the current position.
@@ -1108,16 +1113,16 @@
return make_str(subj, subj->pos - 1, subj->pos - 1, cmark_chunk_literal("]"));
}
- if (!opener->active) {
+ // If we got here, we matched a potential link/image text.
+ // Now we check to see if it's a link/image.
+ is_image = opener->image;
+
+ if (!is_image && subj->no_link_openers) {
// take delimiter off stack
pop_bracket(subj);
return make_str(subj, subj->pos - 1, subj->pos - 1, cmark_chunk_literal("]"));
}
- // If we got here, we matched a potential link/image text.
- // Now we check to see if it's a link/image.
- is_image = opener->image;
-
after_link_text_pos = subj->pos;
// First, look for an inline link.
@@ -1213,21 +1218,11 @@
process_emphasis(subj, opener->position);
pop_bracket(subj);
- // Now, if we have a link, we also want to deactivate earlier link
- // delimiters. (This code can be removed if we decide to allow links
+ // Now, if we have a link, we also want to deactivate links until
+ // we get a new opener. (This code can be removed if we decide to allow links
// inside links.)
if (!is_image) {
- opener = subj->last_bracket;
- while (opener != NULL) {
- if (!opener->image) {
- if (!opener->active) {
- break;
- } else {
- opener->active = false;
- }
- }
- opener = opener->previous;
- }
+ subj->no_link_openers = true;
}
return NULL;