From b43092a8913ec5711dc15e43332530eeb0678a04 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 75aba5bfa7..3d0e5e6528 100644 --- a/lib/puma/server.rb +++ b/lib/puma/server.rb @@ -525,7 +525,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 5e591171bf..3ef855707e 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 100a1b23f42b6550188ecf783d16d0821fdd3475 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 3ef855707e..0e79215c44 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 b3b469a687931538d8629103ef220ff7f33ed5ac 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 0e79215c44..dd491e5e69 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 52585e95855c4c2d820c054829b6dfa5966421f7 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 3d0e5e6528..ccdf2a74a2 100644 --- a/lib/puma/server.rb +++ b/lib/puma/server.rb @@ -525,7 +525,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 781aa26112725d052fc10e2936488c32f61c0c2b 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 dd491e5e69..9dfb7aa716 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 0bee5e2e174f5094ae2d5e34a6db98330a9b88f5 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 9dfb7aa716..8101b24442 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}