xattr.c 23.6 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13
/*
  File: fs/xattr.c

  Extended attribute handling.

  Copyright (C) 2001 by Andreas Gruenbacher <a.gruenbacher@computer.org>
  Copyright (C) 2001 SGI - Silicon Graphics, Inc <linux-xfs@oss.sgi.com>
  Copyright (c) 2004 Red Hat, Inc., James Morris <jmorris@redhat.com>
 */
#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/file.h>
#include <linux/xattr.h>
14
#include <linux/mount.h>
L
Linus Torvalds 已提交
15 16
#include <linux/namei.h>
#include <linux/security.h>
M
Mimi Zohar 已提交
17
#include <linux/evm.h>
L
Linus Torvalds 已提交
18
#include <linux/syscalls.h>
19
#include <linux/export.h>
R
Robert Love 已提交
20
#include <linux/fsnotify.h>
21
#include <linux/audit.h>
22
#include <linux/vmalloc.h>
23
#include <linux/posix_acl_xattr.h>
L
Linus Torvalds 已提交
24

25
#include <asm/uaccess.h>
26

27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
static const char *
strcmp_prefix(const char *a, const char *a_prefix)
{
	while (*a_prefix && *a == *a_prefix) {
		a++;
		a_prefix++;
	}
	return *a_prefix ? NULL : a;
}

/*
 * In order to implement different sets of xattr operations for each xattr
 * prefix with the generic xattr API, a filesystem should create a
 * null-terminated array of struct xattr_handler (one for each prefix) and
 * hang a pointer to it off of the s_xattr field of the superblock.
 *
 * The generic_fooxattr() functions will use this list to dispatch xattr
 * operations to the correct xattr_handler.
 */
#define for_each_xattr_handler(handlers, handler)		\
	if (handlers)						\
		for ((handler) = *(handlers)++;			\
			(handler) != NULL;			\
			(handler) = *(handlers)++)

/*
 * Find the xattr_handler with the matching prefix.
 */
static const struct xattr_handler *
56
xattr_resolve_name(struct inode *inode, const char **name)
57
{
58
	const struct xattr_handler **handlers = inode->i_sb->s_xattr;
59 60
	const struct xattr_handler *handler;

61 62
	if (!(inode->i_opflags & IOP_XATTR))
		return ERR_PTR(-EOPNOTSUPP);
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
	for_each_xattr_handler(handlers, handler) {
		const char *n;

		n = strcmp_prefix(*name, xattr_prefix(handler));
		if (n) {
			if (!handler->prefix ^ !*n) {
				if (*n)
					continue;
				return ERR_PTR(-EINVAL);
			}
			*name = n;
			return handler;
		}
	}
	return ERR_PTR(-EOPNOTSUPP);
}

80 81 82 83 84 85 86 87 88 89 90 91 92 93
/*
 * Check permissions for extended attribute access.  This is a bit complicated
 * because different namespaces have very different rules.
 */
static int
xattr_permission(struct inode *inode, const char *name, int mask)
{
	/*
	 * We can never set or remove an extended attribute on a read-only
	 * filesystem  or on an immutable / append-only inode.
	 */
	if (mask & MAY_WRITE) {
		if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
			return -EPERM;
94 95 96 97 98 99 100
		/*
		 * Updating an xattr will likely cause i_uid and i_gid
		 * to be writen back improperly if their true value is
		 * unknown to the vfs.
		 */
		if (HAS_UNMAPPED_ID(inode))
			return -EPERM;
101 102 103 104 105 106 107 108 109 110 111
	}

	/*
	 * No restriction for security.* and system.* from the VFS.  Decision
	 * on these is left to the underlying filesystem / security module.
	 */
	if (!strncmp(name, XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN) ||
	    !strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN))
		return 0;

	/*
112
	 * The trusted.* namespace can only be accessed by privileged users.
113
	 */
114 115 116 117 118
	if (!strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN)) {
		if (!capable(CAP_SYS_ADMIN))
			return (mask & MAY_WRITE) ? -EPERM : -ENODATA;
		return 0;
	}
119

120 121
	/*
	 * In the user.* namespace, only regular files and directories can have
122
	 * extended attributes. For sticky directories, only the owner and
123
	 * privileged users can write attributes.
124
	 */
125
	if (!strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN)) {
126
		if (!S_ISREG(inode->i_mode) && !S_ISDIR(inode->i_mode))
127
			return (mask & MAY_WRITE) ? -EPERM : -ENODATA;
128
		if (S_ISDIR(inode->i_mode) && (inode->i_mode & S_ISVTX) &&
129
		    (mask & MAY_WRITE) && !inode_owner_or_capable(inode))
130 131 132
			return -EPERM;
	}

