| From a68075908a37850918ad96b056acc9ac4ce1bd90 Mon Sep 17 00:00:00 2001 |
| From: Jason Andryuk <jandryuk@gmail.com> |
| Date: Fri, 12 Feb 2016 23:13:33 +0000 |
| Subject: lib/ucs2_string: Correct ucs2 -> utf8 conversion |
| |
| From: Jason Andryuk <jandryuk@gmail.com> |
| |
| commit a68075908a37850918ad96b056acc9ac4ce1bd90 upstream. |
| |
| The comparisons should be >= since 0x800 and 0x80 require an additional bit |
| to store. |
| |
| For the 3 byte case, the existing shift would drop off 2 more bits than |
| intended. |
| |
| For the 2 byte case, there should be 5 bits bits in byte 1, and 6 bits in |
| byte 2. |
| |
| Signed-off-by: Jason Andryuk <jandryuk@gmail.com> |
| Reviewed-by: Laszlo Ersek <lersek@redhat.com> |
| Cc: Peter Jones <pjones@redhat.com> |
| Cc: Matthew Garrett <mjg59@coreos.com> |
| Cc: "Lee, Chun-Yi" <jlee@suse.com> |
| Signed-off-by: Matt Fleming <matt@codeblueprint.co.uk> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| lib/ucs2_string.c | 14 +++++++------- |
| 1 file changed, 7 insertions(+), 7 deletions(-) |
| |
| --- a/lib/ucs2_string.c |
| +++ b/lib/ucs2_string.c |
| @@ -59,9 +59,9 @@ ucs2_utf8size(const ucs2_char_t *src) |
| for (i = 0; i < ucs2_strlen(src); i++) { |
| u16 c = src[i]; |
| |
| - if (c > 0x800) |
| + if (c >= 0x800) |
| j += 3; |
| - else if (c > 0x80) |
| + else if (c >= 0x80) |
| j += 2; |
| else |
| j += 1; |
| @@ -88,19 +88,19 @@ ucs2_as_utf8(u8 *dest, const ucs2_char_t |
| for (i = 0; maxlength && i < limit; i++) { |
| u16 c = src[i]; |
| |
| - if (c > 0x800) { |
| + if (c >= 0x800) { |
| if (maxlength < 3) |
| break; |
| maxlength -= 3; |
| dest[j++] = 0xe0 | (c & 0xf000) >> 12; |
| - dest[j++] = 0x80 | (c & 0x0fc0) >> 8; |
| + dest[j++] = 0x80 | (c & 0x0fc0) >> 6; |
| dest[j++] = 0x80 | (c & 0x003f); |
| - } else if (c > 0x80) { |
| + } else if (c >= 0x80) { |
| if (maxlength < 2) |
| break; |
| maxlength -= 2; |
| - dest[j++] = 0xc0 | (c & 0xfe0) >> 5; |
| - dest[j++] = 0x80 | (c & 0x01f); |
| + dest[j++] = 0xc0 | (c & 0x7c0) >> 6; |
| + dest[j++] = 0x80 | (c & 0x03f); |
| } else { |
| maxlength -= 1; |
| dest[j++] = c & 0x7f; |