diff options
author | Jeffrey Stedfast <fejj@gnome.org> | 2013-08-15 03:40:59 +0400 |
---|---|---|
committer | Jeffrey Stedfast <fejj@gnome.org> | 2013-08-15 03:41:38 +0400 |
commit | a81cd6dae81a7077a7f014948c78075da08f02f7 (patch) | |
tree | 5a1e8a7c48893f26646e6524bdf28c546a58aed0 /eglib | |
parent | 384f1d8af5ee4c129a527884a012914795833057 (diff) |
[eglib] Fixed g_utf8_to_utf16_general() to handle invalid utf8
Diffstat (limited to 'eglib')
-rw-r--r-- | eglib/src/giconv.c | 57 |
1 files changed, 34 insertions, 23 deletions
diff --git a/eglib/src/giconv.c b/eglib/src/giconv.c index f70a417f5be..ced63176213 100644 --- a/eglib/src/giconv.c +++ b/eglib/src/giconv.c @@ -921,7 +921,7 @@ eg_utf8_to_utf16_general (const gchar *str, glong len, glong *items_read, glong size_t inleft; char *inptr; gunichar c; - int n; + int u, n; g_return_val_if_fail (str != NULL, NULL); @@ -930,6 +930,7 @@ eg_utf8_to_utf16_general (const gchar *str, glong len, glong *items_read, glong g_set_error (err, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED, "Conversions with embedded nulls must pass the string length"); return NULL; } + len = strlen (str); } @@ -937,29 +938,18 @@ eg_utf8_to_utf16_general (const gchar *str, glong len, glong *items_read, glong inleft = len; while (inleft > 0) { - if ((n = decode_utf8 (inptr, inleft, &c)) < 0) { - if (errno == EILSEQ) { - g_set_error (err, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, - "Illegal byte sequence encounted in the input."); - } else if (items_read) { - /* partial input is ok if we can let our caller know... */ - break; - } else { - g_set_error (err, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT, - "Partial byte sequence encountered in the input."); - } - - if (items_read) - *items_read = inptr - str; - - if (items_written) - *items_written = 0; - - return NULL; - } else if (c == 0 && !include_nuls) + if ((n = decode_utf8 (inptr, inleft, &c)) < 0) + goto error; + + if (c == 0 && !include_nuls) break; - outlen += g_unichar_to_utf16 (c, NULL); + if ((u = g_unichar_to_utf16 (c, NULL)) < 0) { + errno = EILSEQ; + goto error; + } + + outlen += u; inleft -= n; inptr += n; } @@ -977,7 +967,8 @@ eg_utf8_to_utf16_general (const gchar *str, glong len, glong *items_read, glong while (inleft > 0) { if ((n = decode_utf8 (inptr, inleft, &c)) < 0) break; - else if (c == 0 && !include_nuls) + + if (c == 0 && !include_nuls) break; outptr += g_unichar_to_utf16 (c, outptr); @@ -988,6 +979,26 @@ eg_utf8_to_utf16_general (const gchar *str, glong len, glong *items_read, glong *outptr = '\0'; return outbuf; + + error: + if (errno == EILSEQ) { + g_set_error (err, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + "Illegal byte sequence encounted in the input."); + } else if (items_read) { + /* partial input is ok if we can let our caller know... */ + break; + } else { + g_set_error (err, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT, + "Partial byte sequence encountered in the input."); + } + + if (items_read) + *items_read = inptr - str; + + if (items_written) + *items_written = 0; + + return NULL; } gunichar2 * |