diff options
author | Martin Schanzenbach <schanzen@gnunet.org> | 2022-02-15 23:36:23 +0100 |
---|---|---|
committer | Martin Schanzenbach <schanzen@gnunet.org> | 2022-02-15 23:36:23 +0100 |
commit | e391a0a83f1336478d2171bbae321689b7fe8d03 (patch) | |
tree | 55d2f347612f680dd98953fdbad3bbc1f3abc1ea /src/util | |
parent | 9c0ac480cb4148a0970c915a7d8aadc2ca47874d (diff) | |
download | gnunet-e391a0a83f1336478d2171bbae321689b7fe8d03.tar.gz gnunet-e391a0a83f1336478d2171bbae321689b7fe8d03.zip |
-sanitize utf8 api a bit
Diffstat (limited to 'src/util')
-rw-r--r-- | src/util/crypto_hash.c | 3 | ||||
-rw-r--r-- | src/util/strings.c | 43 | ||||
-rw-r--r-- | src/util/test_strings.c | 7 |
3 files changed, 32 insertions, 21 deletions
diff --git a/src/util/crypto_hash.c b/src/util/crypto_hash.c index dcd46e5f9..f516f5474 100644 --- a/src/util/crypto_hash.c +++ b/src/util/crypto_hash.c | |||
@@ -76,7 +76,8 @@ GNUNET_CRYPTO_hash_from_string2 (const char *enc, | |||
76 | char upper_enc[enclen]; | 76 | char upper_enc[enclen]; |
77 | char *up_ptr = upper_enc; | 77 | char *up_ptr = upper_enc; |
78 | 78 | ||
79 | GNUNET_STRINGS_utf8_toupper (enc, up_ptr); | 79 | if (GNUNET_OK != GNUNET_STRINGS_utf8_toupper (enc, up_ptr)) |
80 | return GNUNET_SYSERR; | ||
80 | 81 | ||
81 | return GNUNET_STRINGS_string_to_data (upper_enc, enclen, | 82 | return GNUNET_STRINGS_string_to_data (upper_enc, enclen, |
82 | (unsigned char *) result, | 83 | (unsigned char *) result, |
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, | |||
390 | ret[encoded_string_length] = '\0'; | 390 | ret[encoded_string_length] = '\0'; |
391 | free (encoded_string); | 391 | free (encoded_string); |
392 | return ret; | 392 | return ret; |
393 | fail: | 393 | fail: |
394 | LOG (GNUNET_ERROR_TYPE_WARNING, | 394 | LOG (GNUNET_ERROR_TYPE_WARNING, |
395 | _ ("Character sets requested were `%s'->`%s'\n"), | 395 | _ ("Character sets requested were `%s'->`%s'\n"), |
396 | "UTF-8", | 396 | "UTF-8", |
@@ -426,24 +426,28 @@ GNUNET_STRINGS_from_utf8 (const char *input, | |||
426 | } | 426 | } |
427 | 427 | ||
428 | 428 | ||
429 | void | 429 | char * |
430 | GNUNET_STRINGS_utf8_normalize (const char *input, | 430 | GNUNET_STRINGS_utf8_normalize (const char *input) |
431 | char *output) | ||
432 | { | 431 | { |
433 | uint8_t *tmp; | 432 | uint8_t *tmp; |
434 | size_t len; | 433 | size_t len; |
435 | 434 | char *output; | |
436 | tmp = u8_normalize (UNINORM_NFKC, | 435 | tmp = u8_tolower ((uint8_t *) input, |
437 | (uint8_t *) input, | 436 | strlen ((char *) input), |
438 | strlen ((char*) input), | 437 | NULL, |
439 | NULL, | 438 | UNINORM_NFKC, |
440 | &len); | 439 | NULL, |
440 | &len); | ||
441 | if (NULL == tmp) | ||
442 | return NULL; | ||
443 | output = GNUNET_malloc (len + 1); | ||
441 | GNUNET_memcpy (output, tmp, len); | 444 | GNUNET_memcpy (output, tmp, len); |
442 | output[len] = '\0'; | 445 | output[len] = '\0'; |
443 | free (tmp); | 446 | free (tmp); |
447 | return output; | ||
444 | } | 448 | } |
445 | 449 | ||
446 | void | 450 | enum GNUNET_GenericReturnValue |
447 | GNUNET_STRINGS_utf8_tolower (const char *input, | 451 | GNUNET_STRINGS_utf8_tolower (const char *input, |
448 | char *output) | 452 | char *output) |
449 | { | 453 | { |
@@ -456,13 +460,16 @@ GNUNET_STRINGS_utf8_tolower (const char *input, | |||
456 | UNINORM_NFD, | 460 | UNINORM_NFD, |
457 | NULL, | 461 | NULL, |
458 | &len); | 462 | &len); |
463 | if (NULL == tmp_in) | ||
464 | return GNUNET_SYSERR; | ||
459 | GNUNET_memcpy (output, tmp_in, len); | 465 | GNUNET_memcpy (output, tmp_in, len); |
460 | output[len] = '\0'; | 466 | output[len] = '\0'; |
461 | free (tmp_in); | 467 | GNUNET_free (tmp_in); |
468 | return GNUNET_OK; | ||
462 | } | 469 | } |
463 | 470 | ||
464 | 471 | ||
465 | void | 472 | enum GNUNET_GenericReturnValue |
466 | GNUNET_STRINGS_utf8_toupper (const char *input, | 473 | GNUNET_STRINGS_utf8_toupper (const char *input, |
467 | char *output) | 474 | char *output) |
468 | { | 475 | { |
@@ -475,9 +482,13 @@ GNUNET_STRINGS_utf8_toupper (const char *input, | |||
475 | UNINORM_NFD, | 482 | UNINORM_NFD, |
476 | NULL, | 483 | NULL, |
477 | &len); | 484 | &len); |
485 | if (NULL == tmp_in) | ||
486 | return GNUNET_SYSERR; | ||
487 | /* 0-terminator does not fit */ | ||
478 | GNUNET_memcpy (output, tmp_in, len); | 488 | GNUNET_memcpy (output, tmp_in, len); |
479 | output[len] = '\0'; | 489 | output[len] = '\0'; |
480 | free (tmp_in); | 490 | GNUNET_free (tmp_in); |
491 | return GNUNET_OK; | ||
481 | } | 492 | } |
482 | 493 | ||
483 | 494 | ||
@@ -1604,7 +1615,7 @@ GNUNET_STRINGS_base64_encode (const void *in, | |||
1604 | char *opt; | 1615 | char *opt; |
1605 | 1616 | ||
1606 | ret = 0; | 1617 | ret = 0; |
1607 | GNUNET_assert (len < SIZE_MAX / 4 * 3 ); | 1618 | GNUNET_assert (len < SIZE_MAX / 4 * 3); |
1608 | opt = GNUNET_malloc (2 + (len * 4 / 3) + 8); | 1619 | opt = GNUNET_malloc (2 + (len * 4 / 3) + 8); |
1609 | for (size_t i = 0; i < len; ++i) | 1620 | for (size_t i = 0; i < len; ++i) |
1610 | { | 1621 | { |
@@ -1741,7 +1752,7 @@ GNUNET_STRINGS_base64_decode (const char *data, | |||
1741 | output[ret++] = c; | 1752 | output[ret++] = c; |
1742 | } | 1753 | } |
1743 | } | 1754 | } |
1744 | END: | 1755 | END: |
1745 | *out = output; | 1756 | *out = output; |
1746 | return ret; | 1757 | return ret; |
1747 | } | 1758 | } |
diff --git a/src/util/test_strings.c b/src/util/test_strings.c index 1ecd31464..cccffcaf5 100644 --- a/src/util/test_strings.c +++ b/src/util/test_strings.c | |||
@@ -114,10 +114,9 @@ main (int argc, char *argv[]) | |||
114 | /* Normalization */ | 114 | /* Normalization */ |
115 | r = "q\u0307\u0323"; /* Non-canonical order */ | 115 | r = "q\u0307\u0323"; /* Non-canonical order */ |
116 | 116 | ||
117 | GNUNET_STRINGS_utf8_normalize (r, | 117 | b = GNUNET_STRINGS_utf8_normalize (r); |
118 | buf); | 118 | GNUNET_assert (0 == strcmp ("q\u0323\u0307", b)); |
119 | GNUNET_assert (0 == strcmp ("q\u0323\u0307", buf)); | 119 | GNUNET_free (b); |
120 | |||
121 | b = GNUNET_STRINGS_to_utf8 ("TEST", 4, "ASCII"); | 120 | b = GNUNET_STRINGS_to_utf8 ("TEST", 4, "ASCII"); |
122 | WANT ("TEST", b); | 121 | WANT ("TEST", b); |
123 | 122 | ||