133
	return inode_permission(inode, mask);
134 135
}

136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
/**
 *  __vfs_setxattr_noperm - perform setxattr operation without performing
 *  permission checks.
 *
 *  @dentry - object to perform setxattr on
 *  @name - xattr name to set
 *  @value - value to set @name to
 *  @size - size of @value
 *  @flags - flags to pass into filesystem operations
 *
 *  returns the result of the internal setxattr or setsecurity operations.
 *
 *  This function requires the caller to lock the inode's i_mutex before it
 *  is executed. It also assumes that the caller will make the appropriate
 *  permission checks.
 */
int __vfs_setxattr_noperm(struct dentry *dentry, const char *name,
		const void *value, size_t size, int flags)
154 155
{
	struct inode *inode = dentry->d_inode;
156
	int error = -EOPNOTSUPP;
157 158
	int issec = !strncmp(name, XATTR_SECURITY_PREFIX,
				   XATTR_SECURITY_PREFIX_LEN);
159

160 161
	if (issec)
		inode->i_flags &= ~S_NOSEC;
162
	if (inode->i_op->setxattr) {
163
		error = inode->i_op->setxattr(dentry, inode, name, value, size, flags);
164 165 166 167 168
		if (!error) {
			fsnotify_xattr(dentry);
			security_inode_post_setxattr(dentry, name, value,
						     size, flags);
		}
169
	} else if (issec) {
170
		const char *suffix = name + XATTR_SECURITY_PREFIX_LEN;
171 172 173 174 175
		error = security_inode_setsecurity(inode, suffix, value,
						   size, flags);
		if (!error)
			fsnotify_xattr(dentry);
	}
176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191

	return error;
}


int
vfs_setxattr(struct dentry *dentry, const char *name, const void *value,
		size_t size, int flags)
{
	struct inode *inode = dentry->d_inode;
	int error;

	error = xattr_permission(inode, name, MAY_WRITE);
	if (error)
		return error;

A
Al Viro 已提交
192
	inode_lock(inode);
193 194 195 196 197 198
	error = security_inode_setxattr(dentry, name, value, size, flags);
	if (error)
		goto out;

	error = __vfs_setxattr_noperm(dentry, name, value, size, flags);

199
out:
A
Al Viro 已提交
200
	inode_unlock(inode);
201 202 203 204
	return error;
}
EXPORT_SYMBOL_GPL(vfs_setxattr);

205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231
ssize_t
xattr_getsecurity(struct inode *inode, const char *name, void *value,
			size_t size)
{
	void *buffer = NULL;
	ssize_t len;

	if (!value || !size) {
		len = security_inode_getsecurity(inode, name, &buffer, false);
		goto out_noalloc;
	}

	len = security_inode_getsecurity(inode, name, &buffer, true);
	if (len < 0)
		return len;
	if (size < len) {
		len = -ERANGE;
		goto out;
	}
	memcpy(value, buffer, len);
out:
	security_release_secctx(buffer, len);
out_noalloc:
	return len;
}
EXPORT_SYMBOL_GPL(xattr_getsecurity);

232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
/*
 * vfs_getxattr_alloc - allocate memory, if necessary, before calling getxattr
 *
 * Allocate memory, if not already allocated, or re-allocate correct size,
 * before retrieving the extended attribute.
 *
 * Returns the result of alloc, if failed, or the getxattr operation.
 */
ssize_t
vfs_getxattr_alloc(struct dentry *dentry, const char *name, char **xattr_value,
		   size_t xattr_size, gfp_t flags)
{
	struct inode *inode = dentry->d_inode;
	char *value = *xattr_value;
	int error;

	error = xattr_permission(inode, name, MAY_READ);
	if (error)
		return error;

	if (!inode->i_op->getxattr)
		return -EOPNOTSUPP;

255
	error = inode->i_op->getxattr(dentry, inode, name, NULL, 0);
256 257 258 259 260 261 262 263 264 265
	if (error < 0)
		return error;

	if (!value || (error > xattr_size)) {
		value = krealloc(*xattr_value, error + 1, flags);
		if (!value)
			return -ENOMEM;
		memset(value, 0, error + 1);
	}

266
	error = inode->i_op->getxattr(dentry, inode, name, value, error);
267 268 269 270
	*xattr_value = value;
	return error;
}

