kernel: vfs: don't use the attribute name user buffer directly.

instead copy the name on the stack.
This commit is contained in:
Jérôme Duval
2018-01-07 23:33:04 +01:00
parent ff678dd91b
commit 9fbffea6f4
+31 -3
View File
@@ -9578,9 +9578,18 @@ _user_open_attr_dir(int fd, const char* userPath, bool traverseLeafLink)
ssize_t ssize_t
_user_read_attr(int fd, const char* attribute, off_t pos, void* userBuffer, _user_read_attr(int fd, const char* userAttribute, off_t pos, void* userBuffer,
size_t readBytes) size_t readBytes)
{ {
char attribute[B_FILE_NAME_LENGTH];
if (userAttribute == NULL)
return B_BAD_VALUE;
if (!IS_USER_ADDRESS(userAttribute)
|| user_strlcpy(attribute, userAttribute, sizeof(attribute)) < B_OK) {
return B_BAD_ADDRESS;
}
int attr = attr_open(fd, NULL, attribute, O_RDONLY, false); int attr = attr_open(fd, NULL, attribute, O_RDONLY, false);
if (attr < 0) if (attr < 0)
return attr; return attr;
@@ -9593,9 +9602,18 @@ _user_read_attr(int fd, const char* attribute, off_t pos, void* userBuffer,
ssize_t ssize_t
_user_write_attr(int fd, const char* attribute, uint32 type, off_t pos, _user_write_attr(int fd, const char* userAttribute, uint32 type, off_t pos,
const void* buffer, size_t writeBytes) const void* buffer, size_t writeBytes)
{ {
char attribute[B_FILE_NAME_LENGTH];
if (userAttribute == NULL)
return B_BAD_VALUE;
if (!IS_USER_ADDRESS(userAttribute)
|| user_strlcpy(attribute, userAttribute, sizeof(attribute)) < B_OK) {
return B_BAD_ADDRESS;
}
// Try to support the BeOS typical truncation as well as the position // Try to support the BeOS typical truncation as well as the position
// argument // argument
int attr = attr_create(fd, NULL, attribute, type, int attr = attr_create(fd, NULL, attribute, type,
@@ -9611,8 +9629,18 @@ _user_write_attr(int fd, const char* attribute, uint32 type, off_t pos,
status_t status_t
_user_stat_attr(int fd, const char* attribute, struct attr_info* userAttrInfo) _user_stat_attr(int fd, const char* userAttribute,
struct attr_info* userAttrInfo)
{ {
char attribute[B_FILE_NAME_LENGTH];
if (userAttribute == NULL || userAttrInfo == NULL)
return B_BAD_VALUE;
if (!IS_USER_ADDRESS(userAttribute) || !IS_USER_ADDRESS(userAttrInfo)
|| user_strlcpy(attribute, userAttribute, sizeof(attribute)) < B_OK) {
return B_BAD_ADDRESS;
}
int attr = attr_open(fd, NULL, attribute, O_RDONLY, false); int attr = attr_open(fd, NULL, attribute, O_RDONLY, false);
if (attr < 0) if (attr < 0)
return attr; return attr;