linux-user/syscall.c: Implement f and l versions of set/get/removexattr
Implement the f and l versions (operate on fd, don't follow links) of the setxattr, getxattr and removexattr syscalls. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
This commit is contained in:
parent
e3c33ec6b0
commit
30297b55f7
@ -7796,18 +7796,13 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
|
||||
#endif
|
||||
#ifdef CONFIG_ATTR
|
||||
#ifdef TARGET_NR_setxattr
|
||||
case TARGET_NR_lsetxattr:
|
||||
case TARGET_NR_fsetxattr:
|
||||
case TARGET_NR_lgetxattr:
|
||||
case TARGET_NR_fgetxattr:
|
||||
case TARGET_NR_listxattr:
|
||||
case TARGET_NR_llistxattr:
|
||||
case TARGET_NR_flistxattr:
|
||||
case TARGET_NR_lremovexattr:
|
||||
case TARGET_NR_fremovexattr:
|
||||
ret = -TARGET_EOPNOTSUPP;
|
||||
break;
|
||||
case TARGET_NR_setxattr:
|
||||
case TARGET_NR_lsetxattr:
|
||||
{
|
||||
void *p, *n, *v = 0;
|
||||
if (arg3) {
|
||||
@ -7820,7 +7815,11 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
|
||||
p = lock_user_string(arg1);
|
||||
n = lock_user_string(arg2);
|
||||
if (p && n) {
|
||||
ret = get_errno(setxattr(p, n, v, arg4, arg5));
|
||||
if (num == TARGET_NR_setxattr) {
|
||||
ret = get_errno(setxattr(p, n, v, arg4, arg5));
|
||||
} else {
|
||||
ret = get_errno(lsetxattr(p, n, v, arg4, arg5));
|
||||
}
|
||||
} else {
|
||||
ret = -TARGET_EFAULT;
|
||||
}
|
||||
@ -7829,7 +7828,28 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
|
||||
unlock_user(v, arg3, 0);
|
||||
}
|
||||
break;
|
||||
case TARGET_NR_fsetxattr:
|
||||
{
|
||||
void *n, *v = 0;
|
||||
if (arg3) {
|
||||
v = lock_user(VERIFY_READ, arg3, arg4, 1);
|
||||
if (!v) {
|
||||
ret = -TARGET_EFAULT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
n = lock_user_string(arg2);
|
||||
if (n) {
|
||||
ret = get_errno(fsetxattr(arg1, n, v, arg4, arg5));
|
||||
} else {
|
||||
ret = -TARGET_EFAULT;
|
||||
}
|
||||
unlock_user(n, arg2, 0);
|
||||
unlock_user(v, arg3, 0);
|
||||
}
|
||||
break;
|
||||
case TARGET_NR_getxattr:
|
||||
case TARGET_NR_lgetxattr:
|
||||
{
|
||||
void *p, *n, *v = 0;
|
||||
if (arg3) {
|
||||
@ -7842,7 +7862,11 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
|
||||
p = lock_user_string(arg1);
|
||||
n = lock_user_string(arg2);
|
||||
if (p && n) {
|
||||
ret = get_errno(getxattr(p, n, v, arg4));
|
||||
if (num == TARGET_NR_getxattr) {
|
||||
ret = get_errno(getxattr(p, n, v, arg4));
|
||||
} else {
|
||||
ret = get_errno(lgetxattr(p, n, v, arg4));
|
||||
}
|
||||
} else {
|
||||
ret = -TARGET_EFAULT;
|
||||
}
|
||||
@ -7851,13 +7875,38 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
|
||||
unlock_user(v, arg3, arg4);
|
||||
}
|
||||
break;
|
||||
case TARGET_NR_fgetxattr:
|
||||
{
|
||||
void *n, *v = 0;
|
||||
if (arg3) {
|
||||
v = lock_user(VERIFY_WRITE, arg3, arg4, 0);
|
||||
if (!v) {
|
||||
ret = -TARGET_EFAULT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
n = lock_user_string(arg2);
|
||||
if (n) {
|
||||
ret = get_errno(fgetxattr(arg1, n, v, arg4));
|
||||
} else {
|
||||
ret = -TARGET_EFAULT;
|
||||
}
|
||||
unlock_user(n, arg2, 0);
|
||||
unlock_user(v, arg3, arg4);
|
||||
}
|
||||
break;
|
||||
case TARGET_NR_removexattr:
|
||||
case TARGET_NR_lremovexattr:
|
||||
{
|
||||
void *p, *n;
|
||||
p = lock_user_string(arg1);
|
||||
n = lock_user_string(arg2);
|
||||
if (p && n) {
|
||||
ret = get_errno(removexattr(p, n));
|
||||
if (num == TARGET_NR_removexattr) {
|
||||
ret = get_errno(removexattr(p, n));
|
||||
} else {
|
||||
ret = get_errno(lremovexattr(p, n));
|
||||
}
|
||||
} else {
|
||||
ret = -TARGET_EFAULT;
|
||||
}
|
||||
@ -7865,6 +7914,18 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
|
||||
unlock_user(n, arg2, 0);
|
||||
}
|
||||
break;
|
||||
case TARGET_NR_fremovexattr:
|
||||
{
|
||||
void *n;
|
||||
n = lock_user_string(arg2);
|
||||
if (n) {
|
||||
ret = get_errno(fremovexattr(arg1, n));
|
||||
} else {
|
||||
ret = -TARGET_EFAULT;
|
||||
}
|
||||
unlock_user(n, arg2, 0);
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
#endif /* CONFIG_ATTR */
|
||||
#ifdef TARGET_NR_set_thread_area
|
||||
|
Loading…
Reference in New Issue
Block a user