271
ssize_t
272
vfs_getxattr(struct dentry *dentry, const char *name, void *value, size_t size)
273 274 275 276
{
	struct inode *inode = dentry->d_inode;
	int error;

277 278 279 280
	error = xattr_permission(inode, name, MAY_READ);
	if (error)
		return error;

281 282 283 284 285
	error = security_inode_getxattr(dentry, name);
	if (error)
		return error;

	if (!strncmp(name, XATTR_SECURITY_PREFIX,
286 287
				XATTR_SECURITY_PREFIX_LEN)) {
		const char *suffix = name + XATTR_SECURITY_PREFIX_LEN;
288
		int ret = xattr_getsecurity(inode, suffix, value, size);
289 290 291 292
		/*
		 * Only overwrite the return value if a security module
		 * is actually active.
		 */
293 294 295
		if (ret == -EOPNOTSUPP)
			goto nolsm;
		return ret;
296
	}
297 298
nolsm:
	if (inode->i_op->getxattr)
299
		error = inode->i_op->getxattr(dentry, inode, name, value, size);
300 301
	else
		error = -EOPNOTSUPP;
302 303

	return error;
304

305 306 307
}
EXPORT_SYMBOL_GPL(vfs_getxattr);

B
Bill Nottingham 已提交
308 309 310 311 312 313 314 315 316
ssize_t
vfs_listxattr(struct dentry *d, char *list, size_t size)
{
	ssize_t error;

	error = security_inode_listxattr(d);
	if (error)
		return error;
	error = -EOPNOTSUPP;
A
Al Viro 已提交
317
	if (d->d_inode->i_op->listxattr) {
B
Bill Nottingham 已提交
318 319 320 321 322 323 324 325 326 327
		error = d->d_inode->i_op->listxattr(d, list, size);
	} else {
		error = security_inode_listsecurity(d->d_inode, list, size);
		if (size && error > size)
			error = -ERANGE;
	}
	return error;
}
EXPORT_SYMBOL_GPL(vfs_listxattr);

328
int
329
vfs_removexattr(struct dentry *dentry, const char *name)
330 331 332 333 334 335 336
{
	struct inode *inode = dentry->d_inode;
	int error;

	if (!inode->i_op->removexattr)
		return -EOPNOTSUPP;

337 338 339 340
	error = xattr_permission(inode, name, MAY_WRITE);
	if (error)
		return error;

A
Al Viro 已提交
341
	inode_lock(inode);
342
	error = security_inode_removexattr(dentry, name);
343 344
	if (error)
		goto out;
345 346 347

	error = inode->i_op->removexattr(dentry, name);

M
Mimi Zohar 已提交
348
	if (!error) {
349
		fsnotify_xattr(dentry);
M
Mimi Zohar 已提交
350 351
		evm_inode_post_removexattr(dentry, name);
	}
352 353

out:
A
Al Viro 已提交
354
	inode_unlock(inode);
355 356 357 358 359
	return error;
}
EXPORT_SYMBOL_GPL(vfs_removexattr);


L
Linus Torvalds 已提交
360 361 362 363
/*
 * Extended attribute SET operations
 */
static long
364
setxattr(struct dentry *d, const char __user *name, const void __user *value,
L
Linus Torvalds 已提交
365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382
	 size_t size, int flags)
{
	int error;
	void *kvalue = NULL;
	char kname[XATTR_NAME_MAX + 1];

	if (flags & ~(XATTR_CREATE|XATTR_REPLACE))
		return -EINVAL;

	error = strncpy_from_user(kname, name, sizeof(kname));
	if (error == 0 || error == sizeof(kname))
		error = -ERANGE;
	if (error < 0)
		return error;

	if (size) {
		if (size > XATTR_SIZE_MAX)
			return -E2BIG;
383 384
		kvalue = kmalloc(size, GFP_KERNEL | __GFP_NOWARN);
		if (!kvalue) {
R
Richard Weinberger 已提交
385 386
			kvalue = vmalloc(size);
			if (!kvalue)
387 388 389 390 391 392
				return -ENOMEM;
		}
		if (copy_from_user(kvalue, value, size)) {
			error = -EFAULT;
			goto out;
		}
393 394 395
		if ((strcmp(kname, XATTR_NAME_POSIX_ACL_ACCESS) == 0) ||
		    (strcmp(kname, XATTR_NAME_POSIX_ACL_DEFAULT) == 0))
			posix_acl_fix_xattr_from_user(kvalue, size);
L
Linus Torvalds 已提交
396 397
	}

398
	error = vfs_setxattr(d, kname, kvalue, size, flags);
399
out:
R
Richard Weinberger 已提交
400 401
	kvfree(kvalue);

L
Linus Torvalds 已提交
402 403 404
	return error;
}

