]> pilppa.org Git - linux-2.6-omap-h63xx.git/blob - fs/xattr.c
Merge with /home/tmlind/src/kernel/linux-2.6
[linux-2.6-omap-h63xx.git] / fs / xattr.c
1 /*
2   File: fs/xattr.c
3
4   Extended attribute handling.
5
6   Copyright (C) 2001 by Andreas Gruenbacher <a.gruenbacher@computer.org>
7   Copyright (C) 2001 SGI - Silicon Graphics, Inc <linux-xfs@oss.sgi.com>
8   Copyright (c) 2004 Red Hat, Inc., James Morris <jmorris@redhat.com>
9  */
10 #include <linux/fs.h>
11 #include <linux/slab.h>
12 #include <linux/smp_lock.h>
13 #include <linux/file.h>
14 #include <linux/xattr.h>
15 #include <linux/namei.h>
16 #include <linux/security.h>
17 #include <linux/syscalls.h>
18 #include <linux/module.h>
19 #include <linux/fsnotify.h>
20 #include <asm/uaccess.h>
21
22
23 /*
24  * Check permissions for extended attribute access.  This is a bit complicated
25  * because different namespaces have very different rules.
26  */
27 static int
28 xattr_permission(struct inode *inode, const char *name, int mask)
29 {
30         /*
31          * We can never set or remove an extended attribute on a read-only
32          * filesystem  or on an immutable / append-only inode.
33          */
34         if (mask & MAY_WRITE) {
35                 if (IS_RDONLY(inode))
36                         return -EROFS;
37                 if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
38                         return -EPERM;
39         }
40
41         /*
42          * No restriction for security.* and system.* from the VFS.  Decision
43          * on these is left to the underlying filesystem / security module.
44          */
45         if (!strncmp(name, XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN) ||
46             !strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN))
47                 return 0;
48
49         /*
50          * The trusted.* namespace can only accessed by a privilegued user.
51          */
52         if (!strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN))
53                 return (capable(CAP_SYS_ADMIN) ? 0 : -EPERM);
54
55         if (!strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN)) {
56                 if (!S_ISREG(inode->i_mode) &&
57                     (!S_ISDIR(inode->i_mode) || inode->i_mode & S_ISVTX))
58                         return -EPERM;
59         }
60
61         return permission(inode, mask, NULL);
62 }
63
64 int
65 vfs_setxattr(struct dentry *dentry, char *name, void *value,
66                 size_t size, int flags)
67 {
68         struct inode *inode = dentry->d_inode;
69         int error;
70
71         error = xattr_permission(inode, name, MAY_WRITE);
72         if (error)
73                 return error;
74
75         mutex_lock(&inode->i_mutex);
76         error = security_inode_setxattr(dentry, name, value, size, flags);
77         if (error)
78                 goto out;
79         error = -EOPNOTSUPP;
80         if (inode->i_op->setxattr) {
81                 error = inode->i_op->setxattr(dentry, name, value, size, flags);
82                 if (!error) {
83                         fsnotify_xattr(dentry);
84                         security_inode_post_setxattr(dentry, name, value,
85                                                      size, flags);
86                 }
87         } else if (!strncmp(name, XATTR_SECURITY_PREFIX,
88                                 XATTR_SECURITY_PREFIX_LEN)) {
89                 const char *suffix = name + XATTR_SECURITY_PREFIX_LEN;
90                 error = security_inode_setsecurity(inode, suffix, value,
91                                                    size, flags);
92                 if (!error)
93                         fsnotify_xattr(dentry);
94         }
95 out:
96         mutex_unlock(&inode->i_mutex);
97         return error;
98 }
99 EXPORT_SYMBOL_GPL(vfs_setxattr);
100
101 ssize_t
102 vfs_getxattr(struct dentry *dentry, char *name, void *value, size_t size)
103 {
104         struct inode *inode = dentry->d_inode;
105         int error;
106
107         error = xattr_permission(inode, name, MAY_READ);
108         if (error)
109                 return error;
110
111         error = security_inode_getxattr(dentry, name);
112         if (error)
113                 return error;
114
115         if (inode->i_op->getxattr)
116                 error = inode->i_op->getxattr(dentry, name, value, size);
117         else
118                 error = -EOPNOTSUPP;
119
120         if (!strncmp(name, XATTR_SECURITY_PREFIX,
121                                 XATTR_SECURITY_PREFIX_LEN)) {
122                 const char *suffix = name + XATTR_SECURITY_PREFIX_LEN;
123                 int ret = security_inode_getsecurity(inode, suffix, value,
124                                                      size, error);
125                 /*
126                  * Only overwrite the return value if a security module
127                  * is actually active.
128                  */
129                 if (ret != -EOPNOTSUPP)
130                         error = ret;
131         }
132
133         return error;
134 }
135 EXPORT_SYMBOL_GPL(vfs_getxattr);
136
137 int
138 vfs_removexattr(struct dentry *dentry, char *name)
139 {
140         struct inode *inode = dentry->d_inode;
141         int error;
142
143         if (!inode->i_op->removexattr)
144                 return -EOPNOTSUPP;
145
146         error = xattr_permission(inode, name, MAY_WRITE);
147         if (error)
148                 return error;
149
150         error = security_inode_removexattr(dentry, name);
151         if (error)
152                 return error;
153
154         mutex_lock(&inode->i_mutex);
155         error = inode->i_op->removexattr(dentry, name);
156         mutex_unlock(&inode->i_mutex);
157
158         if (!error)
159                 fsnotify_xattr(dentry);
160         return error;
161 }
162 EXPORT_SYMBOL_GPL(vfs_removexattr);
163
164
165 /*
166  * Extended attribute SET operations
167  */
168 static long
169 setxattr(struct dentry *d, char __user *name, void __user *value,
170          size_t size, int flags)
171 {
172         int error;
173         void *kvalue = NULL;
174         char kname[XATTR_NAME_MAX + 1];
175
176         if (flags & ~(XATTR_CREATE|XATTR_REPLACE))
177                 return -EINVAL;
178
179         error = strncpy_from_user(kname, name, sizeof(kname));
180         if (error == 0 || error == sizeof(kname))
181                 error = -ERANGE;
182         if (error < 0)
183                 return error;
184
185         if (size) {
186                 if (size > XATTR_SIZE_MAX)
187                         return -E2BIG;
188                 kvalue = kmalloc(size, GFP_KERNEL);
189                 if (!kvalue)
190                         return -ENOMEM;
191                 if (copy_from_user(kvalue, value, size)) {
192                         kfree(kvalue);
193                         return -EFAULT;
194                 }
195         }
196
197         error = vfs_setxattr(d, kname, kvalue, size, flags);
198         kfree(kvalue);
199         return error;
200 }
201
202 asmlinkage long
203 sys_setxattr(char __user *path, char __user *name, void __user *value,
204              size_t size, int flags)
205 {
206         struct nameidata nd;
207         int error;
208
209         error = user_path_walk(path, &nd);
210         if (error)
211                 return error;
212         error = setxattr(nd.dentry, name, value, size, flags);
213         path_release(&nd);
214         return error;
215 }
216
217 asmlinkage long
218 sys_lsetxattr(char __user *path, char __user *name, void __user *value,
219               size_t size, int flags)
220 {
221         struct nameidata nd;
222         int error;
223
224         error = user_path_walk_link(path, &nd);
225         if (error)
226                 return error;
227         error = setxattr(nd.dentry, name, value, size, flags);
228         path_release(&nd);
229         return error;
230 }
231
232 asmlinkage long
233 sys_fsetxattr(int fd, char __user *name, void __user *value,
234               size_t size, int flags)
235 {
236         struct file *f;
237         int error = -EBADF;
238
239         f = fget(fd);
240         if (!f)
241                 return error;
242         error = setxattr(f->f_dentry, name, value, size, flags);
243         fput(f);
244         return error;
245 }
246
247 /*
248  * Extended attribute GET operations
249  */
250 static ssize_t
251 getxattr(struct dentry *d, char __user *name, void __user *value, size_t size)
252 {
253         ssize_t error;
254         void *kvalue = NULL;
255         char kname[XATTR_NAME_MAX + 1];
256
257         error = strncpy_from_user(kname, name, sizeof(kname));
258         if (error == 0 || error == sizeof(kname))
259                 error = -ERANGE;
260         if (error < 0)
261                 return error;
262
263         if (size) {
264                 if (size > XATTR_SIZE_MAX)
265                         size = XATTR_SIZE_MAX;
266                 kvalue = kzalloc(size, GFP_KERNEL);
267                 if (!kvalue)
268                         return -ENOMEM;
269         }
270
271         error = vfs_getxattr(d, kname, kvalue, size);
272         if (error > 0) {
273                 if (size && copy_to_user(value, kvalue, error))
274                         error = -EFAULT;
275         } else if (error == -ERANGE && size >= XATTR_SIZE_MAX) {
276                 /* The file system tried to returned a value bigger
277                    than XATTR_SIZE_MAX bytes. Not possible. */
278                 error = -E2BIG;
279         }
280         kfree(kvalue);
281         return error;
282 }
283
284 asmlinkage ssize_t
285 sys_getxattr(char __user *path, char __user *name, void __user *value,
286              size_t size)
287 {
288         struct nameidata nd;
289         ssize_t error;
290
291         error = user_path_walk(path, &nd);
292         if (error)
293                 return error;
294         error = getxattr(nd.dentry, name, value, size);
295         path_release(&nd);
296         return error;
297 }
298
299 asmlinkage ssize_t
300 sys_lgetxattr(char __user *path, char __user *name, void __user *value,
301               size_t size)
302 {
303         struct nameidata nd;
304         ssize_t error;
305
306         error = user_path_walk_link(path, &nd);
307         if (error)
308                 return error;
309         error = getxattr(nd.dentry, name, value, size);
310         path_release(&nd);
311         return error;
312 }
313
314 asmlinkage ssize_t
315 sys_fgetxattr(int fd, char __user *name, void __user *value, size_t size)
316 {
317         struct file *f;
318         ssize_t error = -EBADF;
319
320         f = fget(fd);
321         if (!f)
322                 return error;
323         error = getxattr(f->f_dentry, name, value, size);
324         fput(f);
325         return error;
326 }
327
328 /*
329  * Extended attribute LIST operations
330  */
331 static ssize_t
332 listxattr(struct dentry *d, char __user *list, size_t size)
333 {
334         ssize_t error;
335         char *klist = NULL;
336
337         if (size) {
338                 if (size > XATTR_LIST_MAX)
339                         size = XATTR_LIST_MAX;
340                 klist = kmalloc(size, GFP_KERNEL);
341                 if (!klist)
342                         return -ENOMEM;
343         }
344
345         error = security_inode_listxattr(d);
346         if (error)
347                 goto out;
348         error = -EOPNOTSUPP;
349         if (d->d_inode->i_op && d->d_inode->i_op->listxattr) {
350                 error = d->d_inode->i_op->listxattr(d, klist, size);
351         } else {
352                 error = security_inode_listsecurity(d->d_inode, klist, size);
353                 if (size && error > size)
354                         error = -ERANGE;
355         }
356         if (error > 0) {
357                 if (size && copy_to_user(list, klist, error))
358                         error = -EFAULT;
359         } else if (error == -ERANGE && size >= XATTR_LIST_MAX) {
360                 /* The file system tried to returned a list bigger
361                    than XATTR_LIST_MAX bytes. Not possible. */
362                 error = -E2BIG;
363         }
364 out:
365         kfree(klist);
366         return error;
367 }
368
369 asmlinkage ssize_t
370 sys_listxattr(char __user *path, char __user *list, size_t size)
371 {
372         struct nameidata nd;
373         ssize_t error;
374
375         error = user_path_walk(path, &nd);
376         if (error)
377                 return error;
378         error = listxattr(nd.dentry, list, size);
379         path_release(&nd);
380         return error;
381 }
382
383 asmlinkage ssize_t
384 sys_llistxattr(char __user *path, char __user *list, size_t size)
385 {
386         struct nameidata nd;
387         ssize_t error;
388
389         error = user_path_walk_link(path, &nd);
390         if (error)
391                 return error;
392         error = listxattr(nd.dentry, list, size);
393         path_release(&nd);
394         return error;
395 }
396
397 asmlinkage ssize_t
398 sys_flistxattr(int fd, char __user *list, size_t size)
399 {
400         struct file *f;
401         ssize_t error = -EBADF;
402
403         f = fget(fd);
404         if (!f)
405                 return error;
406         error = listxattr(f->f_dentry, list, size);
407         fput(f);
408         return error;
409 }
410
411 /*
412  * Extended attribute REMOVE operations
413  */
414 static long
415 removexattr(struct dentry *d, char __user *name)
416 {
417         int error;
418         char kname[XATTR_NAME_MAX + 1];
419
420         error = strncpy_from_user(kname, name, sizeof(kname));
421         if (error == 0 || error == sizeof(kname))
422                 error = -ERANGE;
423         if (error < 0)
424                 return error;
425
426         return vfs_removexattr(d, kname);
427 }
428
429 asmlinkage long
430 sys_removexattr(char __user *path, char __user *name)
431 {
432         struct nameidata nd;
433         int error;
434
435         error = user_path_walk(path, &nd);
436         if (error)
437                 return error;
438         error = removexattr(nd.dentry, name);
439         path_release(&nd);
440         return error;
441 }
442
443 asmlinkage long
444 sys_lremovexattr(char __user *path, char __user *name)
445 {
446         struct nameidata nd;
447         int error;
448
449         error = user_path_walk_link(path, &nd);
450         if (error)
451                 return error;
452         error = removexattr(nd.dentry, name);
453         path_release(&nd);
454         return error;
455 }
456
457 asmlinkage long
458 sys_fremovexattr(int fd, char __user *name)
459 {
460         struct file *f;
461         int error = -EBADF;
462
463         f = fget(fd);
464         if (!f)
465                 return error;
466         error = removexattr(f->f_dentry, name);
467         fput(f);
468         return error;
469 }
470
471
472 static const char *
473 strcmp_prefix(const char *a, const char *a_prefix)
474 {
475         while (*a_prefix && *a == *a_prefix) {
476                 a++;
477                 a_prefix++;
478         }
479         return *a_prefix ? NULL : a;
480 }
481
482 /*
483  * In order to implement different sets of xattr operations for each xattr
484  * prefix with the generic xattr API, a filesystem should create a
485  * null-terminated array of struct xattr_handler (one for each prefix) and
486  * hang a pointer to it off of the s_xattr field of the superblock.
487  *
488  * The generic_fooxattr() functions will use this list to dispatch xattr
489  * operations to the correct xattr_handler.
490  */
491 #define for_each_xattr_handler(handlers, handler)               \
492                 for ((handler) = *(handlers)++;                 \
493                         (handler) != NULL;                      \
494                         (handler) = *(handlers)++)
495
496 /*
497  * Find the xattr_handler with the matching prefix.
498  */
499 static struct xattr_handler *
500 xattr_resolve_name(struct xattr_handler **handlers, const char **name)
501 {
502         struct xattr_handler *handler;
503
504         if (!*name)
505                 return NULL;
506
507         for_each_xattr_handler(handlers, handler) {
508                 const char *n = strcmp_prefix(*name, handler->prefix);
509                 if (n) {
510                         *name = n;
511                         break;
512                 }
513         }
514         return handler;
515 }
516
517 /*
518  * Find the handler for the prefix and dispatch its get() operation.
519  */
520 ssize_t
521 generic_getxattr(struct dentry *dentry, const char *name, void *buffer, size_t size)
522 {
523         struct xattr_handler *handler;
524         struct inode *inode = dentry->d_inode;
525
526         handler = xattr_resolve_name(inode->i_sb->s_xattr, &name);
527         if (!handler)
528                 return -EOPNOTSUPP;
529         return handler->get(inode, name, buffer, size);
530 }
531
532 /*
533  * Combine the results of the list() operation from every xattr_handler in the
534  * list.
535  */
536 ssize_t
537 generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size)
538 {
539         struct inode *inode = dentry->d_inode;
540         struct xattr_handler *handler, **handlers = inode->i_sb->s_xattr;
541         unsigned int size = 0;
542
543         if (!buffer) {
544                 for_each_xattr_handler(handlers, handler)
545                         size += handler->list(inode, NULL, 0, NULL, 0);
546         } else {
547                 char *buf = buffer;
548
549                 for_each_xattr_handler(handlers, handler) {
550                         size = handler->list(inode, buf, buffer_size, NULL, 0);
551                         if (size > buffer_size)
552                                 return -ERANGE;
553                         buf += size;
554                         buffer_size -= size;
555                 }
556                 size = buf - buffer;
557         }
558         return size;
559 }
560
561 /*
562  * Find the handler for the prefix and dispatch its set() operation.
563  */
564 int
565 generic_setxattr(struct dentry *dentry, const char *name, const void *value, size_t size, int flags)
566 {
567         struct xattr_handler *handler;
568         struct inode *inode = dentry->d_inode;
569
570         if (size == 0)
571                 value = "";  /* empty EA, do not remove */
572         handler = xattr_resolve_name(inode->i_sb->s_xattr, &name);
573         if (!handler)
574                 return -EOPNOTSUPP;
575         return handler->set(inode, name, value, size, flags);
576 }
577
578 /*
579  * Find the handler for the prefix and dispatch its set() operation to remove
580  * any associated extended attribute.
581  */
582 int
583 generic_removexattr(struct dentry *dentry, const char *name)
584 {
585         struct xattr_handler *handler;
586         struct inode *inode = dentry->d_inode;
587
588         handler = xattr_resolve_name(inode->i_sb->s_xattr, &name);
589         if (!handler)
590                 return -EOPNOTSUPP;
591         return handler->set(inode, name, NULL, 0, XATTR_REPLACE);
592 }
593
594 EXPORT_SYMBOL(generic_getxattr);
595 EXPORT_SYMBOL(generic_listxattr);
596 EXPORT_SYMBOL(generic_setxattr);
597 EXPORT_SYMBOL(generic_removexattr);