From 47065d503440718e7023274ed97f333993ed994a Mon Sep 17 00:00:00 2001 From: Dane Walton Date: Thu, 15 Sep 2022 10:26:14 -0500 Subject: [PATCH] Add null terminator for char* based json string unescape, and precondition on input length (#2303) * Add null terminator for char* based json string unescape, and precondition on input length * Add remark comment about precondition and null terimination * Update doc comment typo * Remove the test cases about insufficient space. * Fix clang formatting. * Add null terminator tests. * Test that the null terminator is there at the end. * Fix build errors. --- sdk/src/azure/core/az_json_private.h | 18 ++++++++++++++++++ sdk/src/azure/core/az_json_reader.c | 18 ------------------ sdk/tests/core/test_az_json.c | 9 +++++++-- 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/sdk/src/azure/core/az_json_private.h b/sdk/src/azure/core/az_json_private.h index db19e16371..ab9b176e54 100644 --- a/sdk/src/azure/core/az_json_private.h +++ b/sdk/src/azure/core/az_json_private.h @@ -120,6 +120,24 @@ AZ_NODISCARD AZ_INLINE _az_json_stack_item _az_json_stack_peek(_az_json_bit_stac : _az_JSON_STACK_ARRAY; } +AZ_NODISCARD AZ_INLINE bool _az_is_valid_escaped_character(uint8_t byte) +{ + switch (byte) + { + case '\\': + case '"': + case '/': + case 'b': + case 'f': + case 'n': + case 'r': + case 't': + return true; + default: + return false; + } +} + #include #endif // _az_SPAN_PRIVATE_H diff --git a/sdk/src/azure/core/az_json_reader.c b/sdk/src/azure/core/az_json_reader.c index c4c30a62c7..281dacc553 100644 --- a/sdk/src/azure/core/az_json_reader.c +++ b/sdk/src/azure/core/az_json_reader.c @@ -237,24 +237,6 @@ AZ_NODISCARD static az_result _az_json_reader_process_container_start( return AZ_OK; } -AZ_NODISCARD static bool _az_is_valid_escaped_character(uint8_t byte) -{ - switch (byte) - { - case '\\': - case '"': - case '/': - case 'b': - case 'f': - case 'n': - case 'r': - case 't': - return true; - default: - return false; - } -} - AZ_NODISCARD static az_result _az_json_reader_process_string(az_json_reader* ref_json_reader) { // Move past the first '"' character diff --git a/sdk/tests/core/test_az_json.c b/sdk/tests/core/test_az_json.c index 5075f9a69b..9a285f27bb 100644 --- a/sdk/tests/core/test_az_json.c +++ b/sdk/tests/core/test_az_json.c @@ -1,5 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // SPDX-License-Identifier: MIT +#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +#define strdup _strdup +#endif #include "az_test_definitions.h" #include @@ -13,7 +16,7 @@ #include #include - +#include #define TEST_EXPECT_SUCCESS(exp) assert_true(az_result_succeeded(exp)) az_result test_allocator( @@ -3373,6 +3376,8 @@ int test_az_json() cmocka_unit_test(test_az_json_token_number_too_large), cmocka_unit_test(test_az_json_token_literal), cmocka_unit_test(test_az_json_token_copy), - cmocka_unit_test(test_az_json_reader_chunked) }; + cmocka_unit_test(test_az_json_reader_chunked), + cmocka_unit_test(test_az_json_string_unescape), + cmocka_unit_test(test_az_json_string_unescape_same_buffer) }; return cmocka_run_group_tests_name("az_core_json", tests, NULL, NULL); }