diff --git a/Kernel/CoreDump.cpp b/Kernel/CoreDump.cpp index 5e44b33e61..1911776158 100644 --- a/Kernel/CoreDump.cpp +++ b/Kernel/CoreDump.cpp @@ -40,12 +40,12 @@ namespace Kernel { -OwnPtr CoreDump::create(Process& process, const LexicalPath& output_path) +OwnPtr CoreDump::create(Process& process, const String& output_path) { auto fd = create_target_file(process, output_path); if (!fd) return nullptr; - return make(process, fd.release_nonnull()); + return adopt_own(*new CoreDump(process, fd.release_nonnull())); } CoreDump::CoreDump(Process& process, NonnullRefPtr&& fd) @@ -59,9 +59,10 @@ CoreDump::~CoreDump() { } -RefPtr CoreDump::create_target_file(const Process& process, const LexicalPath& output_path) +RefPtr CoreDump::create_target_file(const Process& process, const String& output_path) { - auto output_directory = output_path.dirname(); + LexicalPath lexical_path(output_path); + auto output_directory = lexical_path.dirname(); if (VFS::the().open_directory(output_directory, VFS::the().root_custody()).is_error()) { auto res = VFS::the().mkdir(output_directory, 0777, VFS::the().root_custody()); if (res.is_error()) @@ -71,7 +72,7 @@ RefPtr CoreDump::create_target_file(const Process& process, con if (tmp_dir.is_error()) return nullptr; auto fd_or_error = VFS::the().open( - output_path.basename(), + lexical_path.basename(), O_CREAT | O_WRONLY | O_EXCL, 0, // We will enable reading from userspace when we finish generating the coredump file *tmp_dir.value(), diff --git a/Kernel/CoreDump.h b/Kernel/CoreDump.h index 20e5df51f4..ae2fdd3809 100644 --- a/Kernel/CoreDump.h +++ b/Kernel/CoreDump.h @@ -39,16 +39,14 @@ class Process; class CoreDump { public: - static OwnPtr create(Process&, const LexicalPath& output_path); + static OwnPtr create(Process&, const String& output_path); ~CoreDump(); void write(); - // Has to be public for OwnPtr::make - CoreDump(Process&, NonnullRefPtr&&); - private: - static RefPtr create_target_file(const Process&, const LexicalPath& output_path); + CoreDump(Process&, NonnullRefPtr&&); + static RefPtr create_target_file(const Process&, const String& output_path); void write_elf_header(); void write_program_headers(size_t notes_size); diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 64745ee41e..8d2b5e2d26 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -588,7 +588,7 @@ void Process::finalize() #endif if (is_profiling()) { - auto coredump = CoreDump::create(*this, LexicalPath { String::format("/tmp/profiler_coredumps/%d", pid().value()) }); + auto coredump = CoreDump::create(*this, String::formatted("/tmp/profiler_coredumps/{}", pid().value())); if (coredump) { coredump->write(); } else { @@ -598,8 +598,8 @@ void Process::finalize() if (m_should_dump_core) { dbgln("Generating coredump for pid: {}", m_pid.value()); - auto coredump_path = String::format("/tmp/coredump/%s_%d_%u", name().characters(), m_pid.value(), RTC::now()); - auto coredump = CoreDump::create(*this, LexicalPath { coredump_path }); + auto coredump_path = String::formatted("/tmp/coredump/{}_{}_{}", name(), m_pid.value(), RTC::now()); + auto coredump = CoreDump::create(*this, coredump_path); if (coredump) { coredump->write(); } else { diff --git a/Kernel/Syscalls/profiling.cpp b/Kernel/Syscalls/profiling.cpp index cb6ded68f4..47e7536669 100644 --- a/Kernel/Syscalls/profiling.cpp +++ b/Kernel/Syscalls/profiling.cpp @@ -60,7 +60,7 @@ int Process::sys$profiling_disable(pid_t pid) // We explicitly unlock here because we can't hold the lock when writing the coredump VFS lock.unlock(); - auto coredump = CoreDump::create(*process, LexicalPath { String::format("/tmp/profiler_coredumps/%d", pid) }); + auto coredump = CoreDump::create(*process, String::formatted("/tmp/profiler_coredumps/%d", pid)); coredump->write(); return 0; }