From ef3bd2d8c30f0fab0220a88629b4e3be761542e0 Mon Sep 17 00:00:00 2001 From: Seven Du Date: Wed, 9 Oct 2024 00:34:22 +0800 Subject: [PATCH] [core] fix base64 decoded size when encoded string contains padding = --- src/switch_utils.c | 2 +- tests/unit/switch_utils.c | 43 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/switch_utils.c b/src/switch_utils.c index aa3fc74cae..1293ca3fbd 100644 --- a/src/switch_utils.c +++ b/src/switch_utils.c @@ -1076,7 +1076,7 @@ SWITCH_DECLARE(switch_size_t) switch_b64_decode(const char *in, char *out, switc l64[(int) switch_b64_table[i]] = (char) i; } - for (ip = in; ip && *ip; ip++) { + for (ip = in; ip && *ip && (*ip != '='); ip++) { c = l64[(int) *ip]; if (c == -1) { continue; diff --git a/tests/unit/switch_utils.c b/tests/unit/switch_utils.c index 1fc291ea96..391ec6e8e6 100644 --- a/tests/unit/switch_utils.c +++ b/tests/unit/switch_utils.c @@ -80,6 +80,49 @@ FST_TEST_BEGIN(b64) } FST_TEST_END() +FST_TEST_BEGIN(b64_pad2) +{ + switch_size_t size; + char str[] = {0, 0, 0, 0}; + unsigned char b64_str[128]; + char decoded_str[128]; + int i; + switch_status_t status = switch_b64_encode((unsigned char *)str, sizeof(str), b64_str, sizeof(b64_str)); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "b64_str: %s\n", b64_str); + fst_check(status == SWITCH_STATUS_SUCCESS); + fst_check_string_equals((const char *)b64_str, "AAAAAA=="); + + size = switch_b64_decode((const char *)b64_str, decoded_str, sizeof(decoded_str)); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "decoded_str: %s\n", decoded_str); + fst_check_string_equals(decoded_str, str); + fst_check(size == sizeof(str) + 1); + for (i = 0; i < sizeof(str); i++) { + fst_check(decoded_str[i] == str[i]); + } +} +FST_TEST_END() + +FST_TEST_BEGIN(b64_pad1) +{ + switch_size_t size; + char str[] = {0, 0, 0, 0, 0}; + unsigned char b64_str[128]; + char decoded_str[128]; + int i; + switch_status_t status = switch_b64_encode((unsigned char *)str, sizeof(str), b64_str, sizeof(b64_str)); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "b64_str: %s\n", b64_str); + fst_check(status == SWITCH_STATUS_SUCCESS); + fst_check_string_equals((const char *)b64_str, "AAAAAAA="); + + size = switch_b64_decode((const char *)b64_str, decoded_str, sizeof(decoded_str)); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "decoded_str: %s\n", decoded_str); + fst_check_string_equals(decoded_str, str); + fst_check(size == sizeof(str) + 1); + for (i = 0; i < sizeof(str); i++) { + fst_check(decoded_str[i] == str[i]); + } +} +FST_TEST_END() FST_SUITE_END()