405 406 407
static int path_setxattr(const char __user *pathname,
			 const char __user *name, const void __user *value,
			 size_t size, int flags, unsigned int lookup_flags)
L
Linus Torvalds 已提交
408
{
409
	struct path path;
L
Linus Torvalds 已提交
410
	int error;
411 412
retry:
	error = user_path_at(AT_FDCWD, pathname, lookup_flags, &path);
L
Linus Torvalds 已提交
413 414
	if (error)
		return error;
415
	error = mnt_want_write(path.mnt);
416
	if (!error) {
417 418
		error = setxattr(path.dentry, name, value, size, flags);
		mnt_drop_write(path.mnt);
419
	}
420
	path_put(&path);
421 422 423 424
	if (retry_estale(error, lookup_flags)) {
		lookup_flags |= LOOKUP_REVAL;
		goto retry;
	}
L
Linus Torvalds 已提交
425 426 427
	return error;
}

428 429 430 431 432 433 434
SYSCALL_DEFINE5(setxattr, const char __user *, pathname,
		const char __user *, name, const void __user *, value,
		size_t, size, int, flags)
{
	return path_setxattr(pathname, name, value, size, flags, LOOKUP_FOLLOW);
}

435 436 437
SYSCALL_DEFINE5(lsetxattr, const char __user *, pathname,
		const char __user *, name, const void __user *, value,
		size_t, size, int, flags)
L
Linus Torvalds 已提交
438
{
439
	return path_setxattr(pathname, name, value, size, flags, 0);
L
Linus Torvalds 已提交
440 441
}

442 443
SYSCALL_DEFINE5(fsetxattr, int, fd, const char __user *, name,
		const void __user *,value, size_t, size, int, flags)
L
Linus Torvalds 已提交
444
{
445
	struct fd f = fdget(fd);
L
Linus Torvalds 已提交
446 447
	int error = -EBADF;

448
	if (!f.file)
L
Linus Torvalds 已提交
449
		return error;
A
Al Viro 已提交
450
	audit_file(f.file);
451
	error = mnt_want_write_file(f.file);
452
	if (!error) {
A
Al Viro 已提交
453
		error = setxattr(f.file->f_path.dentry, name, value, size, flags);
454
		mnt_drop_write_file(f.file);
455
	}
456
	fdput(f);
L
Linus Torvalds 已提交
457 458 459 460 461 462 463
	return error;
}

/*
 * Extended attribute GET operations
 */
static ssize_t
464 465
getxattr(struct dentry *d, const char __user *name, void __user *value,
	 size_t size)
L
Linus Torvalds 已提交
466 467 468 469 470 471 472 473 474 475 476 477 478 479
{
	ssize_t error;
	void *kvalue = NULL;
	char kname[XATTR_NAME_MAX + 1];

	error = strncpy_from_user(kname, name, sizeof(kname));
	if (error == 0 || error == sizeof(kname))
		error = -ERANGE;
	if (error < 0)
		return error;

	if (size) {
		if (size > XATTR_SIZE_MAX)
			size = XATTR_SIZE_MAX;
480 481
		kvalue = kzalloc(size, GFP_KERNEL | __GFP_NOWARN);
		if (!kvalue) {
R
Richard Weinberger 已提交
482 483
			kvalue = vmalloc(size);
			if (!kvalue)
484 485
				return -ENOMEM;
		}
L
Linus Torvalds 已提交
486 487
	}

488
	error = vfs_getxattr(d, kname, kvalue, size);
489
	if (error > 0) {
490 491 492
		if ((strcmp(kname, XATTR_NAME_POSIX_ACL_ACCESS) == 0) ||
		    (strcmp(kname, XATTR_NAME_POSIX_ACL_DEFAULT) == 0))
			posix_acl_fix_xattr_to_user(kvalue, size);
493 494 495 496 497 498
		if (size && copy_to_user(value, kvalue, error))
			error = -EFAULT;
	} else if (error == -ERANGE && size >= XATTR_SIZE_MAX) {
		/* The file system tried to returned a value bigger
		   than XATTR_SIZE_MAX bytes. Not possible. */
		error = -E2BIG;
L
Linus Torvalds 已提交
499
	}
R
Richard Weinberger 已提交
500 501 502

	kvfree(kvalue);

L
Linus Torvalds 已提交
503 504 505
	return error;
}

