]> err.no Git - moreutils/commitdiff
isutf8: Reject UTF-8-encoded UTF-16 surrogates. Closes: #525301 (Thanks, Jakub Wilk...
authorJoey Hess <joey@gnu.kitenet.net>
Tue, 5 May 2009 19:06:34 +0000 (15:06 -0400)
committerJoey Hess <joey@gnu.kitenet.net>
Tue, 5 May 2009 19:06:34 +0000 (15:06 -0400)
check-isutf8
debian/changelog
isutf8.c

index 3abb315c7a9592c44f884cf5817dd062f9804f43..83a4eed00f82e3bcc81856149b47cffc4091f9aa 100755 (executable)
@@ -39,5 +39,8 @@ check 1 '\xc2'
 check 1 '\xc2\x20'
 check 1 '\x20\xc2'
 check 1 '\300\200'
+check 1 '\xed\xa0\x88\xed\xbd\x85' # UTF-16 surrogates
+check 1 '\xef\xbf\xbe' # 0xFFFE
+check 1 '\xef\xbf\xbf' # 0xFFFF
 
 exit $failed
index aac1f3f4088ff9e131c090be10f1efc5db019d51..7b638cbb89c368e94c30ddc650d8c7b8f5815cfa 100644 (file)
@@ -3,6 +3,8 @@ moreutils (0.35) UNRELEASED; urgency=low
   * ifdata: Don't assume that all interface names are 6 characters or less,
     for instance "wmaster0" is longer. Increase the limit to 20 characters.
     Closes: #526654 (Thanks, Alan Pope)
+  * isutf8: Reject UTF-8-encoded UTF-16 surrogates. Closes: #525301
+    (Thanks, Jakub Wilk and liw)
 
  -- Joey Hess <joeyh@debian.org>  Sat, 02 May 2009 20:40:23 -0400
 
index 4306c7d7a22b230db58248e3317ada4a1f60bb34..c5f5eeb667c425c3ef02516712c08acb72f3f557 100644 (file)
--- a/isutf8.c
+++ b/isutf8.c
@@ -127,6 +127,14 @@ static unsigned long decodeutf8(unsigned char *buf, int nbytes)
                             return INVALID_CHAR;
                 u = (u << 6) | (buf[j] & 0x3f);
         }
+
+        /* Conforming UTF-8 cannot contain codes 0xd800–0xdfff (UTF-16 
+           surrogates) as well as 0xfffe and 0xffff. */
+        if (u >= 0xD800 && u <= 0xDFFF)
+            return INVALID_CHAR;
+        if (u == 0xFFFE || u == 0xFFFF)
+            return INVALID_CHAR;
+
         return u;
 }
 
@@ -145,7 +153,7 @@ static int is_utf8_byte_stream(FILE *file, char *filename, int quiet) {
         int nbytes, nbytes2;
         int c;
         unsigned long code;
-       unsigned long line, col, byteoff;
+        unsigned long line, col, byteoff;
 
         nbytes = 0;
         line = 1;