From 03d62ad65d1ed4167f60f7e41c6319118955dca5 Mon Sep 17 00:00:00 2001 From: slavek-kucera <53339291+slavek-kucera@users.noreply.github.com> Date: Tue, 19 Oct 2021 12:05:38 +0200 Subject: [PATCH] fix: AINSERT operand length validation (#196) --- clients/vscode-hlasmplugin/CHANGELOG.md | 1 + cmake/external_gtest.cmake | 2 +- .../src/checking/asm_instr_check.cpp | 2 +- parser_library/test/processing/aread_test.cpp | 38 +++++++++++++++++++ 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/clients/vscode-hlasmplugin/CHANGELOG.md b/clients/vscode-hlasmplugin/CHANGELOG.md index 8c78216bf..5af90e770 100644 --- a/clients/vscode-hlasmplugin/CHANGELOG.md +++ b/clients/vscode-hlasmplugin/CHANGELOG.md @@ -27,6 +27,7 @@ - Operands of dynamically generated statements may be incorrectly parsed - Infinite loop during lookahead processing when model statement is located in copybook - DOT operator in string concatenation is optional +- AINSERT operand length validation ## [0.14.0](https://github.com/eclipse/che-che4z-lsp-for-hlasm/compare/0.13.0...0.14.0) (2021-08-18) diff --git a/cmake/external_gtest.cmake b/cmake/external_gtest.cmake index 262760cc4..58e9ea479 100644 --- a/cmake/external_gtest.cmake +++ b/cmake/external_gtest.cmake @@ -16,7 +16,7 @@ include(FetchContent) FetchContent_Declare(googletest GIT_REPOSITORY https://github.com/google/googletest.git - GIT_TAG release-1.10.0 + GIT_TAG release-1.11.0 LOG_DOWNLOAD ON GIT_PROGRESS 1 ) diff --git a/parser_library/src/checking/asm_instr_check.cpp b/parser_library/src/checking/asm_instr_check.cpp index a5d99a5b2..2f3982c72 100644 --- a/parser_library/src/checking/asm_instr_check.cpp +++ b/parser_library/src/checking/asm_instr_check.cpp @@ -1300,7 +1300,7 @@ bool ainsert::check(const std::vector& to_check, auto second = get_simple_operand(to_check[1]); // check first operand if (first == nullptr || first->operand_identifier.size() < 2 - || first->operand_identifier.size() > string_max_length) + || first->operand_identifier.size() > string_max_length + 2) // quotes { add_diagnostic(diagnostic_op::error_A157_AINSERT_first_op_size(to_check[0]->operand_range)); return false; diff --git a/parser_library/test/processing/aread_test.cpp b/parser_library/test/processing/aread_test.cpp index 215733285..1a34066a4 100644 --- a/parser_library/test/processing/aread_test.cpp +++ b/parser_library/test/processing/aread_test.cpp @@ -744,3 +744,41 @@ A DC C EXPECT_EQ(d.related[0].location.uri, "AINSERT:1"); EXPECT_EQ(d.related[1].location.uri, "COPYBOOK"); } + +TEST(ainsert, argument_limit) +{ + std::string input = R"( + MACRO + MAC +&C SETC (80)' ' + AINSERT '&C',BACK + MEND + MAC +)"; + + analyzer a(input); + + a.analyze(); + a.collect_diags(); + + ASSERT_TRUE(a.diags().empty()); +} + +TEST(ainsert, argument_limit_over) +{ + std::string input = R"( + MACRO + MAC +&C SETC (81)' ' + AINSERT '&C',BACK + MEND + MAC +)"; + + analyzer a(input); + + a.analyze(); + a.collect_diags(); + + ASSERT_TRUE(matches_message_codes(a.diags(), { "A157" })); +}