diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index f44e9347c7..1fc1fb017e 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -33,18 +33,7 @@ static const dword default_userspace_stack_size = 65536; static pid_t next_pid; InlineLinkedList* g_processes; static String* s_hostname; - -static String& hostname_storage(InterruptDisabler&) -{ - ASSERT(s_hostname); - return *s_hostname; -} - -static String get_hostname() -{ - InterruptDisabler disabler; - return hostname_storage(disabler).isolated_copy(); -} +static Lock* s_hostname_lock; CoolGlobals* g_cool_globals; @@ -56,6 +45,7 @@ void Process::initialize() next_pid = 0; g_processes = new InlineLinkedList; s_hostname = new String("courage"); + s_hostname_lock = new Lock; Scheduler::initialize(); initialize_gui_statics(); } @@ -216,10 +206,10 @@ int Process::sys$gethostname(char* buffer, size_t size) { if (!validate_write(buffer, size)) return -EFAULT; - auto hostname = get_hostname(); - if (size < (hostname.length() + 1)) + LOCKER(*s_hostname_lock); + if (size < (s_hostname->length() + 1)) return -ENAMETOOLONG; - memcpy(buffer, hostname.characters(), size); + strcpy(buffer, s_hostname->characters()); return 0; } @@ -1398,7 +1388,8 @@ int Process::sys$uname(utsname* buf) strcpy(buf->release, "1.0-dev"); strcpy(buf->version, "FIXME"); strcpy(buf->machine, "i386"); - strcpy(buf->nodename, get_hostname().characters()); + LOCKER(*s_hostname_lock); + strncpy(buf->nodename, s_hostname->characters(), sizeof(utsname::nodename)); return 0; } diff --git a/Kernel/StdLib.cpp b/Kernel/StdLib.cpp index 55ed583d5f..87e1df0506 100644 --- a/Kernel/StdLib.cpp +++ b/Kernel/StdLib.cpp @@ -40,6 +40,16 @@ void strcpy(char* dest, const char *src) while ((*dest++ = *src++) != '\0'); } +char* strncpy(char* dest, const char* src, size_t n) +{ + size_t i; + for (i = 0; i < n && src[i] != '\0'; ++i) + dest[i] = src[i]; + for ( ; i < n; ++i) + dest[i] = '\0'; + return dest; +} + void* memset(void* dest_ptr, byte c, dword n) { dword dest = (dword)dest_ptr; diff --git a/Kernel/StdLib.h b/Kernel/StdLib.h index d93bfae7d0..f2e2544884 100644 --- a/Kernel/StdLib.h +++ b/Kernel/StdLib.h @@ -6,6 +6,7 @@ extern "C" { void memcpy(void*, const void*, dword); void strcpy(char*, const char*); +char* strncpy(char*, const char*, size_t); int strcmp(char const*, const char*); size_t strlen(const char*); void *memset(void*, byte, dword);