Blame view

fs/reiserfs/xattr_security.c 2.96 KB
1da177e4c   Linus Torvalds   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   Tejun Heo   include cleanup: ...
6
  #include <linux/slab.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7
  #include <linux/reiserfs_xattr.h>
57fe60df6   Jeff Mahoney   reiserfs: add ato...
8
  #include <linux/security.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
9
  #include <asm/uaccess.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
10
  static int
431547b3c   Christoph Hellwig   sanitize xattr ha...
11
12
  security_get(struct dentry *dentry, const char *name, void *buffer, size_t size,
  		int handler_flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
13
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
14
15
  	if (strlen(name) < sizeof(XATTR_SECURITY_PREFIX))
  		return -EINVAL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
16

431547b3c   Christoph Hellwig   sanitize xattr ha...
17
  	if (IS_PRIVATE(dentry->d_inode))
bd4c625c0   Linus Torvalds   reiserfs: run scr...
18
  		return -EPERM;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
19

431547b3c   Christoph Hellwig   sanitize xattr ha...
20
  	return reiserfs_xattr_get(dentry->d_inode, name, buffer, size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
22
23
  }
  
  static int
431547b3c   Christoph Hellwig   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   Linus Torvalds   Linux-2.6.12-rc2
26
  {
bd4c625c0   Linus Torvalds   reiserfs: run scr...
27
28
  	if (strlen(name) < sizeof(XATTR_SECURITY_PREFIX))
  		return -EINVAL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
29

431547b3c   Christoph Hellwig   sanitize xattr ha...
30
  	if (IS_PRIVATE(dentry->d_inode))
bd4c625c0   Linus Torvalds   reiserfs: run scr...
31
  		return -EPERM;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
32

431547b3c   Christoph Hellwig   sanitize xattr ha...
33
  	return reiserfs_xattr_set(dentry->d_inode, name, buffer, size, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
34
  }
431547b3c   Christoph Hellwig   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   Linus Torvalds   Linux-2.6.12-rc2
37
  {
48b32a355   Jeff Mahoney   reiserfs: use gen...
38
  	const size_t len = namelen + 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
39

431547b3c   Christoph Hellwig   sanitize xattr ha...
40
  	if (IS_PRIVATE(dentry->d_inode))
bd4c625c0   Linus Torvalds   reiserfs: run scr...
41
  		return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
42

48b32a355   Jeff Mahoney   reiserfs: use gen...
43
44
45
46
  	if (list && len <= list_len) {
  		memcpy(list, name, namelen);
  		list[namelen] = '\0';
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47

bd4c625c0   Linus Torvalds   reiserfs: run scr...
48
  	return len;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49
  }
57fe60df6   Jeff Mahoney   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   Eric Paris   fs/vfs/security: ...
54
  			   const struct qstr *qstr,
57fe60df6   Jeff Mahoney   reiserfs: add ato...
55
56
57
  			   struct reiserfs_security_handle *sec)
  {
  	int blocks = 0;
b82bb72ba   Jeff Mahoney   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   Mimi Zohar   security: new sec...
65
66
  	error = security_old_inode_init_security(inode, dir, qstr, &sec->name,
  						 &sec->value, &sec->length);
57fe60df6   Jeff Mahoney   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   Jeff Mahoney   reiserfs: fix oop...
76
  	if (sec->length && reiserfs_xattrs_initialized(inode->i_sb)) {
57fe60df6   Jeff Mahoney   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   Stephen Hemminger   reiserfs: constif...
109
  const struct xattr_handler reiserfs_xattr_security_handler = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
110
111
112
  	.prefix = XATTR_SECURITY_PREFIX,
  	.get = security_get,
  	.set = security_set,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
113
114
  	.list = security_list,
  };