瀏覽代碼

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 年之前
父節點
當前提交
94f2508519
共有 1 個文件被更改,包括 11 次插入4 次删除
  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));