Blame view
fs/reiserfs/xattr_security.c
2.96 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 5 |
#include <linux/reiserfs_fs.h> #include <linux/errno.h> #include <linux/fs.h> #include <linux/pagemap.h> #include <linux/xattr.h> |
5a0e3ad6a include cleanup: ... |
6 |
#include <linux/slab.h> |
1da177e4c Linux-2.6.12-rc2 |
7 |
#include <linux/reiserfs_xattr.h> |
57fe60df6 reiserfs: add ato... |
8 |
#include <linux/security.h> |
1da177e4c Linux-2.6.12-rc2 |
9 |
#include <asm/uaccess.h> |
1da177e4c Linux-2.6.12-rc2 |
10 |
static int |
431547b3c sanitize xattr ha... |
11 12 |
security_get(struct dentry *dentry, const char *name, void *buffer, size_t size, int handler_flags) |
1da177e4c Linux-2.6.12-rc2 |
13 |
{ |
bd4c625c0 reiserfs: run scr... |
14 15 |
if (strlen(name) < sizeof(XATTR_SECURITY_PREFIX)) return -EINVAL; |
1da177e4c Linux-2.6.12-rc2 |
16 |
|
431547b3c sanitize xattr ha... |
17 |
if (IS_PRIVATE(dentry->d_inode)) |
bd4c625c0 reiserfs: run scr... |
18 |
return -EPERM; |
1da177e4c Linux-2.6.12-rc2 |
19 |
|
431547b3c sanitize xattr ha... |
20 |
return reiserfs_xattr_get(dentry->d_inode, name, buffer, size); |
1da177e4c Linux-2.6.12-rc2 |
21 22 23 |
} static int |
431547b3c sanitize xattr ha... |
24 25 |
security_set(struct dentry *dentry, const char *name, const void *buffer, size_t size, int flags, int handler_flags) |
1da177e4c Linux-2.6.12-rc2 |
26 |
{ |
bd4c625c0 reiserfs: run scr... |
27 28 |
if (strlen(name) < sizeof(XATTR_SECURITY_PREFIX)) return -EINVAL; |
1da177e4c Linux-2.6.12-rc2 |
29 |
|
431547b3c sanitize xattr ha... |
30 |
if (IS_PRIVATE(dentry->d_inode)) |
bd4c625c0 reiserfs: run scr... |
31 |
return -EPERM; |
1da177e4c Linux-2.6.12-rc2 |
32 |
|
431547b3c sanitize xattr ha... |
33 |
return reiserfs_xattr_set(dentry->d_inode, name, buffer, size, flags); |
1da177e4c Linux-2.6.12-rc2 |
34 |
} |
431547b3c sanitize xattr ha... |
35 36 |
static size_t security_list(struct dentry *dentry, char *list, size_t list_len, const char *name, size_t namelen, int handler_flags) |
1da177e4c Linux-2.6.12-rc2 |
37 |
{ |
48b32a355 reiserfs: use gen... |
38 |
const size_t len = namelen + 1; |
1da177e4c Linux-2.6.12-rc2 |
39 |
|
431547b3c sanitize xattr ha... |
40 |
if (IS_PRIVATE(dentry->d_inode)) |
bd4c625c0 reiserfs: run scr... |
41 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
42 |
|
48b32a355 reiserfs: use gen... |
43 44 45 46 |
if (list && len <= list_len) { memcpy(list, name, namelen); list[namelen] = '\0'; } |
1da177e4c Linux-2.6.12-rc2 |
47 |
|
bd4c625c0 reiserfs: run scr... |
48 |
return len; |
1da177e4c Linux-2.6.12-rc2 |
49 |
} |
57fe60df6 reiserfs: add ato... |
50 51 52 53 |
/* Initializes the security context for a new inode and returns the number * of blocks needed for the transaction. If successful, reiserfs_security * must be released using reiserfs_security_free when the caller is done. */ int reiserfs_security_init(struct inode *dir, struct inode *inode, |
2a7dba391 fs/vfs/security: ... |
54 |
const struct qstr *qstr, |
57fe60df6 reiserfs: add ato... |
55 56 57 |
struct reiserfs_security_handle *sec) { int blocks = 0; |
b82bb72ba reiserfs: dont as... |
58 59 60 61 62 63 64 |
int error; sec->name = NULL; /* Don't add selinux attributes on xattrs - they'll never get used */ if (IS_PRIVATE(dir)) return 0; |
9d8f13ba3 security: new sec... |
65 66 |
error = security_old_inode_init_security(inode, dir, qstr, &sec->name, &sec->value, &sec->length); |
57fe60df6 reiserfs: add ato... |
67 68 69 70 71 72 73 74 75 |
if (error) { if (error == -EOPNOTSUPP) error = 0; sec->name = NULL; sec->value = NULL; sec->length = 0; return error; } |
6cb4aff0a reiserfs: fix oop... |
76 |
if (sec->length && reiserfs_xattrs_initialized(inode->i_sb)) { |
57fe60df6 reiserfs: add ato... |
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
blocks = reiserfs_xattr_jcreate_nblocks(inode) + reiserfs_xattr_nblocks(inode, sec->length); /* We don't want to count the directories twice if we have * a default ACL. */ REISERFS_I(inode)->i_flags |= i_has_xattr_dir; } return blocks; } int reiserfs_security_write(struct reiserfs_transaction_handle *th, struct inode *inode, struct reiserfs_security_handle *sec) { int error; if (strlen(sec->name) < sizeof(XATTR_SECURITY_PREFIX)) return -EINVAL; error = reiserfs_xattr_set_handle(th, inode, sec->name, sec->value, sec->length, XATTR_CREATE); if (error == -ENODATA || error == -EOPNOTSUPP) error = 0; return error; } void reiserfs_security_free(struct reiserfs_security_handle *sec) { kfree(sec->name); kfree(sec->value); sec->name = NULL; sec->value = NULL; } |
94d09a98c reiserfs: constif... |
109 |
const struct xattr_handler reiserfs_xattr_security_handler = { |
1da177e4c Linux-2.6.12-rc2 |
110 111 112 |
.prefix = XATTR_SECURITY_PREFIX, .get = security_get, .set = security_set, |
1da177e4c Linux-2.6.12-rc2 |
113 114 |
.list = security_list, }; |