aboutsummaryrefslogtreecommitdiff
path: root/src/util
diff options
context:
space:
mode:
authorMartin Schanzenbach <schanzen@gnunet.org>2022-02-15 23:36:23 +0100
committerMartin Schanzenbach <schanzen@gnunet.org>2022-02-15 23:36:23 +0100
commite391a0a83f1336478d2171bbae321689b7fe8d03 (patch)
tree55d2f347612f680dd98953fdbad3bbc1f3abc1ea /src/util
parent9c0ac480cb4148a0970c915a7d8aadc2ca47874d (diff)
downloadgnunet-e391a0a83f1336478d2171bbae321689b7fe8d03.tar.gz
gnunet-e391a0a83f1336478d2171bbae321689b7fe8d03.zip
-sanitize utf8 api a bit
Diffstat (limited to 'src/util')
-rw-r--r--src/util/crypto_hash.c3
-rw-r--r--src/util/strings.c43
-rw-r--r--src/util/test_strings.c7
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;
393fail: 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
429void 429char *
430GNUNET_STRINGS_utf8_normalize (const char *input, 430GNUNET_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
446void 450enum GNUNET_GenericReturnValue
447GNUNET_STRINGS_utf8_tolower (const char *input, 451GNUNET_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
465void 472enum GNUNET_GenericReturnValue
466GNUNET_STRINGS_utf8_toupper (const char *input, 473GNUNET_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 }
1744END: 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