Revision 0da46a6e linux-user/syscall.c
b/linux-user/syscall.c | ||
---|---|---|
167 | 167 |
#ifdef __NR_gettid |
168 | 168 |
_syscall0(int, gettid) |
169 | 169 |
#else |
170 |
/* This is a replacement for the host gettid() and must return a host |
|
171 |
errno. */ |
|
170 | 172 |
static int gettid(void) { |
171 | 173 |
return -ENOSYS; |
172 | 174 |
} |
... | ... | |
389 | 391 |
target_original_brk = target_brk = HOST_PAGE_ALIGN(new_brk); |
390 | 392 |
} |
391 | 393 |
|
394 |
/* do_brk() must return target values and target errnos. */ |
|
392 | 395 |
abi_long do_brk(abi_ulong new_brk) |
393 | 396 |
{ |
394 | 397 |
abi_ulong brk_page; |
... | ... | |
398 | 401 |
if (!new_brk) |
399 | 402 |
return target_brk; |
400 | 403 |
if (new_brk < target_original_brk) |
401 |
return -ENOMEM; |
|
404 |
return -TARGET_ENOMEM;
|
|
402 | 405 |
|
403 | 406 |
brk_page = HOST_PAGE_ALIGN(target_brk); |
404 | 407 |
|
... | ... | |
532 | 535 |
} |
533 | 536 |
|
534 | 537 |
|
538 |
/* do_select() must return target values and target errnos. */ |
|
535 | 539 |
static abi_long do_select(int n, |
536 | 540 |
abi_ulong rfd_p, abi_ulong wfd_p, |
537 | 541 |
abi_ulong efd_p, abi_ulong target_tv) |
... | ... | |
706 | 710 |
msgh->msg_controllen = tswapl(space); |
707 | 711 |
} |
708 | 712 |
|
713 |
/* do_setsockopt() Must return target values and target errnos. */ |
|
709 | 714 |
static abi_long do_setsockopt(int sockfd, int level, int optname, |
710 | 715 |
abi_ulong optval, socklen_t optlen) |
711 | 716 |
{ |
... | ... | |
716 | 721 |
case SOL_TCP: |
717 | 722 |
/* TCP options all take an 'int' value. */ |
718 | 723 |
if (optlen < sizeof(uint32_t)) |
719 |
return -EINVAL; |
|
724 |
return -TARGET_EINVAL;
|
|
720 | 725 |
|
721 | 726 |
val = tget32(optval); |
722 | 727 |
ret = get_errno(setsockopt(sockfd, level, optname, &val, sizeof(val))); |
... | ... | |
814 | 819 |
goto unimplemented; |
815 | 820 |
} |
816 | 821 |
if (optlen < sizeof(uint32_t)) |
817 |
return -EINVAL; |
|
822 |
return -TARGET_EINVAL;
|
|
818 | 823 |
|
819 | 824 |
val = tget32(optval); |
820 | 825 |
ret = get_errno(setsockopt(sockfd, SOL_SOCKET, optname, &val, sizeof(val))); |
... | ... | |
822 | 827 |
default: |
823 | 828 |
unimplemented: |
824 | 829 |
gemu_log("Unsupported setsockopt level=%d optname=%d \n", level, optname); |
825 |
ret = -ENOSYS; |
|
830 |
ret = -TARGET_ENOSYS;
|
|
826 | 831 |
} |
827 | 832 |
return ret; |
828 | 833 |
} |
829 | 834 |
|
835 |
/* do_getsockopt() Must return target values and target errnos. */ |
|
830 | 836 |
static abi_long do_getsockopt(int sockfd, int level, int optname, |
831 | 837 |
abi_ulong optval, abi_ulong optlen) |
832 | 838 |
{ |
... | ... | |
853 | 859 |
int_case: |
854 | 860 |
len = tget32(optlen); |
855 | 861 |
if (len < 0) |
856 |
return -EINVAL; |
|
862 |
return -TARGET_EINVAL;
|
|
857 | 863 |
lv = sizeof(int); |
858 | 864 |
ret = get_errno(getsockopt(sockfd, level, optname, &val, &lv)); |
859 | 865 |
if (ret < 0) |
... | ... | |
886 | 892 |
case IP_MULTICAST_LOOP: |
887 | 893 |
len = tget32(optlen); |
888 | 894 |
if (len < 0) |
889 |
return -EINVAL; |
|
895 |
return -TARGET_EINVAL;
|
|
890 | 896 |
lv = sizeof(int); |
891 | 897 |
ret = get_errno(getsockopt(sockfd, level, optname, &val, &lv)); |
892 | 898 |
if (ret < 0) |
... | ... | |
910 | 916 |
unimplemented: |
911 | 917 |
gemu_log("getsockopt level=%d optname=%d not yet supported\n", |
912 | 918 |
level, optname); |
913 |
ret = -ENOSYS; |
|
919 |
ret = -TARGET_ENOSYS;
|
|
914 | 920 |
break; |
915 | 921 |
} |
916 | 922 |
return ret; |
... | ... | |
947 | 953 |
unlock_user (target_vec, target_addr, 0); |
948 | 954 |
} |
949 | 955 |
|
956 |
/* do_socket() Must return target values and target errnos. */ |
|
950 | 957 |
static abi_long do_socket(int domain, int type, int protocol) |
951 | 958 |
{ |
952 | 959 |
#if defined(TARGET_MIPS) |
... | ... | |
974 | 981 |
return get_errno(socket(domain, type, protocol)); |
975 | 982 |
} |
976 | 983 |
|
984 |
/* do_bind() Must return target values and target errnos. */ |
|
977 | 985 |
static abi_long do_bind(int sockfd, abi_ulong target_addr, |
978 | 986 |
socklen_t addrlen) |
979 | 987 |
{ |
... | ... | |
983 | 991 |
return get_errno(bind(sockfd, addr, addrlen)); |
984 | 992 |
} |
985 | 993 |
|
994 |
/* do_connect() Must return target values and target errnos. */ |
|
986 | 995 |
static abi_long do_connect(int sockfd, abi_ulong target_addr, |
987 | 996 |
socklen_t addrlen) |
988 | 997 |
{ |
... | ... | |
992 | 1001 |
return get_errno(connect(sockfd, addr, addrlen)); |
993 | 1002 |
} |
994 | 1003 |
|
1004 |
/* do_sendrecvmsg() Must return target values and target errnos. */ |
|
995 | 1005 |
static abi_long do_sendrecvmsg(int fd, abi_ulong target_msg, |
996 | 1006 |
int flags, int send) |
997 | 1007 |
{ |
... | ... | |
1035 | 1045 |
return ret; |
1036 | 1046 |
} |
1037 | 1047 |
|
1048 |
/* do_accept() Must return target values and target errnos. */ |
|
1038 | 1049 |
static abi_long do_accept(int fd, abi_ulong target_addr, |
1039 | 1050 |
abi_ulong target_addrlen) |
1040 | 1051 |
{ |
... | ... | |
1050 | 1061 |
return ret; |
1051 | 1062 |
} |
1052 | 1063 |
|
1064 |
/* do_getpeername() Must return target values and target errnos. */ |
|
1053 | 1065 |
static abi_long do_getpeername(int fd, abi_ulong target_addr, |
1054 | 1066 |
abi_ulong target_addrlen) |
1055 | 1067 |
{ |
... | ... | |
1065 | 1077 |
return ret; |
1066 | 1078 |
} |
1067 | 1079 |
|
1080 |
/* do_getsockname() Must return target values and target errnos. */ |
|
1068 | 1081 |
static abi_long do_getsockname(int fd, abi_ulong target_addr, |
1069 | 1082 |
abi_ulong target_addrlen) |
1070 | 1083 |
{ |
... | ... | |
1080 | 1093 |
return ret; |
1081 | 1094 |
} |
1082 | 1095 |
|
1096 |
/* do_socketpair() Must return target values and target errnos. */ |
|
1083 | 1097 |
static abi_long do_socketpair(int domain, int type, int protocol, |
1084 | 1098 |
abi_ulong target_tab) |
1085 | 1099 |
{ |
... | ... | |
1094 | 1108 |
return ret; |
1095 | 1109 |
} |
1096 | 1110 |
|
1111 |
/* do_sendto() Must return target values and target errnos. */ |
|
1097 | 1112 |
static abi_long do_sendto(int fd, abi_ulong msg, size_t len, int flags, |
1098 | 1113 |
abi_ulong target_addr, socklen_t addrlen) |
1099 | 1114 |
{ |
... | ... | |
1113 | 1128 |
return ret; |
1114 | 1129 |
} |
1115 | 1130 |
|
1131 |
/* do_recvfrom() Must return target values and target errnos. */ |
|
1116 | 1132 |
static abi_long do_recvfrom(int fd, abi_ulong msg, size_t len, int flags, |
1117 | 1133 |
abi_ulong target_addr, |
1118 | 1134 |
abi_ulong target_addrlen) |
... | ... | |
1144 | 1160 |
} |
1145 | 1161 |
|
1146 | 1162 |
#ifdef TARGET_NR_socketcall |
1163 |
/* do_socketcall() Must return target values and target errnos. */ |
|
1147 | 1164 |
static abi_long do_socketcall(int num, abi_ulong vptr) |
1148 | 1165 |
{ |
1149 | 1166 |
abi_long ret; |
... | ... | |
1301 | 1318 |
break; |
1302 | 1319 |
default: |
1303 | 1320 |
gemu_log("Unsupported socketcall: %d\n", num); |
1304 |
ret = -ENOSYS; |
|
1321 |
ret = -TARGET_ENOSYS;
|
|
1305 | 1322 |
break; |
1306 | 1323 |
} |
1307 | 1324 |
return ret; |
... | ... | |
1639 | 1656 |
} |
1640 | 1657 |
|
1641 | 1658 |
/* ??? This only works with linear mappings. */ |
1659 |
/* do_ipc() must return target values and target errnos. */ |
|
1642 | 1660 |
static abi_long do_ipc(unsigned int call, int first, |
1643 | 1661 |
int second, int third, |
1644 | 1662 |
abi_long ptr, abi_long fifth) |
... | ... | |
1667 | 1685 |
|
1668 | 1686 |
case IPCOP_semtimedop: |
1669 | 1687 |
gemu_log("Unsupported ipc call: %d (version %d)\n", call, version); |
1670 |
ret = -ENOSYS; |
|
1688 |
ret = -TARGET_ENOSYS;
|
|
1671 | 1689 |
break; |
1672 | 1690 |
|
1673 | 1691 |
case IPCOP_msgget: |
... | ... | |
1723 | 1741 |
} |
1724 | 1742 |
} |
1725 | 1743 |
if (put_user(raddr, (abi_ulong *)third)) |
1726 |
return -EFAULT; |
|
1744 |
return -TARGET_EFAULT;
|
|
1727 | 1745 |
ret = 0; |
1728 | 1746 |
break; |
1729 | 1747 |
case IPCOP_shmdt: |
... | ... | |
1757 | 1775 |
default: |
1758 | 1776 |
unimplemented: |
1759 | 1777 |
gemu_log("Unsupported ipc call: %d (version %d)\n", call, version); |
1760 |
ret = -ENOSYS; |
|
1778 |
ret = -TARGET_ENOSYS;
|
|
1761 | 1779 |
break; |
1762 | 1780 |
} |
1763 | 1781 |
return ret; |
... | ... | |
1803 | 1821 |
}; |
1804 | 1822 |
|
1805 | 1823 |
/* ??? Implement proper locking for ioctls. */ |
1824 |
/* do_ioctl() Must return target values and target errnos. */ |
|
1806 | 1825 |
static abi_long do_ioctl(int fd, abi_long cmd, abi_long arg) |
1807 | 1826 |
{ |
1808 | 1827 |
const IOCTLEntry *ie; |
... | ... | |
1816 | 1835 |
for(;;) { |
1817 | 1836 |
if (ie->target_cmd == 0) { |
1818 | 1837 |
gemu_log("Unsupported ioctl: cmd=0x%04lx\n", (long)cmd); |
1819 |
return -ENOSYS; |
|
1838 |
return -TARGET_ENOSYS;
|
|
1820 | 1839 |
} |
1821 | 1840 |
if (ie->target_cmd == cmd) |
1822 | 1841 |
break; |
... | ... | |
1871 | 1890 |
default: |
1872 | 1891 |
gemu_log("Unsupported ioctl type: cmd=0x%04lx type=%d\n", |
1873 | 1892 |
(long)cmd, arg_type[0]); |
1874 |
ret = -ENOSYS; |
|
1893 |
ret = -TARGET_ENOSYS;
|
|
1875 | 1894 |
break; |
1876 | 1895 |
} |
1877 | 1896 |
return ret; |
... | ... | |
2106 | 2125 |
} |
2107 | 2126 |
|
2108 | 2127 |
/* XXX: add locking support */ |
2128 |
/* write_ldt() returns host errnos */ |
|
2109 | 2129 |
static int write_ldt(CPUX86State *env, |
2110 | 2130 |
abi_ulong ptr, unsigned long bytecount, int oldmode) |
2111 | 2131 |
{ |
... | ... | |
2188 | 2208 |
} |
2189 | 2209 |
|
2190 | 2210 |
/* specific and weird i386 syscalls */ |
2211 |
/* do_modify_ldt() returns host errnos (it is inconsistent with the |
|
2212 |
other do_*() functions which return target errnos). */ |
|
2191 | 2213 |
int do_modify_ldt(CPUX86State *env, int func, abi_ulong ptr, unsigned long bytecount) |
2192 | 2214 |
{ |
2193 | 2215 |
int ret = -ENOSYS; |
... | ... | |
2220 | 2242 |
return 0; |
2221 | 2243 |
} |
2222 | 2244 |
|
2245 |
/* do_fork() Must return host values and target errnos (unlike most |
|
2246 |
do_*() functions). */ |
|
2223 | 2247 |
int do_fork(CPUState *env, unsigned int flags, abi_ulong newsp) |
2224 | 2248 |
{ |
2225 | 2249 |
int ret; |
... | ... | |
2547 | 2571 |
unlock_user_struct(target_ts, target_addr, 1); |
2548 | 2572 |
} |
2549 | 2573 |
|
2574 |
/* do_syscall() should always have a single exit point at the end so |
|
2575 |
that actions, such as logging of syscall results, can be performed. |
|
2576 |
All errnos that do_syscall() returns must be -TARGET_<errcode>. */ |
|
2550 | 2577 |
abi_long do_syscall(void *cpu_env, int num, abi_long arg1, |
2551 | 2578 |
abi_long arg2, abi_long arg3, abi_long arg4, |
2552 | 2579 |
abi_long arg5, abi_long arg6) |
... | ... | |
2590 | 2617 |
#if defined(TARGET_NR_openat) && defined(__NR_openat) |
2591 | 2618 |
case TARGET_NR_openat: |
2592 | 2619 |
if (!arg2) { |
2593 |
ret = -EFAULT; |
|
2620 |
ret = -TARGET_EFAULT;
|
|
2594 | 2621 |
goto fail; |
2595 | 2622 |
} |
2596 | 2623 |
p = lock_user_string(arg2); |
2597 | 2624 |
if (!access_ok(VERIFY_READ, p, 1)) |
2598 |
ret = -EFAULT; |
|
2625 |
/* Don't "goto fail" so that cleanup can happen. */ |
|
2626 |
ret = -TARGET_EFAULT; |
|
2599 | 2627 |
else |
2600 | 2628 |
ret = get_errno(sys_openat(arg1, |
2601 | 2629 |
path(p), |
... | ... | |
2644 | 2672 |
#if defined(TARGET_NR_linkat) && defined(__NR_linkat) |
2645 | 2673 |
case TARGET_NR_linkat: |
2646 | 2674 |
if (!arg2 || !arg4) { |
2647 |
ret = -EFAULT; |
|
2675 |
ret = -TARGET_EFAULT;
|
|
2648 | 2676 |
goto fail; |
2649 |
}
|
|
2677 |
}
|
|
2650 | 2678 |
{ |
2651 | 2679 |
void * p2 = NULL; |
2652 | 2680 |
p = lock_user_string(arg2); |
2653 | 2681 |
p2 = lock_user_string(arg4); |
2654 | 2682 |
if (!access_ok(VERIFY_READ, p, 1) |
2655 | 2683 |
|| !access_ok(VERIFY_READ, p2, 1)) |
2656 |
ret = -EFAULT; |
|
2684 |
/* Don't "goto fail" so that cleanup can happen. */ |
|
2685 |
ret = -TARGET_EFAULT; |
|
2657 | 2686 |
else |
2658 | 2687 |
ret = get_errno(sys_linkat(arg1, p, arg3, p2, arg5)); |
2659 | 2688 |
if (p2) |
... | ... | |
2671 | 2700 |
#if defined(TARGET_NR_unlinkat) && defined(__NR_unlinkat) |
2672 | 2701 |
case TARGET_NR_unlinkat: |
2673 | 2702 |
if (!arg2) { |
2674 |
ret = -EFAULT; |
|
2703 |
ret = -TARGET_EFAULT;
|
|
2675 | 2704 |
goto fail; |
2676 | 2705 |
} |
2677 | 2706 |
p = lock_user_string(arg2); |
2678 | 2707 |
if (!access_ok(VERIFY_READ, p, 1)) |
2679 |
ret = -EFAULT; |
|
2708 |
/* Don't "goto fail" so that cleanup can happen. */ |
|
2709 |
ret = -TARGET_EFAULT; |
|
2680 | 2710 |
else |
2681 | 2711 |
ret = get_errno(sys_unlinkat(arg1, p, arg3)); |
2682 | 2712 |
if (p) |
... | ... | |
2762 | 2792 |
#if defined(TARGET_NR_mknodat) && defined(__NR_mknodat) |
2763 | 2793 |
case TARGET_NR_mknodat: |
2764 | 2794 |
if (!arg2) { |
2765 |
ret = -EFAULT; |
|
2795 |
ret = -TARGET_EFAULT;
|
|
2766 | 2796 |
goto fail; |
2767 | 2797 |
} |
2768 | 2798 |
p = lock_user_string(arg2); |
2769 | 2799 |
if (!access_ok(VERIFY_READ, p, 1)) |
2770 |
ret = -EFAULT; |
|
2800 |
/* Don't "goto fail" so that cleanup can happen. */ |
|
2801 |
ret = -TARGET_EFAULT; |
|
2771 | 2802 |
else |
2772 | 2803 |
ret = get_errno(sys_mknodat(arg1, p, arg3, arg4)); |
2773 | 2804 |
if (p) |
... | ... | |
2894 | 2925 |
#if defined(TARGET_NR_faccessat) && defined(__NR_faccessat) |
2895 | 2926 |
case TARGET_NR_faccessat: |
2896 | 2927 |
if (!arg2) { |
2897 |
ret = -EFAULT; |
|
2928 |
ret = -TARGET_EFAULT;
|
|
2898 | 2929 |
goto fail; |
2899 | 2930 |
} |
2900 | 2931 |
p = lock_user_string(arg2); |
2901 | 2932 |
if (!access_ok(VERIFY_READ, p, 1)) |
2902 |
ret = -EFAULT; |
|
2933 |
/* Don't "goto fail" so that cleanup can happen. */ |
|
2934 |
ret = -TARGET_EFAULT; |
|
2903 | 2935 |
else |
2904 | 2936 |
ret = get_errno(sys_faccessat(arg1, p, arg3, arg4)); |
2905 | 2937 |
if (p) |
... | ... | |
2935 | 2967 |
#if defined(TARGET_NR_renameat) && defined(__NR_renameat) |
2936 | 2968 |
case TARGET_NR_renameat: |
2937 | 2969 |
if (!arg2 || !arg4) { |
2938 |
ret = -EFAULT; |
|
2939 |
goto fail;
|
|
2970 |
ret = -TARGET_EFAULT;
|
|
2971 |
goto fail;
|
|
2940 | 2972 |
} |
2941 | 2973 |
{ |
2942 | 2974 |
void *p2 = NULL; |
... | ... | |
2944 | 2976 |
p2 = lock_user_string(arg4); |
2945 | 2977 |
if (!access_ok(VERIFY_READ, p, 1) |
2946 | 2978 |
|| !access_ok(VERIFY_READ, p2, 1)) |
2947 |
ret = -EFAULT; |
|
2979 |
/* Don't "goto fail" so that cleanup can happen. */ |
|
2980 |
ret = -TARGET_EFAULT; |
|
2948 | 2981 |
else |
2949 | 2982 |
ret = get_errno(sys_renameat(arg1, p, arg3, p2)); |
2950 | 2983 |
if (p2) |
... | ... | |
2962 | 2995 |
#if defined(TARGET_NR_mkdirat) && defined(__NR_mkdirat) |
2963 | 2996 |
case TARGET_NR_mkdirat: |
2964 | 2997 |
if (!arg2) { |
2965 |
ret = -EFAULT; |
|
2998 |
ret = -TARGET_EFAULT;
|
|
2966 | 2999 |
goto fail; |
2967 | 3000 |
} |
2968 | 3001 |
p = lock_user_string(arg2); |
2969 | 3002 |
if (!access_ok(VERIFY_READ, p, 1)) |
2970 |
ret = -EFAULT; |
|
3003 |
/* Don't "goto fail" so that cleanup can happen. */ |
|
3004 |
ret = -TARGET_EFAULT; |
|
2971 | 3005 |
else |
2972 | 3006 |
ret = get_errno(sys_mkdirat(arg1, p, arg3)); |
2973 | 3007 |
if (p) |
... | ... | |
3202 | 3236 |
how = SIG_SETMASK; |
3203 | 3237 |
break; |
3204 | 3238 |
default: |
3205 |
ret = -EINVAL; |
|
3239 |
ret = -TARGET_EINVAL;
|
|
3206 | 3240 |
goto fail; |
3207 | 3241 |
} |
3208 | 3242 |
p = lock_user(arg2, sizeof(target_sigset_t), 1); |
... | ... | |
3239 | 3273 |
how = SIG_SETMASK; |
3240 | 3274 |
break; |
3241 | 3275 |
default: |
3242 |
ret = -EINVAL; |
|
3276 |
ret = -TARGET_EINVAL;
|
|
3243 | 3277 |
goto fail; |
3244 | 3278 |
} |
3245 | 3279 |
p = lock_user(arg2, sizeof(target_sigset_t), 1); |
... | ... | |
3434 | 3468 |
#if defined(TARGET_NR_symlinkat) && defined(__NR_symlinkat) |
3435 | 3469 |
case TARGET_NR_symlinkat: |
3436 | 3470 |
if (!arg1 || !arg3) { |
3437 |
ret = -EFAULT; |
|
3438 |
goto fail;
|
|
3439 |
}
|
|
3471 |
ret = -TARGET_EFAULT;
|
|
3472 |
goto fail;
|
|
3473 |
}
|
|
3440 | 3474 |
{ |
3441 | 3475 |
void *p2 = NULL; |
3442 | 3476 |
p = lock_user_string(arg1); |
3443 | 3477 |
p2 = lock_user_string(arg3); |
3444 | 3478 |
if (!access_ok(VERIFY_READ, p, 1) |
3445 | 3479 |
|| !access_ok(VERIFY_READ, p2, 1)) |
3446 |
ret = -EFAULT; |
|
3480 |
/* Don't "goto fail" so that cleanup can happen. */ |
|
3481 |
ret = -TARGET_EFAULT; |
|
3447 | 3482 |
else |
3448 | 3483 |
ret = get_errno(sys_symlinkat(p, arg2, p2)); |
3449 | 3484 |
if (p2) |
... | ... | |
3470 | 3505 |
#if defined(TARGET_NR_readlinkat) && defined(__NR_readlinkat) |
3471 | 3506 |
case TARGET_NR_readlinkat: |
3472 | 3507 |
if (!arg2 || !arg3) { |
3473 |
ret = -EFAULT; |
|
3508 |
ret = -TARGET_EFAULT;
|
|
3474 | 3509 |
goto fail; |
3475 |
}
|
|
3510 |
}
|
|
3476 | 3511 |
{ |
3477 | 3512 |
void *p2 = NULL; |
3478 | 3513 |
p = lock_user_string(arg2); |
3479 | 3514 |
p2 = lock_user(arg3, arg4, 0); |
3480 | 3515 |
if (!access_ok(VERIFY_READ, p, 1) |
3481 | 3516 |
|| !access_ok(VERIFY_READ, p2, 1)) |
3482 |
ret = -EFAULT; |
|
3517 |
/* Don't "goto fail" so that cleanup can happen. */ |
|
3518 |
ret = -TARGET_EFAULT; |
|
3483 | 3519 |
else |
3484 | 3520 |
ret = get_errno(sys_readlinkat(arg1, path(p), p2, arg4)); |
3485 | 3521 |
if (p2) |
... | ... | |
3596 | 3632 |
#if defined(TARGET_NR_fchmodat) && defined(__NR_fchmodat) |
3597 | 3633 |
case TARGET_NR_fchmodat: |
3598 | 3634 |
if (!arg2) { |
3599 |
ret = -EFAULT; |
|
3635 |
ret = -TARGET_EFAULT;
|
|
3600 | 3636 |
goto fail; |
3601 | 3637 |
} |
3602 | 3638 |
p = lock_user_string(arg2); |
3603 | 3639 |
if (!access_ok(VERIFY_READ, p, 1)) |
3604 |
ret = -EFAULT; |
|
3640 |
/* Don't "goto fail" so that cleanup can happen. */ |
|
3641 |
ret = -TARGET_EFAULT; |
|
3605 | 3642 |
else |
3606 | 3643 |
ret = get_errno(sys_fchmodat(arg1, p, arg3, arg4)); |
3607 | 3644 |
if (p) |
... | ... | |
4055 | 4092 |
abi_long count = arg3; |
4056 | 4093 |
|
4057 | 4094 |
dirp = malloc(count); |
4058 |
if (!dirp) |
|
4059 |
return -ENOMEM; |
|
4095 |
if (!dirp) { |
|
4096 |
ret = -TARGET_EFAULT; |
|
4097 |
goto fail; |
|
4098 |
} |
|
4060 | 4099 |
|
4061 | 4100 |
ret = get_errno(sys_getdents(arg1, dirp, count)); |
4062 | 4101 |
if (!is_error(ret)) { |
... | ... | |
4213 | 4252 |
break; |
4214 | 4253 |
#endif |
4215 | 4254 |
case TARGET_NR__sysctl: |
4216 |
/* We don't implement this, but ENODIR is always a safe |
|
4255 |
/* We don't implement this, but ENOTDIR is always a safe
|
|
4217 | 4256 |
return value. */ |
4218 |
return -ENOTDIR; |
|
4257 |
ret = -TARGET_ENOTDIR; |
|
4258 |
break; |
|
4219 | 4259 |
case TARGET_NR_sched_setparam: |
4220 | 4260 |
{ |
4221 | 4261 |
struct sched_param *target_schp; |
... | ... | |
4514 | 4554 |
#if defined(TARGET_NR_fchownat) && defined(__NR_fchownat) |
4515 | 4555 |
case TARGET_NR_fchownat: |
4516 | 4556 |
if (!arg2) { |
4517 |
ret = -EFAULT; |
|
4557 |
ret = -TARGET_EFAULT;
|
|
4518 | 4558 |
goto fail; |
4519 | 4559 |
} |
4520 | 4560 |
p = lock_user_string(arg2); |
4521 | 4561 |
if (!access_ok(VERIFY_READ, p, 1)) |
4522 |
ret = -EFAULT; |
|
4562 |
/* Don't "goto fail" so that cleanup can happen. */ |
|
4563 |
ret = -TARGET_EFAULT; |
|
4523 | 4564 |
else |
4524 | 4565 |
ret = get_errno(sys_fchownat(arg1, p, low2highuid(arg3), low2highgid(arg4), arg5)); |
4525 | 4566 |
if (p) |
... | ... | |
4958 | 4999 |
else { |
4959 | 5000 |
p = lock_user_string(arg2); |
4960 | 5001 |
if (!access_ok(VERIFY_READ, p, 1)) |
4961 |
ret = -EFAULT; |
|
5002 |
/* Don't "goto fail" so that cleanup can happen. */ |
|
5003 |
ret = -TARGET_EFAULT; |
|
4962 | 5004 |
else |
4963 | 5005 |
ret = get_errno(sys_utimensat(arg1, path(p), ts, arg4)); |
4964 | 5006 |
if (p) |
... | ... | |
4974 | 5016 |
#if defined(TARGET_NR_setxattr) || defined(TARGET_NR_get_thread_area) || defined(TARGET_NR_getdomainname) || defined(TARGET_NR_set_robust_list) |
4975 | 5017 |
unimplemented_nowarn: |
4976 | 5018 |
#endif |
4977 |
ret = -ENOSYS; |
|
5019 |
ret = -TARGET_ENOSYS;
|
|
4978 | 5020 |
break; |
4979 | 5021 |
} |
4980 | 5022 |
fail: |
Also available in: Unified diff