source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mdocml: In markdown, autolinks are dangerous.
@ 2017-03-11 12:36 schwarze
  0 siblings, 0 replies; only message in thread
From: schwarze @ 2017-03-11 12:36 UTC (permalink / raw)
  To: source

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 &lt;<addr>&gt; Name &lt;<addr>&gt;
+Name &lt;[addr](mailto:addr)&gt; Name &lt;[addr](mailto:addr)&gt;
 
 # AUTHORS
 
-Name &lt;<addr>&gt;  
-Name &lt;<addr>&gt;
+Name &lt;[addr](mailto:addr)&gt;  
+Name &lt;[addr](mailto:addr)&gt;
 
 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

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2017-03-11 12:36 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-03-11 12:36 mdocml: In markdown, autolinks are dangerous schwarze

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).