summaryrefslogtreecommitdiff
path: root/Userland/DevTools
diff options
context:
space:
mode:
authorMatthew Jones <matthewbjones85@gmail.com>2021-06-01 10:35:57 -0600
committerAndreas Kling <kling@serenityos.org>2021-06-02 11:19:04 +0200
commitfe026fef47cb35de605ba929e1b3ba2a437055cc (patch)
treeaa7f1a9ef1783940ec861bb3fb158d56f318daae /Userland/DevTools
parent00c8b74ab426ef1db7c3ff2510253cc3a1477846 (diff)
downloadserenity-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.cpp5
-rw-r--r--Userland/DevTools/Inspector/RemoteProcess.h2
-rw-r--r--Userland/DevTools/Inspector/main.cpp31
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()));