506 507 508
static ssize_t path_getxattr(const char __user *pathname,
			     const char __user *name, void __user *value,
			     size_t size, unsigned int lookup_flags)
L
Linus Torvalds 已提交
509
{
510
	struct path path;
L
Linus Torvalds 已提交
511
	ssize_t error;
512 513
retry:
	error = user_path_at(AT_FDCWD, pathname, lookup_flags, &path);
L
Linus Torvalds 已提交
514 515
	if (error)
		return error;
516 517
	error = getxattr(path.dentry, name, value, size);
	path_put(&path);
518 519 520 521
	if (retry_estale(error, lookup_flags)) {
		lookup_flags |= LOOKUP_REVAL;
		goto retry;
	}
L
Linus Torvalds 已提交
522 523 524
	return error;
}

525 526 527 528 529 530
SYSCALL_DEFINE4(getxattr, const char __user *, pathname,
		const char __user *, name, void __user *, value, size_t, size)
{
	return path_getxattr(pathname, name, value, size, LOOKUP_FOLLOW);
}

531 532
SYSCALL_DEFINE4(lgetxattr, const char __user *, pathname,
		const char __user *, name, void __user *, value, size_t, size)
L
Linus Torvalds 已提交
533
{
534
	return path_getxattr(pathname, name, value, size, 0);
L
Linus Torvalds 已提交
535 536
}

537 538
SYSCALL_DEFINE4(fgetxattr, int, fd, const char __user *, name,
		void __user *, value, size_t, size)
L
Linus Torvalds 已提交
539
{
540
	struct fd f = fdget(fd);
L
Linus Torvalds 已提交
541 542
	ssize_t error = -EBADF;

543
	if (!f.file)
L
Linus Torvalds 已提交
544
		return error;
A
Al Viro 已提交
545
	audit_file(f.file);
546 547
	error = getxattr(f.file->f_path.dentry, name, value, size);
	fdput(f);
L
Linus Torvalds 已提交
548 549 550 551 552 553 554 555 556 557 558 559 560 561 562
	return error;
}

/*
 * Extended attribute LIST operations
 */
static ssize_t
listxattr(struct dentry *d, char __user *list, size_t size)
{
	ssize_t error;
	char *klist = NULL;

	if (size) {
		if (size > XATTR_LIST_MAX)
			size = XATTR_LIST_MAX;
563
		klist = kmalloc(size, __GFP_NOWARN | GFP_KERNEL);
564
		if (!klist) {
R
Richard Weinberger 已提交
565 566
			klist = vmalloc(size);
			if (!klist)
567 568
				return -ENOMEM;
		}
L
Linus Torvalds 已提交
569 570
	}

B
Bill Nottingham 已提交
571
	error = vfs_listxattr(d, klist, size);
572 573 574 575 576 577 578
	if (error > 0) {
		if (size && copy_to_user(list, klist, error))
			error = -EFAULT;
	} else if (error == -ERANGE && size >= XATTR_LIST_MAX) {
		/* The file system tried to returned a list bigger
		   than XATTR_LIST_MAX bytes. Not possible. */
		error = -E2BIG;
L
Linus Torvalds 已提交
579
	}
R
Richard Weinberger 已提交
580 581 582

	kvfree(klist);

L
Linus Torvalds 已提交
583 584 585
	return error;
}

586 587
static ssize_t path_listxattr(const char __user *pathname, char __user *list,
			      size_t size, unsigned int lookup_flags)
L
Linus Torvalds 已提交
588
{
589
	struct path path;
L
Linus Torvalds 已提交
590
	ssize_t error;
591 592
retry:
	error = user_path_at(AT_FDCWD, pathname, lookup_flags, &path);
L
Linus Torvalds 已提交
593 594
	if (error)
		return error;
595 596
	error = listxattr(path.dentry, list, size);
	path_put(&path);
597 598 599 600
	if (retry_estale(error, lookup_flags)) {
		lookup_flags |= LOOKUP_REVAL;
		goto retry;
	}
L
Linus Torvalds 已提交
601 602 603
	return error;
}

604 605 606 607 608 609
SYSCALL_DEFINE3(listxattr, const char __user *, pathname, char __user *, list,
		size_t, size)
{
	return path_listxattr(pathname, list, size, LOOKUP_FOLLOW);
}

610 611
SYSCALL_DEFINE3(llistxattr, const char __user *, pathname, char __user *, list,
		size_t, size)
L
Linus Torvalds 已提交
612
{
613
	return path_listxattr(pathname, list, size, 0);
L
Linus Torvalds 已提交
614 615
}

