From: schwarze@mdocml.bsd.lv
To: source@mdocml.bsd.lv
Subject: mdocml: In markdown, autolinks are dangerous.
Date: Sat, 11 Mar 2017 07:36:20 -0500 (EST) [thread overview]
Message-ID: <7042925090800702050.enqueue@fantadrom.bsd.lv> (raw)
Log Message:
-----------
In markdown, autolinks are dangerous. Different compilers disagree
with respect to what constitutes a valid autolink, and if a compiler
deems an autolink invalid, the input turns into an unintended and
potentially harmful raw HTML tag. So, never write autolinks.
Instead of <link>, write [link](link).
Instead of <addr>, write [addr](mailto:addr).
Issue pointed out by bentley@, who also agrees with the general
direction of the change.
Modified Files:
--------------
mdocml:
mdoc_markdown.c
mdocml/regress/mdoc/Aq:
author.out_markdown
mdocml/regress/mdoc/Lk:
noarg.out_markdown
mdocml/regress/mdoc/Mt:
simple.out_markdown
mdocml/regress/mdoc/Rs:
allch.out_markdown
Revision Data
-------------
Index: mdoc_markdown.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/mdoc_markdown.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -Lmdoc_markdown.c -Lmdoc_markdown.c -u -p -r1.14 -r1.15
--- mdoc_markdown.c
+++ mdoc_markdown.c
@@ -43,6 +43,7 @@ static void md_rawword(const char *);
static void md_word(const char *);
static void md_named(const char *);
static void md_char(unsigned char);
+static void md_uri(const char *);
static int md_cond_head(struct roff_node *);
static int md_cond_body(struct roff_node *);
@@ -67,6 +68,7 @@ static int md_pre_Fo(struct roff_node *
static int md_pre_In(struct roff_node *);
static int md_pre_It(struct roff_node *);
static int md_pre_Lk(struct roff_node *);
+static int md_pre_Mt(struct roff_node *);
static int md_pre_Nd(struct roff_node *);
static int md_pre_Nm(struct roff_node *);
static int md_pre_No(struct roff_node *);
@@ -211,7 +213,7 @@ static const struct md_act md_acts[MDOC_
{ NULL, NULL, md_post_Lb, NULL, NULL }, /* Lb */
{ NULL, md_pre_Pp, NULL, NULL, NULL }, /* Lp */
{ NULL, md_pre_Lk, NULL, NULL, NULL }, /* Lk */
- { NULL, md_pre_raw, md_post_raw, "<", ">" }, /* Mt */
+ { NULL, md_pre_Mt, NULL, NULL, NULL }, /* Mt */
{ md_cond_body, md_pre_word, md_post_word, "{", "}" }, /* Brq */
{ md_cond_body, md_pre_word, md_post_word, "{", "}" }, /* Bro */
{ NULL, NULL, NULL, NULL, NULL }, /* Brc */
@@ -1279,39 +1281,64 @@ md_post_Lb(struct roff_node *n)
outflags |= MD_br;
}
+static void
+md_uri(const char *s)
+{
+ while (*s != '\0') {
+ if (strchr("%()<>", *s) != NULL) {
+ printf("%%%2.2hhX", *s);
+ outcount += 3;
+ } else {
+ putchar(*s);
+ outcount++;
+ }
+ s++;
+ }
+}
+
static int
md_pre_Lk(struct roff_node *n)
{
const struct roff_node *link, *descr;
- const unsigned char *s;
if ((link = n->child) == NULL)
return 0;
- if ((descr = link->next) != NULL) {
- md_rawword("[");
- outflags &= ~MD_spc;
- while (descr != NULL) {
- md_word(descr->string);
- descr = descr->next;
- }
- outflags &= ~MD_spc;
- md_rawword("](");
- } else
- md_rawword("<");
+ descr = link->next == NULL ? link : link->next;
+ md_rawword("[");
+ outflags &= ~MD_spc;
+ do {
+ md_word(descr->string);
+ descr = link->next == NULL ? NULL : descr->next;
+ } while (descr != NULL);
+ outflags &= ~MD_spc;
+ md_rawword("](");
+ md_uri(link->string);
+ outflags &= ~MD_spc;
+ md_rawword(")");
+ return 0;
+}
- for (s = link->string; *s != '\0'; s++) {
- if (strchr("%()<>", *s) != NULL) {
- printf("%%%2.2hhX", *s);
- outcount += 3;
- } else {
- putchar(*s);
+static int
+md_pre_Mt(struct roff_node *n)
+{
+ const struct roff_node *nch;
+
+ md_rawword("[");
+ outflags &= ~MD_spc;
+ for (nch = n->child; nch != NULL; nch = nch->next)
+ md_word(nch->string);
+ outflags &= ~MD_spc;
+ md_rawword("](mailto:");
+ for (nch = n->child; nch != NULL; nch = nch->next) {
+ md_uri(nch->string);
+ if (nch->next != NULL) {
+ putchar(' ');
outcount++;
}
}
-
outflags &= ~MD_spc;
- md_rawword(link->next == NULL ? ">" : ")");
+ md_rawword(")");
return 0;
}
Index: author.out_markdown
===================================================================
RCS file: /home/cvs/mdocml/mdocml/regress/mdoc/Aq/author.out_markdown,v
retrieving revision 1.1
retrieving revision 1.2
diff -Lregress/mdoc/Aq/author.out_markdown -Lregress/mdoc/Aq/author.out_markdown -u -p -r1.1 -r1.2
--- regress/mdoc/Aq/author.out_markdown
+++ regress/mdoc/Aq/author.out_markdown
@@ -6,11 +6,11 @@ AQ-AUTHOR(1) - General Commands Manual
# DESCRIPTION
-Name <<addr>> Name <<addr>>
+Name <[addr](mailto:addr)> Name <[addr](mailto:addr)>
# AUTHORS
-Name <<addr>>
-Name <<addr>>
+Name <[addr](mailto:addr)>
+Name <[addr](mailto:addr)>
OpenBSD - November 19, 2014
Index: noarg.out_markdown
===================================================================
RCS file: /home/cvs/mdocml/mdocml/regress/mdoc/Lk/noarg.out_markdown,v
retrieving revision 1.1
retrieving revision 1.2
diff -Lregress/mdoc/Lk/noarg.out_markdown -Lregress/mdoc/Lk/noarg.out_markdown -u -p -r1.1 -r1.2
--- regress/mdoc/Lk/noarg.out_markdown
+++ regress/mdoc/Lk/noarg.out_markdown
@@ -9,7 +9,7 @@ LK-NOARG(1) - General Commands Manual
two arguments
[mandoc](http://mdocml.bsd.lv/)
one argument
-<http://www.openbsd.org/>
+[http://www.openbsd.org/](http://www.openbsd.org/)
no argument
end of test document
Index: simple.out_markdown
===================================================================
RCS file: /home/cvs/mdocml/mdocml/regress/mdoc/Mt/simple.out_markdown,v
retrieving revision 1.1
retrieving revision 1.2
diff -Lregress/mdoc/Mt/simple.out_markdown -Lregress/mdoc/Mt/simple.out_markdown -u -p -r1.1 -r1.2
--- regress/mdoc/Mt/simple.out_markdown
+++ regress/mdoc/Mt/simple.out_markdown
@@ -7,9 +7,9 @@ MT-SIMPLE(1) - General Commands Manual
# DESCRIPTION
Please send mail to
-<schwarze@openbsd.org>.
+[schwarze@openbsd.org](mailto:schwarze@openbsd.org).
Do not send mail to
-<~>.
+[~](mailto:~).
OpenBSD - February 17, 2010
Index: allch.out_markdown
===================================================================
RCS file: /home/cvs/mdocml/mdocml/regress/mdoc/Rs/allch.out_markdown,v
retrieving revision 1.2
retrieving revision 1.3
diff -Lregress/mdoc/Rs/allch.out_markdown -Lregress/mdoc/Rs/allch.out_markdown -u -p -r1.2 -r1.3
--- regress/mdoc/Rs/allch.out_markdown
+++ regress/mdoc/Rs/allch.out_markdown
@@ -18,7 +18,7 @@ author name,
report name,
number of journal,
volume number,
-<uniform resource locator>,
+[uniform resource locator](uniform resource locator),
page number,
institutional author,
city name,
@@ -40,7 +40,7 @@ author name,
report name,
number of journal,
volume number,
-<uniform resource locator>,
+[uniform resource locator](uniform resource locator),
page number,
institutional author,
city name,
--
To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv
reply other threads:[~2017-03-11 12:36 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7042925090800702050.enqueue@fantadrom.bsd.lv \
--to=schwarze@mdocml.bsd.lv \
--cc=source@mdocml.bsd.lv \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).