version 1.14, 2022/06/08 13:23:57 |
version 1.15, 2024/05/16 21:23:00 |
Line 467 roff_escape(const char *buf, const int ln, const int a |
|
Line 467 roff_escape(const char *buf, const int ln, const int a |
|
/* |
/* |
* Unicode escapes are defined in groff as \[u0000] |
* Unicode escapes are defined in groff as \[u0000] |
* to \[u10FFFF], where the contained value must be |
* to \[u10FFFF], where the contained value must be |
* a valid Unicode codepoint. Here, however, only |
* a valid Unicode codepoint. |
* check the length and range. |
|
*/ |
*/ |
|
|
if (buf[iarg] != 'u' || argl < 5 || argl > 7) |
if (buf[iarg] != 'u' || argl < 5 || argl > 7) |
break; |
break; |
if (argl == 7 && |
if (argl == 7 && /* beyond the Unicode range */ |
(buf[iarg + 1] != '1' || buf[iarg + 2] != '0')) { |
(buf[iarg + 1] != '1' || buf[iarg + 2] != '0')) { |
err = MANDOCERR_ESC_BADCHAR; |
err = MANDOCERR_ESC_BADCHAR; |
break; |
break; |
Line 482 roff_escape(const char *buf, const int ln, const int a |
|
Line 481 roff_escape(const char *buf, const int ln, const int a |
|
err = MANDOCERR_ESC_BADCHAR; |
err = MANDOCERR_ESC_BADCHAR; |
break; |
break; |
} |
} |
if (argl == 5 && buf[iarg + 1] == 'D' && |
if (argl == 5 && /* UTF-16 surrogate */ |
strchr("89ABCDEF", buf[iarg + 2]) != NULL) { |
toupper((unsigned char)buf[iarg + 1]) == 'D' && |
|
strchr("89ABCDEFabcdef", buf[iarg + 2]) != NULL) { |
err = MANDOCERR_ESC_BADCHAR; |
err = MANDOCERR_ESC_BADCHAR; |
break; |
break; |
} |
} |