From 48d046ac0527944b88e8bd2b943ec5814359e48f Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sun, 29 Aug 2004 11:58:04 +0000 Subject: [PATCH] * Fixed usage of user_strlcpy() in several places. * null-terminated the result of common_read_link(). * Fixed return value of _user_read_link(). git-svn-id: file:///srv/svn/repos/haiku/trunk/current@8705 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kernel/core/fs/vfs.cpp | 55 ++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 14 deletions(-) diff --git a/src/kernel/core/fs/vfs.cpp b/src/kernel/core/fs/vfs.cpp index 4b2aa6c80b..15b0a57d53 100755 --- a/src/kernel/core/fs/vfs.cpp +++ b/src/kernel/core/fs/vfs.cpp @@ -2462,6 +2462,14 @@ common_read_link(int fd, char *path, char *buffer, size_t bufferSize, put_vnode(vnode); + // null terminate the result + if (status >= 0 && bufferSize > 0) { + if (status < (int)bufferSize) + buffer[status] = '\0'; + else + buffer[bufferSize - 1] = '\0'; + } + return status; } @@ -4399,9 +4407,11 @@ _user_entry_ref_to_path(dev_t device, ino_t inode, const char *leaf, if (!IS_USER_ADDRESS(leaf)) return B_BAD_ADDRESS; - status = user_strlcpy(stackLeaf, leaf, B_FILE_NAME_LENGTH); - if (status != B_OK) - return status; + int len = user_strlcpy(stackLeaf, leaf, B_FILE_NAME_LENGTH); + if (len < 0) + return len; + if (len >= B_FILE_NAME_LENGTH) + return B_NAME_TOO_LONG; leaf = stackLeaf; // filter invalid leaf names @@ -4435,7 +4445,12 @@ _user_entry_ref_to_path(dev_t device, ino_t inode, const char *leaf, } } - return user_strlcpy(userPath, path, pathLength); + int len = user_strlcpy(userPath, path, pathLength); + if (len < 0) + return len; + if (len >= (int)pathLength) + return B_BUFFER_OVERFLOW; + return B_OK; } @@ -4538,8 +4553,13 @@ _user_open_parent_dir(int fd, char *userName, size_t nameLength) if (status != B_OK) return status; - status = user_strlcpy(userName, name, nameLength); - return (status == B_OK ? fdCloser.Detach() : status); + int len = user_strlcpy(userName, name, nameLength); + if (len < 0) + return len; + if (len >= (int)nameLength) + return B_BUFFER_OVERFLOW; + + return fdCloser.Detach(); } @@ -4677,11 +4697,10 @@ _user_read_link(int fd, const char *userPath, char *userBuffer, size_t bufferSiz if (status < B_OK) return status; - // ToDo: think about buffer length and the return value at read_link() status = user_strlcpy(userBuffer, buffer, bufferSize); - if (status >= 0) - status = B_OK; - return status; + if (status < 0) + return status; + return (status >= (int)bufferSize ? bufferSize : status + 1); } @@ -4840,9 +4859,13 @@ _user_read_stat(int fd, const char *userPath, bool traverseLink, if (userPath) { // path given: get the stat of the node referred to by (fd, path) char path[SYS_MAX_PATH_LEN + 1]; - if (!IS_USER_ADDRESS(userPath) - || user_strlcpy(path, userPath, SYS_MAX_PATH_LEN) < B_OK) + if (!IS_USER_ADDRESS(userPath)) return B_BAD_ADDRESS; + int len = user_strlcpy(path, userPath, SYS_MAX_PATH_LEN); + if (len < 0) + return len; + if (len >= SYS_MAX_PATH_LEN) + return B_NAME_TOO_LONG; status = common_path_read_stat(fd, path, traverseLink, &stat, false); } else { @@ -4889,9 +4912,13 @@ _user_write_stat(int fd, const char *userPath, bool traverseLeafLink, if (userPath) { // path given: write the stat of the node referred to by (fd, path) - if (!IS_USER_ADDRESS(userPath) - || user_strlcpy(path, userPath, SYS_MAX_PATH_LEN) < B_OK) + if (!IS_USER_ADDRESS(userPath)) return B_BAD_ADDRESS; + int len = user_strlcpy(path, userPath, SYS_MAX_PATH_LEN); + if (len < 0) + return len; + if (len >= SYS_MAX_PATH_LEN) + return B_NAME_TOO_LONG; status = common_path_write_stat(fd, path, traverseLeafLink, &stat, statMask, false);