diff options
author | Matthew Jones <matthewbjones85@gmail.com> | 2021-06-01 10:35:57 -0600 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-06-02 11:19:04 +0200 |
commit | fe026fef47cb35de605ba929e1b3ba2a437055cc (patch) | |
tree | aa7f1a9ef1783940ec861bb3fb158d56f318daae /Userland/DevTools | |
parent | 00c8b74ab426ef1db7c3ff2510253cc3a1477846 (diff) | |
download | serenity-fe026fef47cb35de605ba929e1b3ba2a437055cc.zip |
Inspector: Check if RemoteProcess `is_inspectable`
The previous check of looking at `/proc/PID` was not working, it would
always fail even if the process was indeed inspectable.
Commit 70117781 introduced a new IPC for asking InspectorServer whether
or not a given `pid` is actually inspectable.
If a process is not inspectable, the `GUI::ProcessChooser` is
redisplayed if it was previously displayed, otherwise it exits.
Diffstat (limited to 'Userland/DevTools')
-rw-r--r-- | Userland/DevTools/Inspector/RemoteProcess.cpp | 5 | ||||
-rw-r--r-- | Userland/DevTools/Inspector/RemoteProcess.h | 2 | ||||
-rw-r--r-- | Userland/DevTools/Inspector/main.cpp | 31 |
3 files changed, 25 insertions, 13 deletions
diff --git a/Userland/DevTools/Inspector/RemoteProcess.cpp b/Userland/DevTools/Inspector/RemoteProcess.cpp index 93d07cd83c..bfea54d4db 100644 --- a/Userland/DevTools/Inspector/RemoteProcess.cpp +++ b/Userland/DevTools/Inspector/RemoteProcess.cpp @@ -88,6 +88,11 @@ void RemoteProcess::set_property(FlatPtr object, const StringView& name, const J m_client->async_set_object_property(m_pid, object, name, value.to_string()); } +bool RemoteProcess::is_inspectable() +{ + return m_client->is_inspectable(m_pid); +} + void RemoteProcess::update() { { diff --git a/Userland/DevTools/Inspector/RemoteProcess.h b/Userland/DevTools/Inspector/RemoteProcess.h index 5f821db693..83baad53fc 100644 --- a/Userland/DevTools/Inspector/RemoteProcess.h +++ b/Userland/DevTools/Inspector/RemoteProcess.h @@ -32,6 +32,8 @@ public: void set_property(FlatPtr object, const StringView& name, const JsonValue& value); + bool is_inspectable(); + Function<void()> on_update; private: diff --git a/Userland/DevTools/Inspector/main.cpp b/Userland/DevTools/Inspector/main.cpp index fa63527c74..5da17cec5e 100644 --- a/Userland/DevTools/Inspector/main.cpp +++ b/Userland/DevTools/Inspector/main.cpp @@ -66,11 +66,13 @@ int main(int argc, char** argv) unveil(nullptr, nullptr); + bool gui_mode = argc != 2; pid_t pid; auto app = GUI::Application::construct(argc, argv); auto app_icon = GUI::Icon::default_icon("app-inspector"); - if (argc != 2) { + if (gui_mode) { + choose_pid: auto process_chooser = GUI::ProcessChooser::construct("Inspector", "Inspect", app_icon.bitmap_for_size(16)); if (process_chooser->exec() == GUI::Dialog::ExecCancel) return 0; @@ -84,21 +86,26 @@ int main(int argc, char** argv) auto window = GUI::Window::construct(); - if (!Desktop::Launcher::add_allowed_handler_with_only_specific_urls( - "/bin/Help", - { URL::create_with_file_protocol("/usr/share/man/man1/Inspector.md") }) - || !Desktop::Launcher::seal_allowlist()) { - warnln("Failed to set up allowed launch URLs"); - return 1; - } - if (pid == getpid()) { GUI::MessageBox::show(window, "Cannot inspect Inspector itself!", "Error", GUI::MessageBox::Type::Error); return 1; } - if (access(String::formatted("/proc/{}", pid).characters(), R_OK) == -1) { - GUI::MessageBox::show(window, "Inspector doesn't have permission to access the process.", "Error", GUI::MessageBox::Type::Error); + RemoteProcess remote_process(pid); + if (!remote_process.is_inspectable()) { + GUI::MessageBox::show(window, String::formatted("Process pid={} is not inspectable", remote_process.pid()), "Error", GUI::MessageBox::Type::Error); + if (gui_mode) { + goto choose_pid; + } else { + return 1; + } + } + + if (!Desktop::Launcher::add_allowed_handler_with_only_specific_urls( + "/bin/Help", + { URL::create_with_file_protocol("/usr/share/man/man1/Inspector.md") }) + || !Desktop::Launcher::seal_allowlist()) { + warnln("Failed to set up allowed launch URLs"); return 1; } @@ -123,8 +130,6 @@ int main(int argc, char** argv) auto& splitter = widget.add<GUI::HorizontalSplitter>(); - RemoteProcess remote_process(pid); - remote_process.on_update = [&] { if (!remote_process.process_name().is_null()) window->set_title(String::formatted("{} ({}) - Inspector", remote_process.process_name(), remote_process.pid())); |