* 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
This commit is contained in:
+40
-13
@@ -2462,6 +2462,14 @@ common_read_link(int fd, char *path, char *buffer, size_t bufferSize,
|
|||||||
|
|
||||||
put_vnode(vnode);
|
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;
|
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))
|
if (!IS_USER_ADDRESS(leaf))
|
||||||
return B_BAD_ADDRESS;
|
return B_BAD_ADDRESS;
|
||||||
|
|
||||||
status = user_strlcpy(stackLeaf, leaf, B_FILE_NAME_LENGTH);
|
int len = user_strlcpy(stackLeaf, leaf, B_FILE_NAME_LENGTH);
|
||||||
if (status != B_OK)
|
if (len < 0)
|
||||||
return status;
|
return len;
|
||||||
|
if (len >= B_FILE_NAME_LENGTH)
|
||||||
|
return B_NAME_TOO_LONG;
|
||||||
leaf = stackLeaf;
|
leaf = stackLeaf;
|
||||||
|
|
||||||
// filter invalid leaf names
|
// 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)
|
if (status != B_OK)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
status = user_strlcpy(userName, name, nameLength);
|
int len = user_strlcpy(userName, name, nameLength);
|
||||||
return (status == B_OK ? fdCloser.Detach() : status);
|
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)
|
if (status < B_OK)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
// ToDo: think about buffer length and the return value at read_link()
|
|
||||||
status = user_strlcpy(userBuffer, buffer, bufferSize);
|
status = user_strlcpy(userBuffer, buffer, bufferSize);
|
||||||
if (status >= 0)
|
if (status < 0)
|
||||||
status = B_OK;
|
|
||||||
return status;
|
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) {
|
if (userPath) {
|
||||||
// path given: get the stat of the node referred to by (fd, path)
|
// path given: get the stat of the node referred to by (fd, path)
|
||||||
char path[SYS_MAX_PATH_LEN + 1];
|
char path[SYS_MAX_PATH_LEN + 1];
|
||||||
if (!IS_USER_ADDRESS(userPath)
|
if (!IS_USER_ADDRESS(userPath))
|
||||||
|| user_strlcpy(path, userPath, SYS_MAX_PATH_LEN) < B_OK)
|
|
||||||
return B_BAD_ADDRESS;
|
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);
|
status = common_path_read_stat(fd, path, traverseLink, &stat, false);
|
||||||
} else {
|
} else {
|
||||||
@@ -4889,9 +4912,13 @@ _user_write_stat(int fd, const char *userPath, bool traverseLeafLink,
|
|||||||
|
|
||||||
if (userPath) {
|
if (userPath) {
|
||||||
// path given: write the stat of the node referred to by (fd, path)
|
// path given: write the stat of the node referred to by (fd, path)
|
||||||
if (!IS_USER_ADDRESS(userPath)
|
if (!IS_USER_ADDRESS(userPath))
|
||||||
|| user_strlcpy(path, userPath, SYS_MAX_PATH_LEN) < B_OK)
|
|
||||||
return B_BAD_ADDRESS;
|
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,
|
status = common_path_write_stat(fd, path, traverseLeafLink, &stat,
|
||||||
statMask, false);
|
statMask, false);
|
||||||
|
|||||||
Reference in New Issue
Block a user