From 3e6628c847c0c6a6929f14933b029b1261dd6ca9 Mon Sep 17 00:00:00 2001 From: Frank Mehnert Date: Mon, 29 Jul 2024 13:58:02 +0200 Subject: iconv: fix parameter type of utf8seq_is_{overlong,surrogate,illegal} Use `unsigned char *s` rather than `char *s`. First, this fixes compiler warnings when these functions are called from utf8dec_wchar() passing the `in` pointer of type `unsigned char *`. Second, these functions are always called with characters >= 0x80 so the sign bit is set. Shifting right a negative signed value will insert `1` from the left side, so `foo >> 1` where foo is negative will always have the sign bit set. So at least "case 2" would never return true. There is a similar problem with tests like (*(s+1) >= 0xA0) && (*(s+1) <= 0xBF) This condition is always false with `char *s`. Signed-off-by: Marcus Haehnel --- libiconv/iconv.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libiconv/iconv.c b/libiconv/iconv.c index 6876ab5f7..095932fd6 100644 --- a/libiconv/iconv.c +++ b/libiconv/iconv.c @@ -242,7 +242,7 @@ static inline int utf8enc_wchar(char *outb, wchar_t c) } } -static inline int utf8seq_is_overlong(char *s, int n) +static inline int utf8seq_is_overlong(unsigned char *s, int n) { switch (n) { @@ -268,12 +268,12 @@ static inline int utf8seq_is_overlong(char *s, int n) return 0; } -static inline int utf8seq_is_surrogate(char *s, int n) +static inline int utf8seq_is_surrogate(unsigned char *s, int n) { return ((n == 3) && (*s == 0xED) && (*(s+1) >= 0xA0) && (*(s+1) <= 0xBF)); } -static inline int utf8seq_is_illegal(char *s, int n) +static inline int utf8seq_is_illegal(unsigned char *s, int n) { return ((n == 3) && (*s == 0xEF) && (*(s+1) == 0xBF) && (*(s+2) >= 0xBE) && (*(s+2) <= 0xBF)); -- cgit v1.2.3