llvm-project/libcxxabi/test
Mikhail Borisov f0fcd42495 [libc++abi] Fix possible infinite loop in itanium demangler
A libfuzzer run has discovered some inputs for which the demangler does
not terminate. When minimized, it looks like this: _Zcv1BIRT_EIS1_E

Deciphered:

_Z
cv    - conversion operator

      * result type
 1B   - "B"
 I    - template args begin
  R   - reference type              <.
   T_ - forward template reference   |  *
 E    - template args end            |  |
                                     |  |
      * parameter type               |  |
 I    - template args begin          |  |
  S1_ - substitution #1              * <'
 E    - template args end

The reason is: template-parameter refs in conversion operator result type
create forward-references, while substitutions are instantly resolved via
back-references. Together these can create a reference loop. It causes an
infinite loop in ReferenceType::collapse().

I see three possible ways to avoid these loops:

1. check if resolving a forward reference creates a loop and reject the
   invalid input (hard to traverse AST at this point)
2. check if a substitution contains a malicious forward reference and
   reject the invalid input (hard to traverse AST at this point;
   substitutions are quite common: may affect performance; hard to
   clearly detect loops at this point)
3. detect loops in ReferenceType::collapse() (cannot reject the input)

This patch implements (3) as seemingly the least-impact change. As a
side effect, such invalid input strings are not rejected and produce
garbage, however there are already similar guards in
`if (Printing) return;` checks.

Fixes https://llvm.org/PR51407