616
SYSCALL_DEFINE3(flistxattr, int, fd, char __user *, list, size_t, size)
L
Linus Torvalds 已提交
617
{
618
	struct fd f = fdget(fd);
L
Linus Torvalds 已提交
619 620
	ssize_t error = -EBADF;

621
	if (!f.file)
L
Linus Torvalds 已提交
622
		return error;
A
Al Viro 已提交
623
	audit_file(f.file);
624 625
	error = listxattr(f.file->f_path.dentry, list, size);
	fdput(f);
L
Linus Torvalds 已提交
626 627 628 629 630 631 632
	return error;
}

/*
 * Extended attribute REMOVE operations
 */
static long
633
removexattr(struct dentry *d, const char __user *name)
L
Linus Torvalds 已提交
634 635 636 637 638 639 640 641 642 643
{
	int error;
	char kname[XATTR_NAME_MAX + 1];

	error = strncpy_from_user(kname, name, sizeof(kname));
	if (error == 0 || error == sizeof(kname))
		error = -ERANGE;
	if (error < 0)
		return error;

644
	return vfs_removexattr(d, kname);
L
Linus Torvalds 已提交
645 646
}

647 648
static int path_removexattr(const char __user *pathname,
			    const char __user *name, unsigned int lookup_flags)
L
Linus Torvalds 已提交
649
{
650
	struct path path;
L
Linus Torvalds 已提交
651
	int error;
652 653
retry:
	error = user_path_at(AT_FDCWD, pathname, lookup_flags, &path);
L
Linus Torvalds 已提交
654 655
	if (error)
		return error;
656
	error = mnt_want_write(path.mnt);
657
	if (!error) {
658 659
		error = removexattr(path.dentry, name);
		mnt_drop_write(path.mnt);
660
	}
661
	path_put(&path);
662 663 664 665
	if (retry_estale(error, lookup_flags)) {
		lookup_flags |= LOOKUP_REVAL;
		goto retry;
	}
L
Linus Torvalds 已提交
666 667 668
	return error;
}

669 670 671 672 673 674
SYSCALL_DEFINE2(removexattr, const char __user *, pathname,
		const char __user *, name)
{
	return path_removexattr(pathname, name, LOOKUP_FOLLOW);
}

675 676
SYSCALL_DEFINE2(lremovexattr, const char __user *, pathname,
		const char __user *, name)
L
Linus Torvalds 已提交
677
{
678
	return path_removexattr(pathname, name, 0);
L
Linus Torvalds 已提交
679 680
}

681
SYSCALL_DEFINE2(fremovexattr, int, fd, const char __user *, name)
L
Linus Torvalds 已提交
682
{
683
	struct fd f = fdget(fd);
L
Linus Torvalds 已提交
684 685
	int error = -EBADF;

686
	if (!f.file)
L
Linus Torvalds 已提交
687
		return error;
A
Al Viro 已提交
688
	audit_file(f.file);
689
	error = mnt_want_write_file(f.file);
690
	if (!error) {
A
Al Viro 已提交
691
		error = removexattr(f.file->f_path.dentry, name);
692
		mnt_drop_write_file(f.file);
693
	}
694
	fdput(f);
L
Linus Torvalds 已提交
695 696 697 698 699 700 701
	return error;
}

/*
 * Find the handler for the prefix and dispatch its get() operation.
 */
ssize_t
702 703
generic_getxattr(struct dentry *dentry, struct inode *inode,
		 const char *name, void *buffer, size_t size)
L
Linus Torvalds 已提交
704
{
705
	const struct xattr_handler *handler;
L
Linus Torvalds 已提交
706

707
	handler = xattr_resolve_name(inode, &name);
708 709
	if (IS_ERR(handler))
		return PTR_ERR(handler);
710
	return handler->get(handler, dentry, inode,
711
			    name, buffer, size);
L
Linus Torvalds 已提交
712 713 714 715 716 717 718 719 720
}

/*
 * Combine the results of the list() operation from every xattr_handler in the
 * list.
 */
