diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 568648401e..9c066baf95 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -1953,11 +1953,11 @@ int Process::sys$readlink(const Syscall::SC_readlink_params* user_params) if (contents.is_error()) return contents.error(); - auto link_target = String::copy(contents.value()); - if (link_target.length() > params.buffer.size) - return -ENAMETOOLONG; - copy_to_user(params.buffer.data, link_target.characters(), link_target.length()); - return link_target.length(); + auto& link_target = contents.value(); + auto size_to_copy = min(link_target.size(), params.buffer.size); + copy_to_user(params.buffer.data, link_target.data(), size_to_copy); + // Note: we return the whole size here, not the copied size. + return link_target.size(); } int Process::sys$chdir(const char* user_path, size_t path_length) diff --git a/Libraries/LibC/unistd.cpp b/Libraries/LibC/unistd.cpp index 75b0458639..cc3930a141 100644 --- a/Libraries/LibC/unistd.cpp +++ b/Libraries/LibC/unistd.cpp @@ -364,7 +364,8 @@ ssize_t readlink(const char* path, char* buffer, size_t size) { Syscall::SC_readlink_params params { { path, strlen(path) }, { buffer, size } }; int rc = syscall(SC_readlink, ¶ms); - __RETURN_WITH_ERRNO(rc, rc, -1); + // Return the number of bytes placed in the buffer, not the full path size. + __RETURN_WITH_ERRNO(rc, min((size_t)rc, size), -1); } off_t lseek(int fd, off_t offset, int whence)