Explorar o código

Kernel: Copy command line to a safe place

This avoids kmalloc overwriting it because it may be within the
kmalloc or eternal pool.
Tom %!s(int64=4) %!d(string=hai) anos
pai
achega
41c005cb14
Modificáronse 3 ficheiros con 22 adicións e 4 borrados
  1. 15 2
      Kernel/CommandLine.cpp
  2. 2 1
      Kernel/CommandLine.h
  3. 5 1
      Kernel/init.cpp

+ 15 - 2
Kernel/CommandLine.cpp

@@ -25,21 +25,34 @@
  */
 
 #include <Kernel/CommandLine.h>
+#include <Kernel/StdLib.h>
 
 namespace Kernel {
 
+static char s_cmd_line[1024];
 static CommandLine* s_the;
 
+void CommandLine::early_initialize(const char* cmd_line)
+{
+    if (!cmd_line)
+        return;
+    size_t length = strlen(cmd_line);
+    if (length >= sizeof(s_cmd_line))
+        length = sizeof(s_cmd_line) -1;
+    memcpy(s_cmd_line, cmd_line, length);
+    s_cmd_line[length] = '\0';
+}
+
 const CommandLine& kernel_command_line()
 {
     ASSERT(s_the);
     return *s_the;
 }
 
-void CommandLine::initialize(const String& string)
+void CommandLine::initialize()
 {
     ASSERT(!s_the);
-    s_the = new CommandLine(string);
+    s_the = new CommandLine(s_cmd_line);
 }
 
 CommandLine::CommandLine(const String& string)

+ 2 - 1
Kernel/CommandLine.h

@@ -36,7 +36,8 @@ class CommandLine {
     AK_MAKE_ETERNAL;
 
 public:
-    static void initialize(const String&);
+    static void early_initialize(const char* cmd_line);
+    static void initialize();
 
     const String& string() const { return m_string; }
     Optional<String> lookup(const String& key) const;

+ 5 - 1
Kernel/init.cpp

@@ -113,6 +113,10 @@ extern "C" [[noreturn]] void init()
 {
     setup_serial_debug();
 
+    // We need to copy the command line before kmalloc is initialized,
+    // as it may overwrite parts of multiboot!
+    CommandLine::early_initialize(reinterpret_cast<const char*>(low_physical_to_virtual(multiboot_info_ptr->cmdline)));
+
     s_bsp_processor.early_initialize(0);
 
     // Invoke the constructors needed for the kernel heap
@@ -123,7 +127,7 @@ extern "C" [[noreturn]] void init()
 
     s_bsp_processor.initialize(0);
 
-    CommandLine::initialize(reinterpret_cast<const char*>(low_physical_to_virtual(multiboot_info_ptr->cmdline)));
+    CommandLine::initialize();
     MemoryManager::initialize(0);
 
     // Invoke all static global constructors in the kernel.