=================================================================== RCS file: /cvs/mandoc/mandoc.c,v retrieving revision 1.86 retrieving revision 1.88 diff -u -p -r1.86 -r1.88 --- mandoc/mandoc.c 2014/08/18 09:11:47 1.86 +++ mandoc/mandoc.c 2014/10/28 13:24:44 1.88 @@ -1,4 +1,4 @@ -/* $Id: mandoc.c,v 1.86 2014/08/18 09:11:47 kristaps Exp $ */ +/* $Id: mandoc.c,v 1.88 2014/10/28 13:24:44 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2011, 2012, 2013, 2014 Ingo Schwarze @@ -79,24 +79,13 @@ mandoc_escape(const char **end, const char **start, in break; case '[': gly = ESCAPE_SPECIAL; - /* - * Unicode escapes are defined in groff as \[uXXXX] to - * \[u10FFFF], where the contained value must be a valid - * Unicode codepoint. Here, however, only check whether - * it's not a zero-width escape. - */ - if ('u' == (*start)[0] && ']' != (*start)[1]) - gly = ESCAPE_UNICODE; term = ']'; break; case 'C': if ('\'' != **start) return(ESCAPE_ERROR); *start = ++*end; - if ('u' == (*start)[0] && '\'' != (*start)[1]) - gly = ESCAPE_UNICODE; - else - gly = ESCAPE_SPECIAL; + gly = ESCAPE_SPECIAL; term = '\''; break; @@ -344,6 +333,21 @@ mandoc_escape(const char **end, const char **start, in case ESCAPE_SPECIAL: if (1 == *sz && 'c' == **start) gly = ESCAPE_NOSPACE; + /* + * Unicode escapes are defined in groff as \[u0000] + * to \[u10FFFF], where the contained value must be + * a valid Unicode codepoint. Here, however, only + * check the length and range. + */ + if (**start != 'u' || *sz < 5 || *sz > 7) + break; + if (*sz == 7 && ((*start)[1] != '1' || (*start)[2] != '0')) + break; + if (*sz == 6 && (*start)[1] == '0') + break; + if ((int)strspn(*start + 1, "0123456789ABCDEFabcdef") + + 1 == *sz) + gly = ESCAPE_UNICODE; break; default: break;