Skip to content

Commit

Permalink
Kernel: Don't disable interrupts to access the system hostname.
Browse files Browse the repository at this point in the history
  • Loading branch information
awesomekling committed Feb 7, 2019
1 parent 458706c commit 2e663ed
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 16 deletions.
23 changes: 7 additions & 16 deletions Kernel/Process.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,18 +33,7 @@ static const dword default_userspace_stack_size = 65536;
static pid_t next_pid;
InlineLinkedList<Process>* 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;

Expand All @@ -56,6 +45,7 @@ void Process::initialize()
next_pid = 0;
g_processes = new InlineLinkedList<Process>;
s_hostname = new String("courage");
s_hostname_lock = new Lock;
Scheduler::initialize();
initialize_gui_statics();
}
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
}

Expand Down
10 changes: 10 additions & 0 deletions Kernel/StdLib.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions Kernel/StdLib.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 2e663ed

Please sign in to comment.