From 0072151e81aec9c504f2be93f0562f270ffac2c8 Mon Sep 17 00:00:00 2001 From: Karl Williamson Date: Fri, 3 Dec 2010 09:15:59 -0700 Subject: [PATCH] utf8.h: Need to make sure macro result fits in byte 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utf8.h b/utf8.h index 8d12f8d..be14a94 100644 --- 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))) -- 2.7.4