فهرست منبع

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.
Matthew Jones 4 سال پیش
والد
کامیت
fe026fef47

+ 5 - 0
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()
 {
     {

+ 2 - 0
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:

+ 18 - 13
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()));