Browse Source

CrashReporter: Don't crash when investigating a HackStudio crash

Previously when opening a crash report for HackStudio, the
`unveil("/bin/HackStudio", "rx")` call was failing because of the
earlier `unveil(executable_path.characters(), "r")` call requesting only
"r" permissions for it. This patch handles this specific case, so you
can crash HackStudio to your heart's content. :^)

Also, we were unveiling the executable path twice, once manually and
once implicitly as part of the coredump's libraries, so we now check for
the latter and avoid it.

Thanks to Daniel for noticing what was right in front of me and I didn't
see!

Co-authored-by: Daniel Bertalan <dani@danielbertalan.dev>
Sam Atkins 3 năm trước cách đây
mục cha
commit
94f2508519
1 tập tin đã thay đổi với 11 bổ sung4 xóa
  1. 11 4
      Userland/Applications/CrashReporter/main.cpp

+ 11 - 4
Userland/Applications/CrashReporter/main.cpp

@@ -165,14 +165,21 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
 
     if (unlink_on_exit)
         TRY(Core::System::unveil(coredump_path, "c"));
-    TRY(Core::System::unveil(executable_path.characters(), "r"));
-    TRY(Core::System::unveil("/bin/HackStudio", "rx"));
+
+    // If the executable is HackStudio, then the two unveil()s would conflict!
+    if (executable_path == "/bin/HackStudio") {
+        TRY(Core::System::unveil("/bin/HackStudio", "rx"));
+    } else {
+        TRY(Core::System::unveil(executable_path.characters(), "r"));
+        TRY(Core::System::unveil("/bin/HackStudio", "rx"));
+    }
+
     TRY(Core::System::unveil("/res", "r"));
     TRY(Core::System::unveil("/tmp/portal/launch", "rw"));
     TRY(Core::System::unveil("/usr/lib", "r"));
-    coredump->for_each_library([](auto library_info) {
+    coredump->for_each_library([&executable_path](auto library_info) {
         // FIXME: Make for_each_library propagate ErrorOr values so we can use TRY.
-        if (library_info.path.starts_with('/'))
+        if (library_info.path.starts_with('/') && library_info.path != executable_path)
             MUST(Core::System::unveil(library_info.path, "r"));
     });
     TRY(Core::System::unveil(nullptr, nullptr));