From 0d5990acd03743b8b7c43421df4c71d6aa958a7e Mon Sep 17 00:00:00 2001 From: Calvin Xiao Date: Wed, 21 Apr 2021 10:45:36 +0800 Subject: [PATCH 1/6] handle low level error that has no backtrace --- lib/puma/server.rb | 3 ++- test/test_puma_server.rb | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/lib/puma/server.rb b/lib/puma/server.rb index b826c8d7f2..4d4712e5ef 100644 --- a/lib/puma/server.rb +++ b/lib/puma/server.rb @@ -528,7 +528,8 @@ def lowlevel_error(e, env, status=500) end if @leak_stack_on_error - [status, {}, ["Puma caught this error: #{e.message} (#{e.class})\n#{e.backtrace.join("\n")}"]] + backtrace = e.backtrace.nil? ? '' : e.backtrace.join("\n") + [status, {}, ["Puma caught this error: #{e.message} (#{e.class})\n#{backtrace}"]] else [status, {}, ["An unhandled lowlevel error occurred. The application logs may have details.\n"]] end diff --git a/test/test_puma_server.rb b/test/test_puma_server.rb index 226e85167c..79c76a44ec 100644 --- a/test/test_puma_server.rb +++ b/test/test_puma_server.rb @@ -285,6 +285,26 @@ def test_force_shutdown_custom_error_message assert_match(/{}\n$/, data) end + def test_low_level_error_message + @server = Puma::Server.new @app, @events + + server_run app: ->(env) do + require 'json' + + # will raise fatal: machine stack overflow in critical region + obj = {} + obj['cycle'] = obj + ::JSON.dump(obj) + end + + data = send_http_and_read "GET / HTTP/1.0\r\n\r\n" + + assert_match(/HTTP\/1.0 500 Internal Server Error/, data) + assert (data.size > 0), "Expected response message to be not empty" + end + + + def test_force_shutdown_error_default @server = Puma::Server.new @app, @events, {:force_shutdown_after => 2} From 1dad096f6ba5d5f114216971089cde397a7d1c15 Mon Sep 17 00:00:00 2001 From: Calvin Xiao Date: Wed, 21 Apr 2021 10:57:59 +0800 Subject: [PATCH 2/6] add force_shutdown_after in test case --- test/test_puma_server.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_puma_server.rb b/test/test_puma_server.rb index 79c76a44ec..16fe529f4f 100644 --- a/test/test_puma_server.rb +++ b/test/test_puma_server.rb @@ -286,7 +286,7 @@ def test_force_shutdown_custom_error_message end def test_low_level_error_message - @server = Puma::Server.new @app, @events + @server = Puma::Server.new @app, @events, {:force_shutdown_after => 2} server_run app: ->(env) do require 'json' From 99d3fcb96e77d26a1620122adb84ea0e9e3ac79d Mon Sep 17 00:00:00 2001 From: Calvin Xiao Date: Wed, 21 Apr 2021 11:04:46 +0800 Subject: [PATCH 3/6] skip test on windows for low level error --- test/test_puma_server.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/test/test_puma_server.rb b/test/test_puma_server.rb index 16fe529f4f..2a81f6e18f 100644 --- a/test/test_puma_server.rb +++ b/test/test_puma_server.rb @@ -286,6 +286,7 @@ def test_force_shutdown_custom_error_message end def test_low_level_error_message + skip_if :windows @server = Puma::Server.new @app, @events, {:force_shutdown_after => 2} server_run app: ->(env) do From f1de8c0025b4f567b3d6cbcab77e608d7953cccc Mon Sep 17 00:00:00 2001 From: Calvin Xiao Date: Wed, 21 Apr 2021 11:21:42 +0800 Subject: [PATCH 4/6] remove extra space --- lib/puma/server.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/puma/server.rb b/lib/puma/server.rb index 4d4712e5ef..1f1ffc2161 100644 --- a/lib/puma/server.rb +++ b/lib/puma/server.rb @@ -528,7 +528,7 @@ def lowlevel_error(e, env, status=500) end if @leak_stack_on_error - backtrace = e.backtrace.nil? ? '' : e.backtrace.join("\n") + backtrace = e.backtrace.nil? ? '' : e.backtrace.join("\n") [status, {}, ["Puma caught this error: #{e.message} (#{e.class})\n#{backtrace}"]] else [status, {}, ["An unhandled lowlevel error occurred. The application logs may have details.\n"]] From c2a80676691300c2de68214b821a64316d361d5a Mon Sep 17 00:00:00 2001 From: Calvin Xiao Date: Wed, 21 Apr 2021 11:31:45 +0800 Subject: [PATCH 5/6] remove two extra lines --- test/test_puma_server.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/test_puma_server.rb b/test/test_puma_server.rb index 2a81f6e18f..ddb6c013e5 100644 --- a/test/test_puma_server.rb +++ b/test/test_puma_server.rb @@ -304,8 +304,6 @@ def test_low_level_error_message assert (data.size > 0), "Expected response message to be not empty" end - - def test_force_shutdown_error_default @server = Puma::Server.new @app, @events, {:force_shutdown_after => 2} From 042830341f70dd478a1996d77fd4c5215dd1c134 Mon Sep 17 00:00:00 2001 From: Calvin Xiao Date: Wed, 21 Apr 2021 12:34:07 +0800 Subject: [PATCH 6/6] rename test method to lowlevel_error --- test/test_puma_server.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_puma_server.rb b/test/test_puma_server.rb index ddb6c013e5..13e84c4b6f 100644 --- a/test/test_puma_server.rb +++ b/test/test_puma_server.rb @@ -285,7 +285,7 @@ def test_force_shutdown_custom_error_message assert_match(/{}\n$/, data) end - def test_low_level_error_message + def test_lowlevel_error_message skip_if :windows @server = Puma::Server.new @app, @events, {:force_shutdown_after => 2}