Reject the escape sequences \[uD800] to \[uDFFF] in the parser.
authorschwarze <schwarze@openbsd.org>
Tue, 13 Oct 2015 23:30:42 +0000 (23:30 +0000)
committerschwarze <schwarze@openbsd.org>
Tue, 13 Oct 2015 23:30:42 +0000 (23:30 +0000)
These surrogates are not valid Unicode codepoints,
so treat them just like any other undefined character escapes:
Warn about them and do not produce output.
Issue noticed while talking to stsp@, semarie@, and bentley@.

regress/usr.bin/mandoc/char/unicode/input.out_ascii
regress/usr.bin/mandoc/char/unicode/input.out_lint
regress/usr.bin/mandoc/char/unicode/input.out_utf8
usr.bin/mandoc/mandoc.c

index a9946d1..7711574 100644 (file)
@@ -37,8 +37,8 @@ D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
        U+CFFF   0xecbfbf   <?><?>   end of last normal middle byte
        U+D000   0xed8080   <?><?>   begin of strange middle byte
        U+D7FF   0xed9fbf   <?><?>   highest public three-byte
-       U+D800   0xeda080   <?>???   lowest surrogate
-       U+DFFF   0xedbfbf   <?>???   highest surrogate
+       U+D800   0xeda080   ???      lowest surrogate
+       U+DFFF   0xedbfbf   ???      highest surrogate
        U+E000   0xee8080   <?><?>   lowest private use
        U+FFFF   0xefbfbf   <?><?>   highest three-byte
 
index 77b6161..8ac05ed 100644 (file)
@@ -24,9 +24,11 @@ mandoc: input.in:34:19: ERROR: skipping bad character: 0xbf
 mandoc: input.in:41:25: ERROR: skipping bad character: 0xed
 mandoc: input.in:41:26: ERROR: skipping bad character: 0xa0
 mandoc: input.in:41:27: ERROR: skipping bad character: 0x80
+mandoc: input.in:41:17: WARNING: invalid escape sequence: \[uD800]
 mandoc: input.in:42:25: ERROR: skipping bad character: 0xed
 mandoc: input.in:42:26: ERROR: skipping bad character: 0xbf
 mandoc: input.in:42:27: ERROR: skipping bad character: 0xbf
+mandoc: input.in:42:17: WARNING: invalid escape sequence: \[uDFFF]
 mandoc: input.in:50:19: ERROR: skipping bad character: 0xf0
 mandoc: input.in:50:20: ERROR: skipping bad character: 0x80
 mandoc: input.in:50:21: ERROR: skipping bad character: 0x80
index 44813b8..89aa671 100644 (file)
@@ -37,8 +37,8 @@ D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
        U+CFFF   0xecbfbf   ì¿¿ì¿¿   end of last normal middle byte
        U+D000   0xed8080   í€€í€€   begin of strange middle byte
        U+D7FF   0xed9fbf   íŸ¿íŸ¿       highest public three-byte
-       U+D800   0xeda080   í €???    lowest surrogate
-       U+DFFF   0xedbfbf   í¿¿???    highest surrogate
+       U+D800   0xeda080   ???    lowest surrogate
+       U+DFFF   0xedbfbf   ???    highest surrogate
        U+E000   0xee8080   î€€î€€       lowest private use
        U+FFFF   0xefbfbf   ï¿¿ï¿¿       highest three-byte
 
index 2184c17..3e56edf 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mandoc.c,v 1.63 2015/10/12 00:07:27 schwarze Exp $ */
+/*     $OpenBSD: mandoc.c,v 1.64 2015/10/13 23:30:42 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011-2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -331,6 +331,9 @@ mandoc_escape(const char **end, const char **start, int *sz)
                        break;
                if (*sz == 6 && (*start)[1] == '0')
                        break;
+               if (*sz == 5 && (*start)[1] == 'D' &&
+                   strchr("89ABCDEF", (*start)[2]) != NULL)
+                       break;
                if ((int)strspn(*start + 1, "0123456789ABCDEFabcdef")
                    + 1 == *sz)
                        gly = ESCAPE_UNICODE;