diff options
author | Christian Grothoff <christian@grothoff.org> | 2020-04-03 17:03:35 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2020-04-03 17:03:35 +0200 |
commit | 55bff52a2a38b9e768b929b4b6204ac02f074cbf (patch) | |
tree | ff92e8a3772021d27dcf9f1365348679dc036b31 /src/util | |
parent | 0541fd19426994e42decf5987253978634e1f865 (diff) | |
download | gnunet-55bff52a2a38b9e768b929b4b6204ac02f074cbf.tar.gz gnunet-55bff52a2a38b9e768b929b4b6204ac02f074cbf.zip |
fix #6159 and related issues
Diffstat (limited to 'src/util')
-rw-r--r-- | src/util/strings.c | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/src/util/strings.c b/src/util/strings.c index 54a594c51..8740eab58 100644 --- a/src/util/strings.c +++ b/src/util/strings.c | |||
@@ -521,9 +521,14 @@ fail: | |||
521 | * string is returned. | 521 | * string is returned. |
522 | */ | 522 | */ |
523 | char * | 523 | char * |
524 | GNUNET_STRINGS_to_utf8 (const char *input, size_t len, const char *charset) | 524 | GNUNET_STRINGS_to_utf8 (const char *input, |
525 | size_t len, | ||
526 | const char *charset) | ||
525 | { | 527 | { |
526 | return GNUNET_STRINGS_conv (input, len, charset, "UTF-8"); | 528 | return GNUNET_STRINGS_conv (input, |
529 | len, | ||
530 | charset, | ||
531 | "UTF-8"); | ||
527 | } | 532 | } |
528 | 533 | ||
529 | 534 | ||
@@ -539,9 +544,14 @@ GNUNET_STRINGS_to_utf8 (const char *input, size_t len, const char *charset) | |||
539 | * string is returned. | 544 | * string is returned. |
540 | */ | 545 | */ |
541 | char * | 546 | char * |
542 | GNUNET_STRINGS_from_utf8 (const char *input, size_t len, const char *charset) | 547 | GNUNET_STRINGS_from_utf8 (const char *input, |
548 | size_t len, | ||
549 | const char *charset) | ||
543 | { | 550 | { |
544 | return GNUNET_STRINGS_conv (input, len, "UTF-8", charset); | 551 | return GNUNET_STRINGS_conv (input, |
552 | len, | ||
553 | "UTF-8", | ||
554 | charset); | ||
545 | } | 555 | } |
546 | 556 | ||
547 | 557 | ||
@@ -871,6 +881,7 @@ GNUNET_STRINGS_data_to_string (const void *data, | |||
871 | unsigned int vbit; | 881 | unsigned int vbit; |
872 | const unsigned char *udata; | 882 | const unsigned char *udata; |
873 | 883 | ||
884 | GNUNET_assert (size < SIZE_MAX / 8 - 4); | ||
874 | udata = data; | 885 | udata = data; |
875 | if (out_size < (size * 8 + 4) / 5) | 886 | if (out_size < (size * 8 + 4) / 5) |
876 | { | 887 | { |
@@ -930,7 +941,10 @@ GNUNET_STRINGS_data_to_string_alloc (const void *buf, size_t size) | |||
930 | len += 5 - len % 5; | 941 | len += 5 - len % 5; |
931 | len /= 5; | 942 | len /= 5; |
932 | str_buf = GNUNET_malloc (len + 1); | 943 | str_buf = GNUNET_malloc (len + 1); |
933 | end = GNUNET_STRINGS_data_to_string (buf, size, str_buf, len); | 944 | end = GNUNET_STRINGS_data_to_string (buf, |
945 | size, | ||
946 | str_buf, | ||
947 | len); | ||
934 | if (NULL == end) | 948 | if (NULL == end) |
935 | { | 949 | { |
936 | GNUNET_free (str_buf); | 950 | GNUNET_free (str_buf); |
@@ -1404,15 +1418,14 @@ static char *const * | |||
1404 | _make_continuous_arg_copy (int argc, char *const *argv) | 1418 | _make_continuous_arg_copy (int argc, char *const *argv) |
1405 | { | 1419 | { |
1406 | size_t argvsize = 0; | 1420 | size_t argvsize = 0; |
1407 | int i; | ||
1408 | char **new_argv; | 1421 | char **new_argv; |
1409 | char *p; | 1422 | char *p; |
1410 | 1423 | ||
1411 | for (i = 0; i < argc; i++) | 1424 | for (int i = 0; i < argc; i++) |
1412 | argvsize += strlen (argv[i]) + 1 + sizeof(char *); | 1425 | argvsize += strlen (argv[i]) + 1 + sizeof(char *); |
1413 | new_argv = GNUNET_malloc (argvsize + sizeof(char *)); | 1426 | new_argv = GNUNET_malloc (argvsize + sizeof(char *)); |
1414 | p = (char *) &new_argv[argc + 1]; | 1427 | p = (char *) &new_argv[argc + 1]; |
1415 | for (i = 0; i < argc; i++) | 1428 | for (int i = 0; i < argc; i++) |
1416 | { | 1429 | { |
1417 | new_argv[i] = p; | 1430 | new_argv[i] = p; |
1418 | strcpy (p, argv[i]); | 1431 | strcpy (p, argv[i]); |
@@ -1862,6 +1875,7 @@ GNUNET_STRINGS_base64_encode (const void *in, size_t len, char **output) | |||
1862 | char *opt; | 1875 | char *opt; |
1863 | 1876 | ||
1864 | ret = 0; | 1877 | ret = 0; |
1878 | GNUNET_assert (len / 4 < SIZE_MAX); | ||
1865 | opt = GNUNET_malloc (2 + (len * 4 / 3) + 8); | 1879 | opt = GNUNET_malloc (2 + (len * 4 / 3) + 8); |
1866 | for (size_t i = 0; i < len; ++i) | 1880 | for (size_t i = 0; i < len; ++i) |
1867 | { | 1881 | { |
@@ -1971,6 +1985,7 @@ GNUNET_STRINGS_base64_decode (const char *data, size_t len, void **out) | |||
1971 | goto END; \ | 1985 | goto END; \ |
1972 | } | 1986 | } |
1973 | 1987 | ||
1988 | GNUNET_assert (len / 3 < SIZE_MAX); | ||
1974 | output = GNUNET_malloc ((len * 3 / 4) + 8); | 1989 | output = GNUNET_malloc ((len * 3 / 4) + 8); |
1975 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 1990 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
1976 | "base64_decode decoding len=%d\n", | 1991 | "base64_decode decoding len=%d\n", |
@@ -2034,6 +2049,7 @@ GNUNET_STRINGS_base64url_decode (const char *data, size_t len, void **out) | |||
2034 | size_t ret; | 2049 | size_t ret; |
2035 | 2050 | ||
2036 | /* make enough space for padding */ | 2051 | /* make enough space for padding */ |
2052 | GNUNET_assert (len < SIZE_MAX - 3); | ||
2037 | s = GNUNET_malloc (len + 3); | 2053 | s = GNUNET_malloc (len + 3); |
2038 | memcpy (s, data, len); | 2054 | memcpy (s, data, len); |
2039 | 2055 | ||