ssize_t
generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size)
{
721
	const struct xattr_handler *handler, **handlers = dentry->d_sb->s_xattr;
L
Linus Torvalds 已提交
722 723 724
	unsigned int size = 0;

	if (!buffer) {
725
		for_each_xattr_handler(handlers, handler) {
726 727
			if (!handler->name ||
			    (handler->list && !handler->list(dentry)))
728
				continue;
729
			size += strlen(handler->name) + 1;
730
		}
L
Linus Torvalds 已提交
731 732
	} else {
		char *buf = buffer;
733
		size_t len;
L
Linus Torvalds 已提交
734 735

		for_each_xattr_handler(handlers, handler) {
736 737
			if (!handler->name ||
			    (handler->list && !handler->list(dentry)))
738
				continue;
739 740
			len = strlen(handler->name);
			if (len + 1 > buffer_size)
L
Linus Torvalds 已提交
741
				return -ERANGE;
742 743 744
			memcpy(buf, handler->name, len + 1);
			buf += len + 1;
			buffer_size -= len + 1;
L
Linus Torvalds 已提交
745 746 747 748 749 750 751 752 753 754
		}
		size = buf - buffer;
	}
	return size;
}

/*
 * Find the handler for the prefix and dispatch its set() operation.
 */
int
755 756
generic_setxattr(struct dentry *dentry, struct inode *inode, const char *name,
		 const void *value, size_t size, int flags)
L
Linus Torvalds 已提交
757
{
758
	const struct xattr_handler *handler;
L
Linus Torvalds 已提交
759 760 761

	if (size == 0)
		value = "";  /* empty EA, do not remove */
762
	handler = xattr_resolve_name(inode, &name);
763 764
	if (IS_ERR(handler))
		return PTR_ERR(handler);
765
	return handler->set(handler, dentry, inode, name, value, size, flags);
L
Linus Torvalds 已提交
766 767 768 769 770 771 772 773 774
}

/*
 * Find the handler for the prefix and dispatch its set() operation to remove
 * any associated extended attribute.
 */
int
generic_removexattr(struct dentry *dentry, const char *name)
{
775
	const struct xattr_handler *handler;
L
Linus Torvalds 已提交
776

777
	handler = xattr_resolve_name(d_inode(dentry), &name);
778 779
	if (IS_ERR(handler))
		return PTR_ERR(handler);
780 781
	return handler->set(handler, dentry, d_inode(dentry), name, NULL,
			    0, XATTR_REPLACE);
L
Linus Torvalds 已提交
782 783 784 785 786 787
}

EXPORT_SYMBOL(generic_getxattr);
EXPORT_SYMBOL(generic_listxattr);
EXPORT_SYMBOL(generic_setxattr);
EXPORT_SYMBOL(generic_removexattr);
788

A
Andreas Gruenbacher 已提交
789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806
/**
 * xattr_full_name  -  Compute full attribute name from suffix
 *
 * @handler:	handler of the xattr_handler operation
 * @name:	name passed to the xattr_handler operation
 *
 * The get and set xattr handler operations are called with the remainder of
 * the attribute name after skipping the handler's prefix: for example, "foo"
 * is passed to the get operation of a handler with prefix "user." to get
 * attribute "user.foo".  The full name is still "there" in the name though.
 *
 * Note: the list xattr handler operation when called from the vfs is passed a
 * NULL name; some file systems use this operation internally, with varying
 * semantics.
 */
const char *xattr_full_name(const struct xattr_handler *handler,
			    const char *name)
{
807
	size_t prefix_len = strlen(xattr_prefix(handler));
A
Andreas Gruenbacher 已提交
808 809 810 811 812

	return name - prefix_len;
}
EXPORT_SYMBOL(xattr_full_name);

813 814 815 816 817 818 819 820 821 822
/*
 * Allocate new xattr and copy in the value; but leave the name to callers.
 */
struct simple_xattr *simple_xattr_alloc(const void *value, size_t size)
{
	struct simple_xattr *new_xattr;
	size_t len;

	/* wrap around? */
	len = sizeof(*new_xattr) + size;
823
	if (len < sizeof(*new_xattr))
824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861
		return NULL;

	new_xattr = kmalloc(len, GFP_KERNEL);
	if (!new_xattr)
		return NULL;

	new_xattr->size = size;
	memcpy(new_xattr->value, value, size);
	return new_xattr;
}

/*
 * xattr GET operation for in-memory/pseudo filesystems
 */
int simple_xattr_get(struct simple_xattrs *xattrs, const char *name,
		     void *buffer, size_t size)
{
	struct simple_xattr *xattr;
	int ret = -ENODATA;

	spin_lock(&xattrs->lock);
	list_for_each_entry(xattr, &xattrs->head, list) {
		if (strcmp(name, xattr->name))
			continue;

		ret = xattr->size;
		if (buffer) {
			if (size < xattr->size)
				ret = -ERANGE;
			else
				memcpy(buffer, xattr->value, xattr->size);
		}
		break;
	}
	spin_unlock(&xattrs->lock);
	return ret;
}

