mirror of https://github.com/xqemu/xqemu.git
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
|
#endif
|
||||||
#ifdef CONFIG_ATTR
|
#ifdef CONFIG_ATTR
|
||||||
#ifdef TARGET_NR_setxattr
|
#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_listxattr:
|
||||||
case TARGET_NR_llistxattr:
|
case TARGET_NR_llistxattr:
|
||||||
case TARGET_NR_flistxattr:
|
case TARGET_NR_flistxattr:
|
||||||
case TARGET_NR_lremovexattr:
|
|
||||||
case TARGET_NR_fremovexattr:
|
|
||||||
ret = -TARGET_EOPNOTSUPP;
|
ret = -TARGET_EOPNOTSUPP;
|
||||||
break;
|
break;
|
||||||
case TARGET_NR_setxattr:
|
case TARGET_NR_setxattr:
|
||||||
|
case TARGET_NR_lsetxattr:
|
||||||
{
|
{
|
||||||
void *p, *n, *v = 0;
|
void *p, *n, *v = 0;
|
||||||
if (arg3) {
|
if (arg3) {
|
||||||
|
@ -7820,7 +7815,11 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
|
||||||
p = lock_user_string(arg1);
|
p = lock_user_string(arg1);
|
||||||
n = lock_user_string(arg2);
|
n = lock_user_string(arg2);
|
||||||
if (p && n) {
|
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 {
|
} else {
|
||||||
ret = -TARGET_EFAULT;
|
ret = -TARGET_EFAULT;
|
||||||
}
|
}
|
||||||
|
@ -7829,7 +7828,28 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
|
||||||
unlock_user(v, arg3, 0);
|
unlock_user(v, arg3, 0);
|
||||||
}
|
}
|
||||||
break;
|
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_getxattr:
|
||||||
|
case TARGET_NR_lgetxattr:
|
||||||
{
|
{
|
||||||
void *p, *n, *v = 0;
|
void *p, *n, *v = 0;
|
||||||
if (arg3) {
|
if (arg3) {
|
||||||
|
@ -7842,7 +7862,11 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
|
||||||
p = lock_user_string(arg1);
|
p = lock_user_string(arg1);
|
||||||
n = lock_user_string(arg2);
|
n = lock_user_string(arg2);
|
||||||
if (p && n) {
|
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 {
|
} else {
|
||||||
ret = -TARGET_EFAULT;
|
ret = -TARGET_EFAULT;
|
||||||
}
|
}
|
||||||
|
@ -7851,13 +7875,38 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
|
||||||
unlock_user(v, arg3, arg4);
|
unlock_user(v, arg3, arg4);
|
||||||
}
|
}
|
||||||
break;
|
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_removexattr:
|
||||||
|
case TARGET_NR_lremovexattr:
|
||||||
{
|
{
|
||||||
void *p, *n;
|
void *p, *n;
|
||||||
p = lock_user_string(arg1);
|
p = lock_user_string(arg1);
|
||||||
n = lock_user_string(arg2);
|
n = lock_user_string(arg2);
|
||||||
if (p && n) {
|
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 {
|
} else {
|
||||||
ret = -TARGET_EFAULT;
|
ret = -TARGET_EFAULT;
|
||||||
}
|
}
|
||||||
|
@ -7865,6 +7914,18 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
|
||||||
unlock_user(n, arg2, 0);
|
unlock_user(n, arg2, 0);
|
||||||
}
|
}
|
||||||
break;
|
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
|
||||||
#endif /* CONFIG_ATTR */
|
#endif /* CONFIG_ATTR */
|
||||||
#ifdef TARGET_NR_set_thread_area
|
#ifdef TARGET_NR_set_thread_area
|
||||||
|
|
Loading…
Reference in New Issue