diff --git a/Applications/FileManager/PropertiesDialog.cpp b/Applications/FileManager/PropertiesDialog.cpp index 97866016b0..10b8950914 100644 --- a/Applications/FileManager/PropertiesDialog.cpp +++ b/Applications/FileManager/PropertiesDialog.cpp @@ -108,10 +108,11 @@ PropertiesDialog::PropertiesDialog(GUI::FileSystemModel& model, String path, boo if (S_ISLNK(m_mode)) { char link_destination[PATH_MAX]; - if (readlink(path.characters(), link_destination, sizeof(link_destination)) < 0) { + ssize_t len = readlink(path.characters(), link_destination, sizeof(link_destination)); + if (len < 0) { perror("readlink"); } else { - properties.append({ "Link target:", link_destination }); + properties.append({ "Link target:", String(link_destination, len) }); } } diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 0470e5f3fc..23709611f7 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -1950,10 +1950,10 @@ int Process::sys$readlink(const Syscall::SC_readlink_params* user_params) return -EIO; // FIXME: Get a more detailed error from VFS. auto link_target = String::copy(contents); - if (link_target.length() + 1 > params.buffer.size) + if (link_target.length() > params.buffer.size) return -ENAMETOOLONG; - copy_to_user(params.buffer.data, link_target.characters(), link_target.length() + 1); - return link_target.length() + 1; + copy_to_user(params.buffer.data, link_target.characters(), link_target.length()); + return link_target.length(); } int Process::sys$chdir(const char* user_path, size_t path_length) diff --git a/Userland/ls.cpp b/Userland/ls.cpp index 596ffd774e..b567356fce 100644 --- a/Userland/ls.cpp +++ b/Userland/ls.cpp @@ -176,11 +176,13 @@ size_t print_name(const struct stat& st, const String& name, const char* path_fo if (S_ISLNK(st.st_mode)) { if (path_for_link_resolution) { char linkbuf[PATH_MAX]; - ssize_t nread = readlink(path_for_link_resolution, linkbuf, sizeof(linkbuf)); - if (nread < 0) + ssize_t nread = readlink(path_for_link_resolution, linkbuf, sizeof(linkbuf) - 1); + if (nread < 0) { perror("readlink failed"); - else + } else { + linkbuf[nread] = '\0'; nprinted += printf(" -> ") + print_escaped(linkbuf); + } } else { nprinted += printf("@"); }