summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2014-11-08 15:15:20 -0800
committerJohn MacFarlane <jgm@berkeley.edu>2014-11-09 13:21:37 -0800
commit13da682b01067428e30b707b7cf64ef3a122984c (patch)
tree93e2cef69ea8c1f7eea6bc441b0245e7c3022168 /src
parentd352e22ff937548fb02f79043f47d2143050c63e (diff)
Added MAX_LINK_LABEL_LENGTH to cmark.h.
Use in link label parsing and reference lookup.
Diffstat (limited to 'src')
-rw-r--r--src/cmark.h2
-rw-r--r--src/inlines.c24
-rw-r--r--src/references.c3
3 files changed, 19 insertions, 10 deletions
diff --git a/src/cmark.h b/src/cmark.h
index ff2f9a2..a135fa9 100644
--- a/src/cmark.h
+++ b/src/cmark.h
@@ -10,6 +10,8 @@
#define VERSION "0.1"
#define CODE_INDENT 4
+#define MAX_LINK_LABEL_LENGTH 1000
+
struct node_inl {
enum {
INL_STRING,
diff --git a/src/inlines.c b/src/inlines.c
index 7a7ca02..0527d92 100644
--- a/src/inlines.c
+++ b/src/inlines.c
@@ -579,17 +579,24 @@ static node_inl* handle_pointy_brace(subject* subj)
static int link_label(subject* subj, chunk *raw_label)
{
int startpos = subj->pos;
+ int length = 0;
advance(subj); // advance past [
unsigned char c;
while ((c = peek_char(subj)) && c != '[' && c != ']') {
if (c == '\\') {
advance(subj);
+ length++;
if (ispunct(peek_char(subj))) {
advance(subj);
+ length++;
}
} else {
advance(subj);
+ length++;
+ }
+ if (length > MAX_LINK_LABEL_LENGTH) {
+ goto noMatch;
}
}
@@ -597,10 +604,12 @@ static int link_label(subject* subj, chunk *raw_label)
*raw_label = chunk_dup(&subj->input, startpos + 1, subj->pos - (startpos + 1));
advance(subj); // advance past ]
return 1;
- } else {
- subj->pos = startpos; // rewind
- return 0;
}
+
+ noMatch:
+ subj->pos = startpos; // rewind
+ return 0;
+
}
// Return a link, an image, or a literal close bracket.
@@ -679,16 +688,11 @@ static node_inl* handle_close_bracket(subject* subj, node_inl **last)
subj->pos = subj->pos + scan_spacechars(&subj->input, subj->pos);
raw_label = chunk_literal("");
if (!link_label(subj, &raw_label) || raw_label.len == 0) {
- // chunk_free(&raw_label);
+ chunk_free(&raw_label);
raw_label = chunk_dup(&subj->input, ostack->position, initial_pos - ostack->position - 1);
}
- // TODO - document this hard length limit in spec; also impose for creation of refs
- if (raw_label.len < 1000) {
- ref = reference_lookup(subj->refmap, &raw_label);
- } else {
- ref = NULL;
- }
+ ref = reference_lookup(subj->refmap, &raw_label);
chunk_free(&raw_label);
if (ref != NULL) { // found
diff --git a/src/references.c b/src/references.c
index 5ba4b24..def4dd8 100644
--- a/src/references.c
+++ b/src/references.c
@@ -100,6 +100,9 @@ reference* reference_lookup(reference_map *map, chunk *label)
unsigned char *norm;
unsigned int hash;
+ if (label->len > MAX_LINK_LABEL_LENGTH)
+ return NULL;
+
if (map == NULL)
return NULL;