From e391a0a83f1336478d2171bbae321689b7fe8d03 Mon Sep 17 00:00:00 2001 From: Martin Schanzenbach Date: Tue, 15 Feb 2022 23:36:23 +0100 Subject: -sanitize utf8 api a bit --- src/util/strings.c | 43 +++++++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 16 deletions(-) (limited to 'src/util/strings.c') diff --git a/src/util/strings.c b/src/util/strings.c index c63870e42..75e45ba6d 100644 --- a/src/util/strings.c +++ b/src/util/strings.c @@ -390,7 +390,7 @@ GNUNET_STRINGS_conv (const char *input, ret[encoded_string_length] = '\0'; free (encoded_string); return ret; -fail: + fail: LOG (GNUNET_ERROR_TYPE_WARNING, _ ("Character sets requested were `%s'->`%s'\n"), "UTF-8", @@ -426,24 +426,28 @@ GNUNET_STRINGS_from_utf8 (const char *input, } -void -GNUNET_STRINGS_utf8_normalize (const char *input, - char *output) +char * +GNUNET_STRINGS_utf8_normalize (const char *input) { uint8_t *tmp; size_t len; - - tmp = u8_normalize (UNINORM_NFKC, - (uint8_t *) input, - strlen ((char*) input), - NULL, - &len); + char *output; + tmp = u8_tolower ((uint8_t *) input, + strlen ((char *) input), + NULL, + UNINORM_NFKC, + NULL, + &len); + if (NULL == tmp) + return NULL; + output = GNUNET_malloc (len + 1); GNUNET_memcpy (output, tmp, len); output[len] = '\0'; free (tmp); + return output; } -void +enum GNUNET_GenericReturnValue GNUNET_STRINGS_utf8_tolower (const char *input, char *output) { @@ -456,13 +460,16 @@ GNUNET_STRINGS_utf8_tolower (const char *input, UNINORM_NFD, NULL, &len); + if (NULL == tmp_in) + return GNUNET_SYSERR; GNUNET_memcpy (output, tmp_in, len); output[len] = '\0'; - free (tmp_in); + GNUNET_free (tmp_in); + return GNUNET_OK; } -void +enum GNUNET_GenericReturnValue GNUNET_STRINGS_utf8_toupper (const char *input, char *output) { @@ -475,9 +482,13 @@ GNUNET_STRINGS_utf8_toupper (const char *input, UNINORM_NFD, NULL, &len); + if (NULL == tmp_in) + return GNUNET_SYSERR; + /* 0-terminator does not fit */ GNUNET_memcpy (output, tmp_in, len); output[len] = '\0'; - free (tmp_in); + GNUNET_free (tmp_in); + return GNUNET_OK; } @@ -1604,7 +1615,7 @@ GNUNET_STRINGS_base64_encode (const void *in, char *opt; ret = 0; - GNUNET_assert (len < SIZE_MAX / 4 * 3 ); + GNUNET_assert (len < SIZE_MAX / 4 * 3); opt = GNUNET_malloc (2 + (len * 4 / 3) + 8); for (size_t i = 0; i < len; ++i) { @@ -1741,7 +1752,7 @@ GNUNET_STRINGS_base64_decode (const char *data, output[ret++] = c; } } -END: + END: *out = output; return ret; } -- cgit v1.2.3