diff --git a/kernel/include/kernel/Process.h b/kernel/include/kernel/Process.h index 6eb394ca..3db255dc 100644 --- a/kernel/include/kernel/Process.h +++ b/kernel/include/kernel/Process.h @@ -176,7 +176,7 @@ namespace Kernel BAN::ErrorOr sys_smo_delete(SharedMemoryObjectManager::Key); BAN::ErrorOr sys_smo_map(SharedMemoryObjectManager::Key); - BAN::ErrorOr sys_ttyname(int fildes, char* storage); + BAN::ErrorOr sys_ttyname(int fildes, char* name, size_t namesize); BAN::ErrorOr sys_isatty(int fildes); BAN::ErrorOr sys_posix_openpt(int flags); BAN::ErrorOr sys_ptsname(int fildes, char* buffer, size_t buffer_len); diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index 74e70a3f..ac424de5 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -2275,17 +2275,17 @@ namespace Kernel return m_mapped_regions.back()->vaddr(); } - BAN::ErrorOr Process::sys_ttyname(int fildes, char* storage) + BAN::ErrorOr Process::sys_ttyname(int fildes, char* name, size_t namesize) { LockGuard _(m_process_lock); - TRY(validate_pointer_access(storage, TTY_NAME_MAX, true)); + TRY(validate_pointer_access(name, namesize, true)); auto inode = TRY(m_open_file_descriptors.inode_of(fildes)); if (!inode->is_tty()) return BAN::Error::from_errno(ENOTTY); auto path = TRY(m_open_file_descriptors.path_of(fildes)); - ASSERT(path.size() < TTY_NAME_MAX); - strncpy(storage, path.data(), path.size()); - storage[path.size()] = '\0'; + if (namesize < path.size() + 1) + return BAN::Error::from_errno(ERANGE); + strcpy(name, path.data()); return 0; } diff --git a/userspace/libraries/LibC/unistd.cpp b/userspace/libraries/LibC/unistd.cpp index 1f57d1ed..19d9a8ce 100644 --- a/userspace/libraries/LibC/unistd.cpp +++ b/userspace/libraries/LibC/unistd.cpp @@ -787,12 +787,19 @@ char* getlogin(void) char* ttyname(int fildes) { - static char storage[_POSIX_TTY_NAME_MAX]; - if (syscall(SYS_TTYNAME, fildes, storage) == -1) + static char storage[TTY_NAME_MAX]; + if (ttyname_r(fildes, storage, sizeof(storage)) != 0) return nullptr; return storage; } +int ttyname_r(int fildes, char* name, size_t namesize) +{ + if (syscall(SYS_TTYNAME, fildes, name, namesize)) + return errno; + return 0; +} + int access(const char* path, int amode) { return syscall(SYS_ACCESS, path, amode);