Merge pull request #12392 from aabadie/pr/sys/base64_fix_empty
sys/base64: fix handling of empty buffers
This commit is contained in:
commit
c20199cd3e
@ -66,8 +66,9 @@ int base64_encode(const void *data_in, size_t data_in_size,
|
|||||||
return BASE64_ERROR_DATA_IN;
|
return BASE64_ERROR_DATA_IN;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data_in_size < 1) {
|
if (data_in_size == 0) {
|
||||||
return BASE64_ERROR_DATA_IN_SIZE;
|
*base64_out_size = 0;
|
||||||
|
return BASE64_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*base64_out_size < required_size) {
|
if (*base64_out_size < required_size) {
|
||||||
@ -170,6 +171,11 @@ int base64_decode(const unsigned char *base64_in, size_t base64_in_size,
|
|||||||
return BASE64_ERROR_DATA_IN;
|
return BASE64_ERROR_DATA_IN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (base64_in_size == 0) {
|
||||||
|
*data_out_size = 0;
|
||||||
|
return BASE64_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
if (base64_in_size < 4) {
|
if (base64_in_size < 4) {
|
||||||
return BASE64_ERROR_DATA_IN_SIZE;
|
return BASE64_ERROR_DATA_IN_SIZE;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -71,8 +71,7 @@ static inline size_t base64_estimate_encode_size(size_t data_in_size)
|
|||||||
BASE64_ERROR_BUFFER_OUT_SIZE on insufficient size for encoding to `base64_out`,
|
BASE64_ERROR_BUFFER_OUT_SIZE on insufficient size for encoding to `base64_out`,
|
||||||
BASE64_ERROR_BUFFER_OUT if `base64_out` equals NULL
|
BASE64_ERROR_BUFFER_OUT if `base64_out` equals NULL
|
||||||
but the `base64_out_size` is sufficient,
|
but the `base64_out_size` is sufficient,
|
||||||
BASE64_ERROR_DATA_IN if `data_in` equals NULL,
|
BASE64_ERROR_DATA_IN if `data_in` equals NULL.
|
||||||
BASE64_ERROR_DATA_IN_SIZE if `data_in_size` is less than 1.
|
|
||||||
*/
|
*/
|
||||||
int base64_encode(const void *data_in, size_t data_in_size,
|
int base64_encode(const void *data_in, size_t data_in_size,
|
||||||
unsigned char *base64_out, size_t *base64_out_size);
|
unsigned char *base64_out, size_t *base64_out_size);
|
||||||
@ -93,7 +92,7 @@ int base64_encode(const void *data_in, size_t data_in_size,
|
|||||||
BASE64_ERROR_BUFFER_OUT if `data_out` equals NULL
|
BASE64_ERROR_BUFFER_OUT if `data_out` equals NULL
|
||||||
but the size for `data_out_size` is sufficient,
|
but the size for `data_out_size` is sufficient,
|
||||||
BASE64_ERROR_DATA_IN if `base64_in` equals NULL,
|
BASE64_ERROR_DATA_IN if `base64_in` equals NULL,
|
||||||
BASE64_ERROR_DATA_IN_SIZE if `base64_in_size` is less than 4.
|
BASE64_ERROR_DATA_IN_SIZE if `base64_in_size` is between 1 and 4.
|
||||||
*/
|
*/
|
||||||
int base64_decode(const unsigned char *base64_in, size_t base64_in_size,
|
int base64_decode(const unsigned char *base64_in, size_t base64_in_size,
|
||||||
void *data_out, size_t *data_out_size);
|
void *data_out, size_t *data_out_size);
|
||||||
|
|||||||
@ -383,6 +383,33 @@ static void test_base64_09_encode_size_determination(void)
|
|||||||
TEST_ASSERT_EQUAL_INT(required_out_size, expected_out_size);
|
TEST_ASSERT_EQUAL_INT(required_out_size, expected_out_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_base64_10_encode_empty(void)
|
||||||
|
{
|
||||||
|
unsigned char data_in[] = "";
|
||||||
|
|
||||||
|
size_t base64_out_size = 8;
|
||||||
|
unsigned char base64_out[8];
|
||||||
|
|
||||||
|
int ret = base64_encode(data_in, 0, base64_out, &base64_out_size);
|
||||||
|
|
||||||
|
TEST_ASSERT_EQUAL_INT(BASE64_SUCCESS, ret);
|
||||||
|
TEST_ASSERT_EQUAL_INT(0, base64_out_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_base64_10_decode_empty(void)
|
||||||
|
{
|
||||||
|
unsigned char data_in[] = "";
|
||||||
|
|
||||||
|
size_t base64_out_size = 8;
|
||||||
|
unsigned char base64_out[8];
|
||||||
|
|
||||||
|
int ret = base64_decode(data_in, 0, base64_out, &base64_out_size);
|
||||||
|
|
||||||
|
TEST_ASSERT_EQUAL_INT(BASE64_SUCCESS, ret);
|
||||||
|
TEST_ASSERT_EQUAL_INT(0, base64_out_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Test *tests_base64_tests(void)
|
Test *tests_base64_tests(void)
|
||||||
{
|
{
|
||||||
EMB_UNIT_TESTFIXTURES(fixtures) {
|
EMB_UNIT_TESTFIXTURES(fixtures) {
|
||||||
@ -395,6 +422,8 @@ Test *tests_base64_tests(void)
|
|||||||
new_TestFixture(test_base64_07_stream_decode),
|
new_TestFixture(test_base64_07_stream_decode),
|
||||||
new_TestFixture(test_base64_08_encode_16_bytes),
|
new_TestFixture(test_base64_08_encode_16_bytes),
|
||||||
new_TestFixture(test_base64_09_encode_size_determination),
|
new_TestFixture(test_base64_09_encode_size_determination),
|
||||||
|
new_TestFixture(test_base64_10_encode_empty),
|
||||||
|
new_TestFixture(test_base64_10_decode_empty),
|
||||||
};
|
};
|
||||||
|
|
||||||
EMB_UNIT_TESTCALLER(base64_tests, NULL, NULL, fixtures);
|
EMB_UNIT_TESTCALLER(base64_tests, NULL, NULL, fixtures);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user