@@ -369,8 +369,17 @@ def deeply_nested_extension_value(depth)
369369 depth . times . reduce ( "1" ) { |value , _ | "(#{ value } )" }
370370 end
371371
372+ def patch_recursion_entrypoint ( parser , method_name )
373+ return if ENV [ "TEST_RESPONSE_PARSER_STACK_LEVEL" ] == "original"
374+
375+ parser . define_singleton_method ( method_name ) do |*args , **kwargs , &block |
376+ raise SystemStackError , "stack level too deep"
377+ end
378+ end
379+
372380 test "deeply nested BODYSTRUCTURE raises ResponseParseError instead of SystemStackError" do
373381 parser = Net ::IMAP ::ResponseParser . new
382+ patch_recursion_entrypoint ( parser , :body )
374383 response = "* 1 FETCH (BODYSTRUCTURE #{ deeply_nested_bodystructure ( 6000 ) } )\r \n "
375384
376385 error = assert_raise ( Net ::IMAP ::ResponseParseError ) do
@@ -383,6 +392,7 @@ def deeply_nested_extension_value(depth)
383392
384393 test "deeply nested THREAD raises ResponseParseError instead of SystemStackError" do
385394 parser = Net ::IMAP ::ResponseParser . new
395+ patch_recursion_entrypoint ( parser , :thread_data )
386396 response = "* THREAD #{ deeply_nested_thread ( 6000 ) } \r \n "
387397
388398 error = assert_raise ( Net ::IMAP ::ResponseParseError ) do
@@ -395,6 +405,7 @@ def deeply_nested_extension_value(depth)
395405
396406 test "deeply nested STATUS extension raises ResponseParseError instead of SystemStackError" do
397407 parser = Net ::IMAP ::ResponseParser . new
408+ patch_recursion_entrypoint ( parser , :tagged_ext_val )
398409 response = "* STATUS INBOX (X #{ deeply_nested_extension_value ( 11_000 ) } )\r \n "
399410
400411 error = assert_raise ( Net ::IMAP ::ResponseParseError ) do
0 commit comments