Differential Revision: https://reviews.llvm.org/D107712
2021-08-17 18:13:26 -04:00
..
libcxxabi [libc++/abi] Fix broken Lit feature no-noexcept-function-type 2021-07-15 14:42:07 -04:00
native/arm-linux-eabi [libc++] Move handling of the target triple to the DSL 2021-05-08 11:10:53 -04:00
support [libc++/abi] Clean up uses of <iostream> in the test suite 2020-10-13 20:25:33 -04:00
CMakeLists.txt [runtimes] Simplify how we set the target triple 2021-07-16 10:33:39 -04:00
backtrace_test.pass.cpp [runtimes] Use int main(int, char**) consistently in tests 2020-10-08 14:28:13 -04:00
catch_array_01.pass.cpp [runtimes] Use int main(int, char**) consistently in tests 2020-10-08 14:28:13 -04:00
catch_array_02.pass.cpp [runtimes] Use int main(int, char**) consistently in tests 2020-10-08 14:28:13 -04:00
catch_class_01.pass.cpp [runtimes] Use int main(int, char**) consistently in tests 2020-10-08 14:28:13 -04:00
catch_class_02.pass.cpp [runtimes] Use int main(int, char**) consistently in tests 2020-10-08 14:28:13 -04:00
catch_class_03.pass.cpp [libc++abi] Get rid of warnings when running the tests with GCC 2020-11-02 10:19:39 -05:00
catch_class_04.pass.cpp [libc++abi] Get rid of warnings when running the tests with GCC 2020-11-02 10:19:39 -05:00
catch_const_pointer_nullptr.pass.cpp [runtimes] Use int main(int, char**) consistently in tests 2020-10-08 14:28:13 -04:00
catch_function_01.pass.cpp [runtimes] Simplify how we specify XFAIL & friends based on the triple 2021-07-01 14:03:30 -04:00
catch_function_02.pass.cpp [runtimes] Use int main(int, char**) consistently in tests 2020-10-08 14:28:13 -04:00
catch_function_03.pass.cpp [libc++/abi] Fix broken Lit feature no-noexcept-function-type 2021-07-15 14:42:07 -04:00
catch_in_noexcept.pass.cpp [runtimes] Use int main(int, char**) consistently in tests 2020-10-08 14:28:13 -04:00
catch_member_data_pointer_01.pass.cpp [runtimes] Simplify how we specify XFAIL & friends based on the triple 2021-07-01 14:03:30 -04:00
catch_member_function_pointer_01.pass.cpp [runtimes] Use int main(int, char**) consistently in tests 2020-10-08 14:28:13 -04:00
catch_member_function_pointer_02.pass.cpp [libc++] Remove Lit annotations for unsupported GCC versions from the test suite 2021-08-12 13:30:47 -04:00
catch_member_pointer_nullptr.pass.cpp [runtimes] Simplify how we specify XFAIL & friends based on the triple 2021-07-01 14:03:30 -04:00
catch_multi_level_pointer.pass.cpp [runtimes] Simplify how we specify XFAIL & friends based on the triple 2021-07-01 14:03:30 -04:00
catch_pointer_nullptr.pass.cpp [runtimes] Simplify how we specify XFAIL & friends based on the triple 2021-07-01 14:03:30 -04:00
catch_pointer_reference.pass.cpp [libc++abi] Get rid of warnings when running the tests with GCC 2020-11-02 10:19:39 -05:00
catch_ptr.pass.cpp [libc++abi] Get rid of warnings when running the tests with GCC 2020-11-02 10:19:39 -05:00
catch_ptr_02.pass.cpp [runtimes] Simplify how we specify XFAIL & friends based on the triple 2021-07-01 14:03:30 -04:00
catch_reference_nullptr.pass.cpp [runtimes] Use int main(int, char**) consistently in tests 2020-10-08 14:28:13 -04:00
cxa_bad_cast.pass.cpp [libc++abi] Get rid of warnings when running the tests with GCC 2020-11-02 10:19:39 -05:00
cxa_bad_typeid.pass.cpp [libc++abi] Get rid of warnings when running the tests with GCC 2020-11-02 10:19:39 -05:00
cxa_thread_atexit_test.pass.cpp [runtimes] Use int main(int, char**) consistently in tests 2020-10-08 14:28:13 -04:00
cxa_vec_new_overflow_PR41395.pass.cpp [runtimes] Simplify how we specify XFAIL & friends based on the triple 2021-07-01 14:03:30 -04:00
dynamic_cast.pass.cpp [libc++] Remove Lit annotations for unsupported GCC versions from the test suite 2021-08-12 13:30:47 -04:00
dynamic_cast3.pass.cpp [libc++] Remove Lit annotations for unsupported GCC versions from the test suite 2021-08-12 13:30:47 -04:00
dynamic_cast5.pass.cpp [libc++] Remove Lit annotations for unsupported GCC versions from the test suite 2021-08-12 13:30:47 -04:00
dynamic_cast14.pass.cpp [runtimes] Use int main(int, char**) consistently in tests 2020-10-08 14:28:13 -04:00
dynamic_cast_stress.pass.cpp [runtimes] Use int main(int, char**) consistently in tests 2020-10-08 14:28:13 -04:00
exception_object_alignment.2.pass.cpp [runtimes] Use int main(int, char**) consistently in tests 2020-10-08 14:28:13 -04:00
exception_object_alignment.pass.cpp [runtimes] Simplify how we specify XFAIL & friends based on the triple 2021-07-01 14:03:30 -04:00
forced_unwind1.pass.cpp [Arm][Unwind][libc++abi] Add _Unwind_ForcedUnwind to EHABI. 2021-08-11 10:15:53 +02:00
forced_unwind2.pass.cpp [Arm][Unwind][libc++abi] Add _Unwind_ForcedUnwind to EHABI. 2021-08-11 10:15:53 +02:00
guard_test_basic.pass.cpp [libc++abi] Get rid of warnings when running the tests with GCC 2020-11-02 10:19:39 -05:00
guard_threaded_test.pass.cpp [libc++] Introduce an indirection to create threads in the test suite 2020-11-27 11:54:19 -05:00
incomplete_type.sh.cpp [runtimes] Simplify how we specify XFAIL & friends based on the triple 2021-07-01 14:03:30 -04:00
inherited_exception.pass.cpp [libc++abi] Get rid of warnings when running the tests with GCC 2020-11-02 10:19:39 -05:00
lit.cfg.py [libc++abi] Allow specifying custom Lit config files 2020-06-25 12:15:15 -04:00
lit.site.cfg.in [runtimes] Move enable_32bit to the DSL 2021-07-06 08:42:07 -04:00
noexception1.pass.cpp [libc++] Remove the c++98 Lit feature from the test suite 2020-06-03 09:37:22 -04:00
noexception2.pass.cpp [libc++] Remove the c++98 Lit feature from the test suite 2020-06-03 09:37:22 -04:00
noexception3.pass.cpp [libc++] Remove the c++98 Lit feature from the test suite 2020-06-03 09:37:22 -04:00
noexception4.pass.cpp [libc++/abi/unwind] Rename Lit features for no exceptions to 'no-exceptions' 2020-04-22 08:25:27 -04:00
test_aux_runtime.pass.cpp [libc++/abi] Clean up uses of <iostream> in the test suite 2020-10-13 20:25:33 -04:00
test_aux_runtime_op_array_new.pass.cpp [runtimes] Simplify how we specify XFAIL & friends based on the triple 2021-07-01 14:03:30 -04:00
test_demangle.pass.cpp [libc++abi] Fix possible infinite loop in itanium demangler 2021-08-17 18:13:26 -04:00
test_exception_address_alignment.pass.cpp [runtimes] Simplify how we specify XFAIL & friends based on the triple 2021-07-01 14:03:30 -04:00
test_exception_storage.pass.cpp [libcxxabi] Stub out 'sleep' call when _LIBCXXABI_HAS_NO_THREADS is defined. 2020-10-21 20:56:24 +01:00
test_fallback_malloc.pass.cpp [libcxxabi] Fix printf formats in a test. 2020-10-16 13:59:11 +01:00
test_guard.pass.cpp [libc++] Introduce an indirection to create threads in the test suite 2020-11-27 11:54:19 -05:00
test_vector1.pass.cpp [libc++/abi] Clean up uses of <iostream> in the test suite 2020-10-13 20:25:33 -04:00
test_vector2.pass.cpp [libc++/abi] Clean up uses of <iostream> in the test suite 2020-10-13 20:25:33 -04:00
test_vector3.pass.cpp [libc++abi] Get rid of warnings when running the tests with GCC 2020-11-02 10:19:39 -05:00
thread_local_destruction_order.pass.cpp [libc++] Add a CI job for macOS on arm64 hardware 🥳 2021-07-13 13:49:05 -04:00
uncaught_exception.pass.cpp [libc++/abi/unwind] Rename Lit features for no exceptions to 'no-exceptions' 2020-04-22 08:25:27 -04:00
uncaught_exceptions.pass.cpp [runtimes] Simplify how we specify XFAIL & friends based on the triple 2021-07-01 14:03:30 -04:00
unittest_demangle.pass.cpp [runtimes] Use int main(int, char**) consistently in tests 2020-10-08 14:28:13 -04:00
unwind_01.pass.cpp [runtimes] Use int main(int, char**) consistently in tests 2020-10-08 14:28:13 -04:00
unwind_02.pass.cpp [libc++] Add a job running GCC with C++11 2021-07-15 22:13:03 -04:00
unwind_03.pass.cpp [libc++] Add a job running GCC with C++11 2021-07-15 22:13:03 -04:00
unwind_04.pass.cpp [libc++] Add a job running GCC with C++11 2021-07-15 22:13:03 -04:00
unwind_05.pass.cpp [libc++] Add a job running GCC with C++11 2021-07-15 22:13:03 -04:00
unwind_06.pass.cpp [libc++] [libc++abi] Mark a few tests as unsupported/xfail on gcc-7/8/9. 2020-11-26 08:59:52 +01:00