utf8.h: Need to make sure macro result fits in byte
authorKarl Williamson <public@khwilliamson.com>
Fri, 3 Dec 2010 16:15:59 +0000 (09:15 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Sat, 4 Dec 2010 19:48:57 +0000 (11:48 -0800)
The UTF8_TWO_BYTE_HI_nocast() macro has an error in it, in that the
START_MARK is larger than a byte, and only the last 8 bits of it are
relevant.  This hasn't caused a problem because the macro hasn't been
called directly, but from other macros that make sure the result gets
cast to a U8.

utf8.h

diff --git a/utf8.h b/utf8.h
index 8d12f8d..be14a94 100644 (file)
--- a/utf8.h
+++ b/utf8.h
@@ -183,7 +183,7 @@ Perl's extended UTF-8 means we can have start bytes up to FF.
  * bytes from an ordinal that is known to fit into two bytes; it must be less
  * than 0x3FF to work across both encodings. */
 /* Nocast allows these to be used in the case label of a switch statement */
-#define UTF8_TWO_BYTE_HI_nocast(c)     UTF_TO_NATIVE(((c) >> UTF_ACCUMULATION_SHIFT) | UTF_START_MARK(2))
+#define UTF8_TWO_BYTE_HI_nocast(c)     UTF_TO_NATIVE(((c) >> UTF_ACCUMULATION_SHIFT) | (0xFF & UTF_START_MARK(2)))
 #define UTF8_TWO_BYTE_LO_nocast(c)     UTF_TO_NATIVE(((c) & UTF_CONTINUATION_MASK) | UTF_CONTINUATION_MARK)
 
 #define UTF8_TWO_BYTE_HI(c)    ((U8) (UTF8_TWO_BYTE_HI_nocast(c)))