Skip to content

Commit 8e0d2b7

Browse files
Restart if we find another @ character, to avoid quadratic behavior.
1 parent 2b2bcdf commit 8e0d2b7

File tree

1 file changed

+11
-7
lines changed

1 file changed

+11
-7
lines changed

extensions/autolink.c

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,6 @@ static void postprocess_text(cmark_parser *parser, cmark_node *text) {
317317
bool is_xmpp = false;
318318
size_t rewind;
319319
size_t max_rewind;
320-
size_t nb = 0;
321320
size_t np = 0;
322321

323322
if (offset >= remaining)
@@ -329,6 +328,7 @@ static void postprocess_text(cmark_parser *parser, cmark_node *text) {
329328

330329
max_rewind = at - (data + start + offset);
331330

331+
found_at:
332332
for (rewind = 0; rewind < max_rewind; ++rewind) {
333333
uint8_t c = data[start + offset + max_rewind - rewind - 1];
334334

@@ -360,15 +360,19 @@ static void postprocess_text(cmark_parser *parser, cmark_node *text) {
360360
continue;
361361
}
362362

363-
for (link_end = 0; link_end < remaining - offset - max_rewind; ++link_end) {
363+
assert(data[start + offset + max_rewind] == '@');
364+
for (link_end = 1; link_end < remaining - offset - max_rewind; ++link_end) {
364365
uint8_t c = data[start + offset + max_rewind + link_end];
365366

366367
if (cmark_isalnum(c))
367368
continue;
368369

369-
if (c == '@')
370-
nb++;
371-
else if (c == '.' && link_end < remaining - offset - max_rewind - 1 &&
370+
if (c == '@') {
371+
// Found another '@', so go back and try again with an updated offset and max_rewind.
372+
offset += max_rewind + 1;
373+
max_rewind = link_end - 1;
374+
goto found_at;
375+
} else if (c == '.' && link_end < remaining - offset - max_rewind - 1 &&
372376
cmark_isalnum(data[start + offset + max_rewind + link_end + 1]))
373377
np++;
374378
else if (c == '/' && is_xmpp)
@@ -377,10 +381,10 @@ static void postprocess_text(cmark_parser *parser, cmark_node *text) {
377381
break;
378382
}
379383

380-
if (link_end < 2 || nb != 1 || np == 0 ||
384+
if (link_end < 2 || np == 0 ||
381385
(!cmark_isalpha(data[start + offset + max_rewind + link_end - 1]) &&
382386
data[start + offset + max_rewind + link_end - 1] != '.')) {
383-
offset += max_rewind + 1;
387+
offset += max_rewind + link_end;
384388
depth++;
385389
continue;
386390
}

0 commit comments

Comments
 (0)