From d512d25abe23ee94b4013ce8b7849e1049906f4a Mon Sep 17 00:00:00 2001 From: Mostafa Date: Wed, 28 Aug 2024 20:37:52 -0500 Subject: [PATCH 1/3] Fix a Panic in admin commands --- src/admin.rs | 7 ++++++- tests/ruby/admin_spec.rb | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/admin.rs b/src/admin.rs index 22bbb0af..907d8646 100644 --- a/src/admin.rs +++ b/src/admin.rs @@ -84,7 +84,12 @@ where trace!("SHUTDOWN"); shutdown(stream).await } - "SHOW" => match query_parts[1].to_ascii_uppercase().as_str() { + "SHOW" => match query_parts + .get(1) + .unwrap_or(&"") + .to_ascii_uppercase() + .as_str() + { "HELP" => { trace!("SHOW HELP"); show_help(stream).await diff --git a/tests/ruby/admin_spec.rb b/tests/ruby/admin_spec.rb index abaa5ff4..6feb9e06 100644 --- a/tests/ruby/admin_spec.rb +++ b/tests/ruby/admin_spec.rb @@ -91,6 +91,24 @@ end end + describe "SHOW " do + it "does not panic" do + admin_conn = PG::connect(processes.pgcat.admin_connection_string) + expect { admin_conn.async_exec("SHOW ") }.to raise_error(PG::SystemError).with_message(/FATAL: Unsupported SHOW query against the admin database/) + admin_conn.close + end + end + + describe "SHOW " do + it "does not panic" do + admin_conn = PG::connect(processes.pgcat.admin_connection_string) + ["ME THE MONEY", "ME THE WAY", "UP", "TIME"].each do |cmd| + expect { admin_conn.async_exec("SHOW #{cmd}") }.to raise_error(PG::SystemError).with_message(/FATAL: Unsupported SHOW query against the admin database/) + end + admin_conn.close + end + end + describe "PAUSE" do it "pauses all pools" do admin_conn = PG::connect(processes.pgcat.admin_connection_string) From 040fcd6bb3554cc927c0f732eb592ac7219af48c Mon Sep 17 00:00:00 2001 From: Mostafa Date: Wed, 28 Aug 2024 20:53:13 -0500 Subject: [PATCH 2/3] fix another edge case --- src/admin.rs | 7 ++++++- tests/ruby/admin_spec.rb | 31 +++++++++++++++++-------------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/admin.rs b/src/admin.rs index 907d8646..c72edb86 100644 --- a/src/admin.rs +++ b/src/admin.rs @@ -55,7 +55,12 @@ where let query_parts: Vec<&str> = query.trim_end_matches(';').split_whitespace().collect(); - match query_parts[0].to_ascii_uppercase().as_str() { + match query_parts + .get(0) + .unwrap_or(&"") + .to_ascii_uppercase() + .as_str() + { "BAN" => { trace!("BAN"); ban(stream, query_parts).await diff --git a/tests/ruby/admin_spec.rb b/tests/ruby/admin_spec.rb index 6feb9e06..f9613d96 100644 --- a/tests/ruby/admin_spec.rb +++ b/tests/ruby/admin_spec.rb @@ -91,21 +91,24 @@ end end - describe "SHOW " do - it "does not panic" do - admin_conn = PG::connect(processes.pgcat.admin_connection_string) - expect { admin_conn.async_exec("SHOW ") }.to raise_error(PG::SystemError).with_message(/FATAL: Unsupported SHOW query against the admin database/) - admin_conn.close - end - end - - describe "SHOW " do - it "does not panic" do - admin_conn = PG::connect(processes.pgcat.admin_connection_string) - ["ME THE MONEY", "ME THE WAY", "UP", "TIME"].each do |cmd| - expect { admin_conn.async_exec("SHOW #{cmd}") }.to raise_error(PG::SystemError).with_message(/FATAL: Unsupported SHOW query against the admin database/) + [ + "SHOW ME THE MONEY", + "SHOW ME THE WAY", + "SHOW UP", + "SHOWTIME", + "HAMMER TIME", + "SHOWN TO BE TRUE", + "SHOW ", + "SHOW ", + "SHOW 1", + ";;;;;" + ].each do |cmd| + describe "Bad command #{cmd}" do + it "does not panic and responds with PG::SystemError" do + admin_conn = PG::connect(processes.pgcat.admin_connection_string) + expect { admin_conn.async_exec(cmd) }.to raise_error(PG::SystemError).with_message(/Unsupported/) + admin_conn.close end - admin_conn.close end end From 2c6a72b2221a6f487d46697ebfb72912b8cfdab4 Mon Sep 17 00:00:00 2001 From: Mostafa Date: Wed, 28 Aug 2024 21:09:14 -0500 Subject: [PATCH 3/3] first() --- src/admin.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/admin.rs b/src/admin.rs index c72edb86..f08ef2e1 100644 --- a/src/admin.rs +++ b/src/admin.rs @@ -56,7 +56,7 @@ where let query_parts: Vec<&str> = query.trim_end_matches(';').split_whitespace().collect(); match query_parts - .get(0) + .first() .unwrap_or(&"") .to_ascii_uppercase() .as_str()