| .. | .. |
|---|
| 11 | 11 | |
|---|
| 12 | 12 | static int |
|---|
| 13 | 13 | security_get(const struct xattr_handler *handler, struct dentry *unused, |
|---|
| 14 | | - struct inode *inode, const char *name, void *buffer, size_t size) |
|---|
| 14 | + struct inode *inode, const char *name, void *buffer, size_t size, |
|---|
| 15 | + int flags) |
|---|
| 15 | 16 | { |
|---|
| 16 | 17 | if (IS_PRIVATE(inode)) |
|---|
| 17 | 18 | return -EPERM; |
|---|
| .. | .. |
|---|
| 49 | 50 | int error; |
|---|
| 50 | 51 | |
|---|
| 51 | 52 | sec->name = NULL; |
|---|
| 53 | + sec->value = NULL; |
|---|
| 52 | 54 | |
|---|
| 53 | 55 | /* Don't add selinux attributes on xattrs - they'll never get used */ |
|---|
| 54 | 56 | if (IS_PRIVATE(dir)) |
|---|
| .. | .. |
|---|
| 80 | 82 | struct inode *inode, |
|---|
| 81 | 83 | struct reiserfs_security_handle *sec) |
|---|
| 82 | 84 | { |
|---|
| 85 | + char xattr_name[XATTR_NAME_MAX + 1] = XATTR_SECURITY_PREFIX; |
|---|
| 83 | 86 | int error; |
|---|
| 84 | | - if (strlen(sec->name) < sizeof(XATTR_SECURITY_PREFIX)) |
|---|
| 87 | + |
|---|
| 88 | + if (XATTR_SECURITY_PREFIX_LEN + strlen(sec->name) > XATTR_NAME_MAX) |
|---|
| 85 | 89 | return -EINVAL; |
|---|
| 86 | 90 | |
|---|
| 87 | | - error = reiserfs_xattr_set_handle(th, inode, sec->name, sec->value, |
|---|
| 91 | + strlcat(xattr_name, sec->name, sizeof(xattr_name)); |
|---|
| 92 | + |
|---|
| 93 | + error = reiserfs_xattr_set_handle(th, inode, xattr_name, sec->value, |
|---|
| 88 | 94 | sec->length, XATTR_CREATE); |
|---|
| 89 | 95 | if (error == -ENODATA || error == -EOPNOTSUPP) |
|---|
| 90 | 96 | error = 0; |
|---|
| .. | .. |
|---|
| 94 | 100 | |
|---|
| 95 | 101 | void reiserfs_security_free(struct reiserfs_security_handle *sec) |
|---|
| 96 | 102 | { |
|---|
| 97 | | - kfree(sec->name); |
|---|
| 98 | 103 | kfree(sec->value); |
|---|
| 99 | 104 | sec->name = NULL; |
|---|
| 100 | 105 | sec->value = NULL; |
|---|