862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877
/**
 * simple_xattr_set - xattr SET operation for in-memory/pseudo filesystems
 * @xattrs: target simple_xattr list
 * @name: name of the extended attribute
 * @value: value of the xattr. If %NULL, will remove the attribute.
 * @size: size of the new xattr
 * @flags: %XATTR_{CREATE|REPLACE}
 *
 * %XATTR_CREATE is set, the xattr shouldn't exist already; otherwise fails
 * with -EEXIST.  If %XATTR_REPLACE is set, the xattr should exist;
 * otherwise, fails with -ENODATA.
 *
 * Returns 0 on success, -errno on failure.
 */
int simple_xattr_set(struct simple_xattrs *xattrs, const char *name,
		     const void *value, size_t size, int flags)
878 879
{
	struct simple_xattr *xattr;
880
	struct simple_xattr *new_xattr = NULL;
881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931
	int err = 0;

	/* value == NULL means remove */
	if (value) {
		new_xattr = simple_xattr_alloc(value, size);
		if (!new_xattr)
			return -ENOMEM;

		new_xattr->name = kstrdup(name, GFP_KERNEL);
		if (!new_xattr->name) {
			kfree(new_xattr);
			return -ENOMEM;
		}
	}

	spin_lock(&xattrs->lock);
	list_for_each_entry(xattr, &xattrs->head, list) {
		if (!strcmp(name, xattr->name)) {
			if (flags & XATTR_CREATE) {
				xattr = new_xattr;
				err = -EEXIST;
			} else if (new_xattr) {
				list_replace(&xattr->list, &new_xattr->list);
			} else {
				list_del(&xattr->list);
			}
			goto out;
		}
	}
	if (flags & XATTR_REPLACE) {
		xattr = new_xattr;
		err = -ENODATA;
	} else {
		list_add(&new_xattr->list, &xattrs->head);
		xattr = NULL;
	}
out:
	spin_unlock(&xattrs->lock);
	if (xattr) {
		kfree(xattr->name);
		kfree(xattr);
	}
	return err;

}

static bool xattr_is_trusted(const char *name)
{
	return !strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN);
}

932 933 934 935 936 937 938 939 940 941 942 943 944 945
static int xattr_list_one(char **buffer, ssize_t *remaining_size,
			  const char *name)
{
	size_t len = strlen(name) + 1;
	if (*buffer) {
		if (*remaining_size < len)
			return -ERANGE;
		memcpy(*buffer, name, len);
		*buffer += len;
	}
	*remaining_size -= len;
	return 0;
}

946 947 948
/*
 * xattr LIST operation for in-memory/pseudo filesystems
 */
949 950
ssize_t simple_xattr_list(struct inode *inode, struct simple_xattrs *xattrs,
			  char *buffer, size_t size)
951 952 953
{
	bool trusted = capable(CAP_SYS_ADMIN);
	struct simple_xattr *xattr;
954
	ssize_t remaining_size = size;
955
	int err = 0;
956 957 958 959 960 961 962 963 964 965 966 967 968 969 970

#ifdef CONFIG_FS_POSIX_ACL
	if (inode->i_acl) {
		err = xattr_list_one(&buffer, &remaining_size,
				     XATTR_NAME_POSIX_ACL_ACCESS);
		if (err)
			return err;
	}
	if (inode->i_default_acl) {
		err = xattr_list_one(&buffer, &remaining_size,
				     XATTR_NAME_POSIX_ACL_DEFAULT);
		if (err)
			return err;
	}
#endif
971 972 973 974 975 976 977

	spin_lock(&xattrs->lock);
	list_for_each_entry(xattr, &xattrs->head, list) {
		/* skip "trusted." attributes for unprivileged callers */
		if (!trusted && xattr_is_trusted(xattr->name))
			continue;

978 979
		err = xattr_list_one(&buffer, &remaining_size, xattr->name);
		if (err)
980
			break;
981 982 983
	}
	spin_unlock(&xattrs->lock);

984
	return err ? err : size - remaining_size;
985 986
}

987 988 989
/*
 * Adds an extended attribute to the list
 */
990 991 992 993 994 995 996
void simple_xattr_list_add(struct simple_xattrs *xattrs,
			   struct simple_xattr *new_xattr)
{
	spin_lock(&xattrs->lock);
	list_add(&new_xattr->list, &xattrs->head);
	spin_unlock(&xattrs->lock);
}